_csv.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. inspired by https://www.npmjs.com/package/react-csv-downloader
  3. now removed from Github
  4. inspired by https://github.com/iview/iview
  5. */
  6. const newLine = '\r\n'
  7. const appendLine = (content, row, { separator, quoted }) => {
  8. const line = row.map(data => {
  9. if (!quoted) return data
  10. // quote data
  11. data = typeof data === 'string' ? data.replace(/"/g, '"') : data
  12. return `"${data}"`
  13. })
  14. content.push(line.join(separator))
  15. }
  16. const defaults = {
  17. separator: ',',
  18. quoted: false
  19. }
  20. export default function csv(columns, datas, options, noHeader = false) {
  21. options = Object.assign({}, defaults, options)
  22. let columnOrder
  23. const content = []
  24. const column = []
  25. if (columns) {
  26. columnOrder = columns.map(v => {
  27. if (typeof v === 'string') return v
  28. if (!noHeader) {
  29. column.push(typeof v.label !== 'undefined' ? v.label : v.prop)
  30. }
  31. return v.prop
  32. })
  33. if (column.length > 0) appendLine(content, column, options)
  34. } else {
  35. columnOrder = []
  36. datas.forEach(v => {
  37. if (!Array.isArray(v)) {
  38. columnOrder = columnOrder.concat(Object.keys(v))
  39. }
  40. })
  41. if (columnOrder.length > 0) {
  42. columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index)
  43. if (!noHeader) appendLine(content, columnOrder, options)
  44. }
  45. }
  46. if (Array.isArray(datas)) {
  47. datas.forEach(row => {
  48. if (!Array.isArray(row)) {
  49. row = columnOrder.map(k => (typeof row[k] !== 'undefined' ? row[k] : ''))
  50. }
  51. appendLine(content, row, options)
  52. })
  53. }
  54. return content.join(newLine)
  55. }