-
Notifications
You must be signed in to change notification settings - Fork 427
/
Copy pathexporter.js
104 lines (95 loc) · 2.86 KB
/
exporter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* eslint no-unneeded-ternary: 0 */
import FileSaver from "file-saver";
import XLSX from "xlsx";
export const getMetaInfo = (columns) =>
columns
.map((column) => ({
field: column.dataField,
type: column.csvType || String,
formatter: column.csvFormatter,
formatExtraData: column.formatExtraData,
header: column.csvText || column.text,
export: column.csvExport === false ? false : true,
row: Number(column.row) || 0,
rowSpan: Number(column.rowSpan) || 1,
colSpan: Number(column.colSpan) || 1,
footer: column.footer,
footerFormatter: column.footerFormatter,
}))
.filter((_) => _.export);
export const transform = (
data,
meta,
columns,
_,
{ separator, ignoreHeader, ignoreFooter }
) => {
const visibleColumns = meta.filter((m) => m.export);
let content = "";
// extract csv header
if (!ignoreHeader) {
content += visibleColumns.map((m) => `"${m.header}"`).join(separator);
content += "\n";
}
// extract csv body
if (data.length === 0) return content;
content += data
.map((row, rowIndex) =>
visibleColumns
.map((m) => {
let cellContent = _.get(row, m.field);
if (m.formatter) {
cellContent = m.formatter(
cellContent,
row,
rowIndex,
m.formatExtraData
);
}
if (m.type === String) {
return `"${`${cellContent}`.replace(/"/g, '""')}"`;
}
return cellContent;
})
.join(separator)
)
.join("\n");
if (!ignoreFooter) {
content += "\n";
content += visibleColumns
.map((m, i) => {
if (typeof m.footer === "function") {
const columnData = _.pluck(data, columns[i].dataField);
return `"${m.footer(columnData, columns[i], i)}"`;
} else if (m.footerFormatter) {
return `"${m.footerFormatter(columns[i], i)}"`;
}
return `"${m.footer}"`;
})
.join(separator);
}
return content;
};
export const save = (content, { noAutoBOM, fileName, blobType }) => {
function csvJSON(csv) {
const lines = csv.split("\n");
const result = [];
const headers = lines[0].split(",");
for (let i = 1; i < lines.length; i++) {
if (!lines[i]) continue;
const obj = {};
const currentline = lines[i].split(",");
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
return result;
}
const data1 = csvJSON(content);
const ws = XLSX.utils.json_to_sheet(data1);
const wb = { Sheets: { data: ws }, SheetNames: ["data"] };
const excelBuffer = XLSX.write(wb, { bookType: "xlsx", type: "array" });
const data2 = new Blob([excelBuffer], { type: blobType });
FileSaver.saveAs(new Blob([data2], { type: blobType }), fileName, noAutoBOM);
};