@xizs/nuxt-antui 0.0.45 → 0.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -119,6 +119,9 @@ const FormItems:Record<string, (form: any, item: TableFormLabelsItemType) => any
119
119
 
120
120
 
121
121
  export const FormTableProps = {
122
+ title:{
123
+ type:String,
124
+ },
122
125
  form: {
123
126
  type: Object as () => TableParamsType['form'],
124
127
  required: false
@@ -251,7 +254,16 @@ export default defineComponent({
251
254
  {props.form?.option?.search !== false && <AButton type="primary" onClick={()=>tableData.load()}>{$t('搜索')}</AButton>}
252
255
  {props.form?.option?.reset !== false && <AButton onClick={() => patch(metaForm,form.value,true)}>{$t('重置')}</AButton>}
253
256
  {props.form?.option?.export === true && <AButton type="primary" onClick={()=>{
254
- props.form.export?.(form.value)
257
+ // props.form.export?.(form.value)
258
+ exportExcel(props.title??'导出', props.table.columns,async (page,pageSize)=>{
259
+ let res = await props.data?.({ ...form.value, ...{page,pageSize} })
260
+ return res.list??res
261
+
262
+ // let subName = subList.value.find(item => item.value == attribute?.form.subId)?.label
263
+ // let res = await req.get('/system/live-record/variety/list', { query: {page,pageSize,...form.value} })
264
+ // return res.list
265
+ })
266
+
255
267
  }}>{$t('导出')}</AButton>}
256
268
  </div>
257
269
 
@@ -0,0 +1,210 @@
1
+ import table2excel from 'js-table2excel'
2
+ import { Workbook } from 'exceljs'
3
+
4
+ export const toExcel = async function (getFn: (page: number, pageSize: number) => Promise<any[]>, type: string = 'xlsx'): Promise<(name: string, columns: any) => {}> {
5
+ let page = 1
6
+ const dataArr: any[] = []
7
+ while ((await (async () => {
8
+ const arr = await getFn(page++, 10000)
9
+ dataArr.push(...arr)
10
+ return arr
11
+ })()).length > 0) { }
12
+
13
+ if (dataArr.length === 0) {
14
+ throw new Error('无数据')
15
+ }
16
+
17
+ const a = {
18
+ 'xlsx': (filename, columns) => {
19
+ transformColumns(columns)
20
+ xlsx(filename, columns, dataArr)
21
+ },
22
+ 'xls': (filename, columns) => {
23
+ transformColumns(columns)
24
+ table2excel(columns, dataArr, filename)
25
+ }
26
+ }[type]
27
+ return a
28
+ }
29
+
30
+ function getVNodeText(vnode:any) {
31
+
32
+ if (vnode.children && vnode.children.length === 1 && typeof vnode.children[0] === 'string') {
33
+ return vnode.children[0];
34
+ } else if (typeof vnode.text === 'string') {
35
+ return vnode.text;
36
+ }
37
+ else if (Object.prototype.toString.call(vnode.children) === '[object Object]') {
38
+ return vnode.children.default()
39
+ }
40
+ else {
41
+ let text = '';
42
+ if (vnode.children) {
43
+ for (let i = 0; i < vnode.children.length; i++) {
44
+ const child = vnode.children[i];
45
+ if (child?.children && child.children.length === 1 && typeof child.children[0] === 'string') {
46
+ text += child.children[0];
47
+ } else if (typeof child === 'string') {
48
+ text += child;
49
+ }
50
+ }
51
+ }
52
+ else vnode.innerText
53
+ return text;
54
+ }
55
+ }
56
+ function isVNode(node:nay) {
57
+ return Object.prototype.toString.call(node) === '[object Object]'
58
+ }
59
+
60
+ export const exportExcel = async (
61
+ filename: string,
62
+ columns: Array<any>,
63
+ getFn: (page: number, pageSize: number) => Promise<any[]>,
64
+ maxDataNumber: number = Infinity,
65
+ type: string = 'xlsx'
66
+ ) => {
67
+ let page = 1
68
+ const dataArr: any[] = []
69
+ while ((await (async () => {
70
+ const arr = await getFn(page++, 10000)
71
+ dataArr.push(...arr)
72
+ return arr
73
+ })()).length > 0 && dataArr.length < maxDataNumber) { }
74
+ if (dataArr.length === 0) {
75
+ throw new Error('无数据')
76
+ }
77
+ //自定义数据转换
78
+ columns = columns.reduce((prev, next) => {
79
+ if (next.children) {
80
+ prev.push(...next.children)
81
+ } else {
82
+ prev.push(next)
83
+ }
84
+ return prev
85
+ }, [])
86
+ const customRenderColumns = columns.filter((item: any) => (item.customRender != null && item.export !== false) || item.formatFunc)
87
+
88
+ dataArr.forEach((dataItem, index) => {
89
+ customRenderColumns.forEach((crItem: any) => {
90
+ let text = dataItem[crItem.dataIndex]
91
+ const customRenderItem = crItem?.customRender && crItem.customRender({ text, record: dataItem, index: index + 1, isExcel: true })
92
+ const customRenderItemFunc = (crItem?.formatFunc && crItem?.formatFunc(dataItem)) || customRenderItem
93
+
94
+ dataItem[crItem.dataIndex] = isVNode(customRenderItemFunc) ? getVNodeText(customRenderItemFunc) : Array.isArray(customRenderItemFunc) ? customRenderItemFunc.map(item => isVNode(item) ? getVNodeText(item) : item).join(',') : customRenderItemFunc
95
+ })
96
+ })
97
+ let resultColumns = columns.filter(item => item.export !== false)
98
+
99
+ transformColumns(columns);
100
+
101
+ console.log(resultColumns, dataArr)
102
+ let fn: Record<string, Function> = {
103
+ 'xlsx': () => xlsx(filename, resultColumns, dataArr),
104
+ 'xls': () => table2excel(resultColumns, dataArr, filename)
105
+ }
106
+ fn[type]()
107
+ }
108
+
109
+ function transformColumns(columns: any) {
110
+ columns.forEach(item => {
111
+ if (item.key == null || item.dataIndex != null) {
112
+ item.key = item.dataIndex
113
+ }
114
+ });
115
+ }
116
+
117
+
118
+ function columnsType(columns) {
119
+ return columns.reduce((prev, next) => {
120
+ if (next.type != null) {
121
+ prev[next.key] = next.type
122
+ }
123
+ return prev
124
+ }, {})
125
+ }
126
+ export const xlsx = (name, columns, data) => {
127
+ if (data.length === 0) {
128
+ this.$Msg(this.$t('没有数据'), {})
129
+ return
130
+ }
131
+ const types = columnsType(columns)
132
+ console.log(types)
133
+ data.forEach(item => {
134
+ for (const key in item) {
135
+ if (types[key] != null) {
136
+ console.log(key)
137
+ types[key](item[key])
138
+ continue
139
+ }
140
+ // if (!isNaN(item[key])) {
141
+ // item[key] = Number(item[key])
142
+ // }
143
+ }
144
+ })
145
+ columns = columns.map(item => {
146
+ const obj = {}
147
+ obj.key = item.dataIndex || item.key
148
+ obj.header = item.title || item.header
149
+ obj.width = 20
150
+ return obj
151
+ })
152
+ data = JSON.parse(JSON.stringify(data))
153
+ batchExport(name, columns, data)
154
+ }
155
+
156
+
157
+
158
+ async function batchExport(excelName, columns, sourceData, fn) {
159
+ const wb = new Workbook()
160
+ const sheet = wb.addWorksheet('sheet')
161
+
162
+ sheet.columns = columns
163
+ sheet.addRows(sourceData)
164
+ fn && fn(sheet)
165
+ const buffer = await wb.xlsx.writeBuffer()
166
+
167
+ /**
168
+ * 特殊下载方案
169
+ */
170
+ const down = () => {
171
+ const blob = new Blob([buffer], {
172
+ type: 'application/octet-stream'
173
+ })
174
+
175
+ let url = blob
176
+ const saveName = `${excelName}.xlsx`
177
+
178
+ if (typeof url === 'object' && url instanceof Blob) {
179
+ url = URL.createObjectURL(url) // 创建blob地址
180
+ }
181
+ const aLink = document.createElement('a')
182
+ aLink.href = url
183
+ aLink.download = saveName || '' // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
184
+ var event
185
+ if (window.MouseEvent) event = new MouseEvent('click')
186
+ else {
187
+ event = document.createEvent('MouseEvents')
188
+ event.initMouseEvent(
189
+ 'click',
190
+ true,
191
+ false,
192
+ window,
193
+ 0,
194
+ 0,
195
+ 0,
196
+ 0,
197
+ 0,
198
+ false,
199
+ false,
200
+ false,
201
+ false,
202
+ 0,
203
+ null
204
+ )
205
+ }
206
+ aLink.dispatchEvent(event)
207
+ }
208
+
209
+ down()
210
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xizs/nuxt-antui",
3
3
  "type": "module",
4
- "version": "0.0.45",
4
+ "version": "0.0.46",
5
5
  "main": "./nuxt.config.ts",
6
6
  "scripts": {
7
7
  "dev": "nuxi dev .playground",
@@ -17,6 +17,8 @@
17
17
  "@tailwindcss/vite": "^4.1.3",
18
18
  "@xizs/nuxt-base": "0.0.5",
19
19
  "ant-design-vue": ">=4",
20
+ "exceljs": "^4.3.0",
21
+ "js-table2excel": "^1.1.2",
20
22
  "nuxt": "^3.16.2",
21
23
  "tailwindcss": "^4.0.14",
22
24
  "vue": "^3.5.13",