Skip to content

Commit 28397bc

Browse files
committed
fix: memo download
1 parent 971254f commit 28397bc

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,9 @@
2727
"typescript": "^4.9.3",
2828
"vite": "^4.2.0",
2929
"vite-plugin-dts": "^2.2.0"
30+
},
31+
"peerDependencies": {
32+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
33+
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
3034
}
3135
}

src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const data = [
77

88
function App() {
99
const excel = useExcelJS({
10-
filename: ".xlsx",
10+
filename: "report.xlsx",
1111
intercept: (workbook) => {
1212
workbook.getWorksheet("Sheet 1").getColumn("id").fill = {
1313
type: "pattern",

src/react-use-exceljs.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { type Workbook, type Worksheet } from "exceljs"
22
import { saveAs } from "file-saver"
3+
import React from "react"
34

45
type Sheet = { name: string; columns: Worksheet["columns"] }
56
type InterceptFn = (workbook: Workbook) => Workbook | void
@@ -18,20 +19,23 @@ export default function useExcelJS<T extends Array<Sheet>>({
1819
type Data = Array<any> | Record<WorksheetName, Array<any>>
1920

2021
return {
21-
download: async (data: Data) => {
22-
const ExcelJS = await import("exceljs")
23-
let workbook = new ExcelJS.Workbook()
24-
for (const worksheet of worksheets) {
25-
const sheet = workbook.addWorksheet(worksheet.name)
26-
sheet.columns = worksheet.columns
27-
const rows = (Array.isArray(data) ? data : data[worksheet.name as WorksheetName]) ?? []
28-
sheet.addRows(rows)
29-
}
30-
workbook = intercept ? intercept(workbook) ?? workbook : workbook
31-
const buffer = await workbook.xlsx.writeBuffer()
32-
const fileType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
33-
const blob = new Blob([buffer], { type: fileType })
34-
saveAs(blob, filename ?? "workbook.xlsx")
35-
},
22+
download: React.useCallback(
23+
async (data: Data) => {
24+
const ExcelJS = await import("exceljs")
25+
let workbook = new ExcelJS.Workbook()
26+
for (const worksheet of worksheets) {
27+
const sheet = workbook.addWorksheet(worksheet.name)
28+
sheet.columns = worksheet.columns
29+
const rows = (Array.isArray(data) ? data : data[worksheet.name as WorksheetName]) ?? []
30+
sheet.addRows(rows)
31+
}
32+
workbook = intercept ? intercept(workbook) ?? workbook : workbook
33+
const buffer = await workbook.xlsx.writeBuffer()
34+
const fileType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
35+
const blob = new Blob([buffer], { type: fileType })
36+
saveAs(blob, filename ?? "workbook.xlsx")
37+
},
38+
[filename, worksheets, intercept]
39+
),
3640
}
3741
}

0 commit comments

Comments
 (0)