@xizs/nuxt-antui 0.0.44 → 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
|
|
@@ -212,9 +215,9 @@ export default defineComponent({
|
|
|
212
215
|
}
|
|
213
216
|
}
|
|
214
217
|
}
|
|
215
|
-
pagination.total = res.meta
|
|
216
|
-
pagination.pageSize = res.meta
|
|
217
|
-
pagination.page = res.meta
|
|
218
|
+
pagination.total = res.meta?.pagination?.total
|
|
219
|
+
pagination.pageSize = res.meta?.pagination?.per_page||res.meta?.pagination?.perPage
|
|
220
|
+
pagination.page = res.meta?.pagination?.current_page||res.meta?.pagination?.currentPage
|
|
218
221
|
props.attribute.reqData = res
|
|
219
222
|
props.attribute.metaTableData = JSON.parse(JSON.stringify(res.list))
|
|
220
223
|
props.attribute.tableData = res.list
|
|
@@ -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.
|
|
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",
|