Skip to content

Commit 4f021b8

Browse files
refactor: date util file and new data types for ExcelColumn
1 parent 94530e3 commit 4f021b8

File tree

4 files changed

+130
-76
lines changed

4 files changed

+130
-76
lines changed

README.md

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,52 @@
33

44
A data export library built with and for [React](http://facebook.github.io/react/index.html).
55

6-
## New version 0.1.0-rc
6+
## Example
77

8-
I've just started implementing this library for data export in react.
8+
```javascript
9+
import React from "react"
10+
import * from "react-data-export"
11+
12+
class App extends React.Component {
13+
const dataSet1 = [
14+
{
15+
name: "Johson",
16+
amount: 30000,
17+
sex: 'M',
18+
is_married: true
19+
},
20+
{
21+
name: "Monika",
22+
amount: 355000,
23+
sex: 'F',
24+
is_married: false
25+
},
26+
{
27+
name: "John",
28+
amount: 250000,
29+
sex: 'M',
30+
is_married: false
31+
},
32+
{
33+
name: "Josef",
34+
amount: 450500,
35+
sex: 'M',
36+
is_married: true
37+
}
38+
];
39+
40+
render() {
41+
return (
42+
<ExcelFile>
43+
<ExcelSheet data={dataSet1} name="Employees">
44+
<ExcelColumn label="Name" value="name" />
45+
<ExcelColumn label="Wallet Money" value="amount" />
46+
<ExcelColumn label="Gender" value="sex" />
47+
<ExcelColumn label="Marital Status"
48+
value={(col) => col.is_married ? "Married" : "Single"} />
49+
</ExcelSheet>
50+
</ExcelFile>
51+
);
52+
}
53+
}
54+
```

lib/components/ExcelFile.js

Lines changed: 8 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,79 +3,8 @@ import PropTypes from "prop-types";
33
import { saveAs } from "file-saver";
44
import XLSX from "xlsx";
55

6-
import ExcelColumn from "../elements/ExcelColumn";
76
import ExcelSheet from "../elements/ExcelSheet";
8-
9-
/* tslint:disable */
10-
function s2ab(s) {
11-
var buf = new ArrayBuffer(s.length);
12-
var view = new Uint8Array(buf);
13-
14-
for (var i = 0; i != s.length; ++i) {
15-
view[i] = s.charCodeAt(i) & 0xFF;
16-
}
17-
18-
return buf;
19-
}
20-
21-
function datenum(v, date1904) {
22-
if (date1904) {
23-
v += 1462;
24-
}
25-
26-
var epoch = Date.parse(v);
27-
28-
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
29-
}
30-
31-
function sheetFromAOA(data) {
32-
var ws = {};
33-
var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
34-
35-
for (var R = 0; R != data.length; ++R) {
36-
for (var C = 0; C != data[R].length; ++C) {
37-
if (range.s.r > R) {
38-
range.s.r = R;
39-
}
40-
41-
if (range.s.c > C) {
42-
range.s.c = C;
43-
}
44-
45-
if (range.e.r < R) {
46-
range.e.r = R;
47-
}
48-
49-
if (range.e.c < C) {
50-
range.e.c = C;
51-
}
52-
53-
var cell = { v: data[R][C] };
54-
if (cell.v === null) { continue; }
55-
56-
var cellRef = XLSX.utils.encode_cell({ c: C, r: R });
57-
if (typeof cell.v === 'number') {
58-
cell.t = 'n';
59-
} else if (typeof cell.v === 'boolean') {
60-
cell.t = 'b';
61-
} else if (cell.v instanceof Date) {
62-
cell.t = 'n'; cell.z = XLSX.SSF._table[14];
63-
cell.v = datenum(cell.v);
64-
} else {
65-
cell.t = 's';
66-
}
67-
68-
ws[cellRef] = cell;
69-
}
70-
}
71-
72-
if (range.s.c < 10000000) {
73-
ws['!ref'] = XLSX.utils.encode_range(range);
74-
}
75-
76-
return ws;
77-
}
78-
/* tslint:enable */
7+
import { strToArrBuffer, excelSheetFromAoA } from "../utils/DataUtil";
798

809
class ExcelFile extends React.Component {
8110
static props = {
@@ -90,6 +19,11 @@ class ExcelFile extends React.Component {
9019
}
9120
};
9221

22+
static defaultProps = {
23+
filename: "Download.xlsx",
24+
element: <button>Download</button>
25+
}
26+
9327
constructor(props) {
9428
super(props);
9529

@@ -123,11 +57,11 @@ class ExcelFile extends React.Component {
12357
};
12458

12559
React.Children.forEach(this.props.children, sheet => {
126-
wb.Sheets[sheet.props.name] = sheetFromAOA(this.createSheetData(sheet));
60+
wb.Sheets[sheet.props.name] = excelSheetFromAoA(this.createSheetData(sheet));
12761
});
12862

12963
const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'binary' });
130-
saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), this.props.filename);
64+
saveAs(new Blob([strToArrBuffer(wbout)], { type: "application/octet-stream" }), this.props.filename);
13165
}
13266

13367
render() {

lib/elements/ExcelColumn.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export default class ExcelColumn extends React.Component {
66
static propsTypes = {
77
label: PropTypes.string.isRequired,
88
value: PropTypes.oneOfType([
9+
PropTypes.number,
10+
PropTypes.bool,
911
PropTypes.string,
1012
PropTypes.func
1113
]).isRequired

lib/utils/DataUtil.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import XLSX from "xlsx";
2+
3+
const strToArrBuffer = (s) => {
4+
var buf = new ArrayBuffer(s.length);
5+
var view = new Uint8Array(buf);
6+
7+
for (var i = 0; i != s.length; ++i) {
8+
view[i] = s.charCodeAt(i) & 0xFF;
9+
}
10+
11+
return buf;
12+
};
13+
14+
const dateToNumber = (v, date1904) => {
15+
if (date1904) {
16+
v += 1462;
17+
}
18+
19+
var epoch = Date.parse(v);
20+
21+
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
22+
};
23+
24+
const excelSheetFromAoA = (data) => {
25+
var ws = {};
26+
var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
27+
28+
for (var R = 0; R != data.length; ++R) {
29+
for (var C = 0; C != data[R].length; ++C) {
30+
if (range.s.r > R) {
31+
range.s.r = R;
32+
}
33+
34+
if (range.s.c > C) {
35+
range.s.c = C;
36+
}
37+
38+
if (range.e.r < R) {
39+
range.e.r = R;
40+
}
41+
42+
if (range.e.c < C) {
43+
range.e.c = C;
44+
}
45+
46+
var cell = { v: data[R][C] };
47+
if (cell.v === null) { continue; }
48+
49+
var cellRef = XLSX.utils.encode_cell({ c: C, r: R });
50+
if (typeof cell.v === 'number') {
51+
cell.t = 'n';
52+
} else if (typeof cell.v === 'boolean') {
53+
cell.t = 'b';
54+
} else if (cell.v instanceof Date) {
55+
cell.t = 'n'; cell.z = XLSX.SSF._table[14];
56+
cell.v = dateToNumber(cell.v);
57+
} else {
58+
cell.t = 's';
59+
}
60+
61+
ws[cellRef] = cell;
62+
}
63+
}
64+
65+
if (range.s.c < 10000000) {
66+
ws['!ref'] = XLSX.utils.encode_range(range);
67+
}
68+
69+
return ws;
70+
};
71+
72+
export { strToArrBuffer, dateToNumber, excelSheetFromAoA };

0 commit comments

Comments
 (0)