Commit 9579a45b3cd35f432f3b0f8dc2ec97b8d2201603
Committed by
GitHub
1 parent
302afe58
feat(excel导出): 增加批量导出功能, 增加demo示例 (#2657)
* feat(excel导出): 批量导出功能 * feat(excel导出): 批量导出功能, 增加参数类型定义;增加demo示例 --------- Co-authored-by: 苗大 <caoshengmiao@hypergryph.com>
Showing
4 changed files
with
135 additions
and
2 deletions
src/components/Excel/src/Export2Excel.ts
1 | import * as xlsx from 'xlsx'; | 1 | import * as xlsx from 'xlsx'; |
2 | import type { WorkBook } from 'xlsx'; | 2 | import type { WorkBook } from 'xlsx'; |
3 | import type { JsonToSheet, AoAToSheet } from './typing'; | 3 | import type { JsonToSheet, AoAToSheet } from './typing'; |
4 | +import { AoaToMultipleSheet, JsonToMultipleSheet } from './typing'; | ||
4 | 5 | ||
5 | const { utils, writeFile } = xlsx; | 6 | const { utils, writeFile } = xlsx; |
6 | 7 | ||
7 | const DEF_FILE_NAME = 'excel-list.xlsx'; | 8 | const DEF_FILE_NAME = 'excel-list.xlsx'; |
9 | +const DEF_SHEET_NAME = 'sheet'; | ||
8 | 10 | ||
9 | /** | 11 | /** |
10 | * @param data source data | 12 | * @param data source data |
@@ -32,6 +34,7 @@ export function jsonToSheetXlsx<T = any>({ | @@ -32,6 +34,7 @@ export function jsonToSheetXlsx<T = any>({ | ||
32 | data, | 34 | data, |
33 | header, | 35 | header, |
34 | filename = DEF_FILE_NAME, | 36 | filename = DEF_FILE_NAME, |
37 | + sheetName = DEF_SHEET_NAME, | ||
35 | json2sheetOpts = {}, | 38 | json2sheetOpts = {}, |
36 | write2excelOpts = { bookType: 'xlsx' }, | 39 | write2excelOpts = { bookType: 'xlsx' }, |
37 | }: JsonToSheet<T>) { | 40 | }: JsonToSheet<T>) { |
@@ -45,9 +48,9 @@ export function jsonToSheetXlsx<T = any>({ | @@ -45,9 +48,9 @@ export function jsonToSheetXlsx<T = any>({ | ||
45 | setColumnWidth(arrData, worksheet); | 48 | setColumnWidth(arrData, worksheet); |
46 | /* add worksheet to workbook */ | 49 | /* add worksheet to workbook */ |
47 | const workbook: WorkBook = { | 50 | const workbook: WorkBook = { |
48 | - SheetNames: [filename], | 51 | + SheetNames: [sheetName], |
49 | Sheets: { | 52 | Sheets: { |
50 | - [filename]: worksheet, | 53 | + [sheetName]: worksheet, |
51 | }, | 54 | }, |
52 | }; | 55 | }; |
53 | /* output format determined by filename */ | 56 | /* output format determined by filename */ |
@@ -79,3 +82,67 @@ export function aoaToSheetXlsx<T = any>({ | @@ -79,3 +82,67 @@ export function aoaToSheetXlsx<T = any>({ | ||
79 | writeFile(workbook, filename, write2excelOpts); | 82 | writeFile(workbook, filename, write2excelOpts); |
80 | /* at this point, out.xlsb will have been downloaded */ | 83 | /* at this point, out.xlsb will have been downloaded */ |
81 | } | 84 | } |
85 | + | ||
86 | +/** | ||
87 | + * json导出多Sheet的Xlsx | ||
88 | + * @param sheetList 多sheet配置 | ||
89 | + * @param filename 文件名(包含后缀) | ||
90 | + * @param write2excelOpts 文件配置 | ||
91 | + */ | ||
92 | +export function jsonToMultipleSheetXlsx<T = any>({ | ||
93 | + sheetList, | ||
94 | + filename = DEF_FILE_NAME, | ||
95 | + write2excelOpts = { bookType: 'xlsx' }, | ||
96 | +}: JsonToMultipleSheet<T>) { | ||
97 | + const workbook: WorkBook = { | ||
98 | + SheetNames: [], | ||
99 | + Sheets: {}, | ||
100 | + }; | ||
101 | + sheetList.forEach((p, index) => { | ||
102 | + const arrData = [...p.data]; | ||
103 | + if (p.header) { | ||
104 | + arrData.unshift(p.header); | ||
105 | + p.json2sheetOpts = p.json2sheetOpts || {}; | ||
106 | + p.json2sheetOpts.skipHeader = true; | ||
107 | + } | ||
108 | + | ||
109 | + const worksheet = utils.json_to_sheet(arrData, p.json2sheetOpts); | ||
110 | + setColumnWidth(arrData, worksheet); | ||
111 | + | ||
112 | + p.sheetName = p.sheetName || `${DEF_SHEET_NAME}${index}`; | ||
113 | + workbook.SheetNames.push(p.sheetName); | ||
114 | + workbook.Sheets[p.sheetName] = worksheet; | ||
115 | + }); | ||
116 | + writeFile(workbook, filename, write2excelOpts); | ||
117 | +} | ||
118 | + | ||
119 | +/** | ||
120 | + * aoa导出多Sheet的Xlsx | ||
121 | + * @param sheetList 多sheet配置 | ||
122 | + * @param filename 文件名(包含后缀) | ||
123 | + * @param write2excelOpts 文件配置 | ||
124 | + */ | ||
125 | +export function aoaToMultipleSheetXlsx<T = any>({ | ||
126 | + sheetList, | ||
127 | + filename = DEF_FILE_NAME, | ||
128 | + write2excelOpts = { bookType: 'xlsx' }, | ||
129 | +}: AoaToMultipleSheet<T>) { | ||
130 | + const workbook: WorkBook = { | ||
131 | + SheetNames: [], | ||
132 | + Sheets: {}, | ||
133 | + }; | ||
134 | + sheetList.forEach((p, index) => { | ||
135 | + const arrData = [...p.data]; | ||
136 | + if (p.header) { | ||
137 | + arrData.unshift(p.header); | ||
138 | + } | ||
139 | + const worksheet = utils.aoa_to_sheet(arrData); | ||
140 | + | ||
141 | + p.sheetName = p.sheetName || `${DEF_SHEET_NAME}${index}`; | ||
142 | + workbook.SheetNames.push(p.sheetName); | ||
143 | + workbook.Sheets[p.sheetName] = worksheet; | ||
144 | + }); | ||
145 | + /* output format determined by filename */ | ||
146 | + writeFile(workbook, filename, write2excelOpts); | ||
147 | + /* at this point, out.xlsb will have been downloaded */ | ||
148 | +} |
src/components/Excel/src/typing.ts
@@ -10,6 +10,7 @@ export interface JsonToSheet<T = any> { | @@ -10,6 +10,7 @@ export interface JsonToSheet<T = any> { | ||
10 | data: T[]; | 10 | data: T[]; |
11 | header?: T; | 11 | header?: T; |
12 | filename?: string; | 12 | filename?: string; |
13 | + sheetName?: string; | ||
13 | json2sheetOpts?: JSON2SheetOpts; | 14 | json2sheetOpts?: JSON2SheetOpts; |
14 | write2excelOpts?: WritingOptions; | 15 | write2excelOpts?: WritingOptions; |
15 | } | 16 | } |
@@ -18,6 +19,7 @@ export interface AoAToSheet<T = any> { | @@ -18,6 +19,7 @@ export interface AoAToSheet<T = any> { | ||
18 | data: T[][]; | 19 | data: T[][]; |
19 | header?: T[]; | 20 | header?: T[]; |
20 | filename?: string; | 21 | filename?: string; |
22 | + sheetName?: string; | ||
21 | write2excelOpts?: WritingOptions; | 23 | write2excelOpts?: WritingOptions; |
22 | } | 24 | } |
23 | 25 | ||
@@ -25,3 +27,15 @@ export interface ExportModalResult { | @@ -25,3 +27,15 @@ export interface ExportModalResult { | ||
25 | filename: string; | 27 | filename: string; |
26 | bookType: BookType; | 28 | bookType: BookType; |
27 | } | 29 | } |
30 | + | ||
31 | +export interface JsonToMultipleSheet<T = any> { | ||
32 | + sheetList: JsonToSheet<T>[]; | ||
33 | + filename?: string; | ||
34 | + write2excelOpts?: WritingOptions; | ||
35 | +} | ||
36 | + | ||
37 | +export interface AoaToMultipleSheet<T = any> { | ||
38 | + sheetList: AoAToSheet<T>[]; | ||
39 | + filename?: string; | ||
40 | + write2excelOpts?: WritingOptions; | ||
41 | +} |
src/views/demo/excel/ArrayExport.vue
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | <BasicTable title="基础表格" :columns="columns" :dataSource="data"> | 3 | <BasicTable title="基础表格" :columns="columns" :dataSource="data"> |
4 | <template #toolbar> | 4 | <template #toolbar> |
5 | <a-button @click="aoaToExcel"> 导出 </a-button> | 5 | <a-button @click="aoaToExcel"> 导出 </a-button> |
6 | + <a-button @click="aoaToMultipleSheet" danger> 导出多Sheet </a-button> | ||
6 | </template> | 7 | </template> |
7 | </BasicTable> | 8 | </BasicTable> |
8 | </PageWrapper> | 9 | </PageWrapper> |
@@ -14,6 +15,7 @@ | @@ -14,6 +15,7 @@ | ||
14 | import { aoaToSheetXlsx } from '/@/components/Excel'; | 15 | import { aoaToSheetXlsx } from '/@/components/Excel'; |
15 | import { arrHeader, arrData, columns, data } from './data'; | 16 | import { arrHeader, arrData, columns, data } from './data'; |
16 | import { PageWrapper } from '/@/components/Page'; | 17 | import { PageWrapper } from '/@/components/Page'; |
18 | + import { aoaToMultipleSheetXlsx } from '/@/components/Excel/src/Export2Excel'; | ||
17 | 19 | ||
18 | export default defineComponent({ | 20 | export default defineComponent({ |
19 | components: { BasicTable, PageWrapper }, | 21 | components: { BasicTable, PageWrapper }, |
@@ -26,9 +28,28 @@ | @@ -26,9 +28,28 @@ | ||
26 | filename: '二维数组方式导出excel.xlsx', | 28 | filename: '二维数组方式导出excel.xlsx', |
27 | }); | 29 | }); |
28 | } | 30 | } |
31 | + function aoaToMultipleSheet() { | ||
32 | + // 保证data顺序与header一致 | ||
33 | + aoaToMultipleSheetXlsx({ | ||
34 | + sheetList: [ | ||
35 | + { | ||
36 | + data: arrData, | ||
37 | + header: arrHeader, | ||
38 | + sheetName: 'Sheet1', | ||
39 | + }, | ||
40 | + { | ||
41 | + data: arrData, | ||
42 | + header: arrHeader, | ||
43 | + sheetName: 'Sheet2', | ||
44 | + }, | ||
45 | + ], | ||
46 | + filename: '二维数组方式导出excel-多Sheet示例.xlsx', | ||
47 | + }); | ||
48 | + } | ||
29 | 49 | ||
30 | return { | 50 | return { |
31 | aoaToExcel, | 51 | aoaToExcel, |
52 | + aoaToMultipleSheet, | ||
32 | columns, | 53 | columns, |
33 | data, | 54 | data, |
34 | }; | 55 | }; |
src/views/demo/excel/JsonExport.vue
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | <template #toolbar> | 4 | <template #toolbar> |
5 | <a-button @click="defaultHeader"> 导出:默认头部 </a-button> | 5 | <a-button @click="defaultHeader"> 导出:默认头部 </a-button> |
6 | <a-button @click="customHeader"> 导出:自定义头部 </a-button> | 6 | <a-button @click="customHeader"> 导出:自定义头部 </a-button> |
7 | + <a-button @click="handleMultipleSheet" danger> 导出多Sheet </a-button> | ||
7 | </template> | 8 | </template> |
8 | </BasicTable> | 9 | </BasicTable> |
9 | </PageWrapper> | 10 | </PageWrapper> |
@@ -15,6 +16,7 @@ | @@ -15,6 +16,7 @@ | ||
15 | import { jsonToSheetXlsx } from '/@/components/Excel'; | 16 | import { jsonToSheetXlsx } from '/@/components/Excel'; |
16 | import { columns, data } from './data'; | 17 | import { columns, data } from './data'; |
17 | import { PageWrapper } from '/@/components/Page'; | 18 | import { PageWrapper } from '/@/components/Page'; |
19 | + import { jsonToMultipleSheetXlsx } from '/@/components/Excel/src/Export2Excel'; | ||
18 | 20 | ||
19 | export default defineComponent({ | 21 | export default defineComponent({ |
20 | components: { BasicTable, PageWrapper }, | 22 | components: { BasicTable, PageWrapper }, |
@@ -47,9 +49,38 @@ | @@ -47,9 +49,38 @@ | ||
47 | }); | 49 | }); |
48 | } | 50 | } |
49 | 51 | ||
52 | + function handleMultipleSheet() { | ||
53 | + jsonToMultipleSheetXlsx({ | ||
54 | + sheetList: [ | ||
55 | + { | ||
56 | + data, | ||
57 | + sheetName: '使用key作为默认头部', | ||
58 | + }, | ||
59 | + { | ||
60 | + data, | ||
61 | + header: { | ||
62 | + id: 'ID', | ||
63 | + name: '姓名', | ||
64 | + age: '年龄', | ||
65 | + no: '编号', | ||
66 | + address: '地址', | ||
67 | + beginTime: '开始时间', | ||
68 | + endTime: '结束时间', | ||
69 | + }, | ||
70 | + json2sheetOpts: { | ||
71 | + // 指定顺序 | ||
72 | + header: ['name', 'id'], | ||
73 | + }, | ||
74 | + sheetName: '自定义头部', | ||
75 | + }, | ||
76 | + ], | ||
77 | + filename: '多Sheet导出示例.xlsx', | ||
78 | + }); | ||
79 | + } | ||
50 | return { | 80 | return { |
51 | defaultHeader, | 81 | defaultHeader, |
52 | customHeader, | 82 | customHeader, |
83 | + handleMultipleSheet, | ||
53 | columns, | 84 | columns, |
54 | data, | 85 | data, |
55 | }; | 86 | }; |