@lambo-design/shared 1.0.0-beta.32 → 1.0.0-beta.320
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.
- package/config/config.js +20 -3
- package/config/index.js +7 -2
- package/config/locale.js +61 -0
- package/config/themes/atrovirens/atrovirens.css +589 -0
- package/config/themes/atrovirens/atrovirens.css.map +1 -0
- package/config/themes/atrovirens/atrovirens.less +680 -0
- package/config/themes/atrovirens/var.less +688 -0
- package/config/themes/blue/blue.css +589 -0
- package/config/themes/blue/blue.css.map +1 -0
- package/config/themes/blue/blue.less +683 -0
- package/config/themes/blue/var.less +691 -0
- package/config/themes/blue-white/blue-white.css +589 -0
- package/config/themes/blue-white/blue-white.css.map +1 -0
- package/config/themes/blue-white/blue-white.less +684 -0
- package/config/themes/blue-white/var.less +690 -0
- package/config/themes/blue-white-big/blue-white-big.css +589 -0
- package/config/themes/blue-white-big/blue-white-big.css.map +1 -0
- package/config/themes/blue-white-big/blue-white-big.less +684 -0
- package/config/themes/blue-white-big/var.less +690 -0
- package/config/themes/blue-white-tight/blue-white-tight.css +590 -0
- package/config/themes/blue-white-tight/blue-white-tight.css.map +1 -0
- package/config/themes/blue-white-tight/blue-white-tight.less +684 -0
- package/config/themes/blue-white-tight/var.less +692 -0
- package/config/themes/canglan/canglan.css +588 -0
- package/config/themes/canglan/canglan.css.map +1 -0
- package/config/themes/canglan/canglan.less +681 -0
- package/config/themes/canglan/var.less +692 -0
- package/config/themes/cuiwei/cuiwei.css +589 -0
- package/config/themes/cuiwei/cuiwei.css.map +1 -0
- package/config/themes/cuiwei/cuiwei.less +681 -0
- package/config/themes/cuiwei/var.less +690 -0
- package/config/themes/danqing/danqing.css +589 -0
- package/config/themes/danqing/danqing.css.map +1 -0
- package/config/themes/danqing/danqing.less +681 -0
- package/config/themes/danqing/danqing.wxss +576 -0
- package/config/themes/danqing/var.less +695 -0
- package/config/themes/deep/deep.css +589 -0
- package/config/themes/deep/deep.css.map +1 -0
- package/config/themes/deep/deep.less +681 -0
- package/config/themes/deep/var.less +693 -0
- package/config/themes/default/default.css +403 -57
- package/config/themes/default/default.css.map +1 -1
- package/config/themes/default/default.less +380 -16
- package/config/themes/default/var.less +389 -11
- package/config/themes/eap/eap.css +589 -0
- package/config/themes/eap/eap.css.map +1 -0
- package/config/themes/eap/eap.less +684 -0
- package/config/themes/eap/var.less +692 -0
- package/config/themes/gold/gold.css +589 -0
- package/config/themes/gold/gold.css.map +1 -0
- package/config/themes/gold/gold.less +684 -0
- package/config/themes/gold/var.less +385 -5
- package/config/themes/index.js +26 -4
- package/config/themes/lime/lime.css +589 -0
- package/config/themes/lime/lime.css.map +1 -0
- package/config/themes/lime/lime.less +684 -0
- package/config/themes/lime/var.less +384 -5
- package/config/themes/orange/orange.css +353 -7
- package/config/themes/orange/orange.css.map +1 -1
- package/config/themes/orange/orange.less +365 -0
- package/config/themes/orange/var.less +385 -5
- package/config/themes/red/red.css +353 -7
- package/config/themes/red/red.css.map +1 -1
- package/config/themes/red/red.less +365 -0
- package/config/themes/red/var.less +385 -5
- package/config/themes/sichuan/sichuan.css +589 -0
- package/config/themes/sichuan/sichuan.css.map +1 -0
- package/config/themes/sichuan/sichuan.less +684 -0
- package/config/themes/sichuan/var.less +690 -0
- package/config/themes/theme-atrovirens.js +571 -0
- package/config/themes/theme-blue.js +571 -0
- package/config/themes/theme-bw.js +571 -0
- package/config/themes/theme-bwb.js +571 -0
- package/config/themes/theme-bwt.js +572 -0
- package/config/themes/theme-canglan.js +573 -0
- package/config/themes/theme-cuiwei.js +573 -0
- package/config/themes/theme-danqing.js +574 -0
- package/config/themes/theme-deep.js +571 -0
- package/config/themes/theme-default.js +378 -60
- package/config/themes/theme-eap.js +571 -0
- package/config/themes/theme-gold.js +326 -8
- package/config/themes/theme-lime.js +326 -8
- package/config/themes/theme-orange.js +560 -29
- package/config/themes/theme-red.js +563 -33
- package/config/themes/theme-sichuan.js +571 -0
- package/config/themes/theme-white.js +571 -0
- package/config/themes/white/var.less +691 -0
- package/config/themes/white/white.css +589 -0
- package/config/themes/white/white.css.map +1 -0
- package/config/themes/white/white.less +684 -0
- package/directives/module/print.js +1 -0
- package/directives/module/vue-print-nb/README.md +63 -0
- package/directives/module/vue-print-nb/print.js +94 -0
- package/directives/module/vue-print-nb/printarea.js +532 -0
- package/index.js +7 -1
- package/nstyles/common.less +197 -0
- package/nstyles/components/404.less +46 -0
- package/nstyles/components/button.less +34 -0
- package/nstyles/components/date-picker.less +41 -0
- package/nstyles/components/drawer.less +20 -0
- package/nstyles/components/dropdown.less +18 -0
- package/nstyles/components/excel-flow.less +72 -0
- package/nstyles/components/form.less +314 -0
- package/nstyles/components/index.less +23 -0
- package/nstyles/components/layout/collect.less +10 -0
- package/nstyles/components/layout/detail-view.less +107 -0
- package/nstyles/components/layout/full-screen.less +7 -0
- package/nstyles/components/layout/index.less +7 -0
- package/nstyles/components/layout/other-menu.less +142 -0
- package/nstyles/components/layout/page-view.less +101 -0
- package/nstyles/components/layout/sider-trigger.less +41 -0
- package/nstyles/components/layout/tags-nav.less +113 -0
- package/nstyles/components/modal.less +90 -0
- package/nstyles/components/n-button.less +131 -0
- package/nstyles/components/n-image-preview.less +131 -0
- package/nstyles/components/n-model/index.less +19 -0
- package/nstyles/components/n-model/report-index.less +43 -0
- package/nstyles/components/n-panel.less +41 -0
- package/nstyles/components/n-picker.less +37 -0
- package/nstyles/components/n-sign.less +17 -0
- package/nstyles/components/n-tooltip.less +10 -0
- package/nstyles/components/panel.less +31 -0
- package/nstyles/components/select.less +3 -0
- package/nstyles/components/sign.less +27 -0
- package/nstyles/components/table.less +413 -0
- package/nstyles/components/tree.less +166 -0
- package/nstyles/components/upload.less +174 -0
- package/nstyles/index.less +5 -0
- package/nstyles/reset.less +73 -0
- package/nstyles/third/ag.less +226 -0
- package/nstyles/third/icons/sort-desc.svg +1 -0
- package/nstyles/third/icons/sort-up.svg +1 -0
- package/nstyles/third/icons/sorting.svg +1 -0
- package/nstyles/third/index.less +11 -0
- package/nstyles/third/view-design.less +378 -0
- package/nstyles/variables/base.less +143 -0
- package/nstyles/variables/index.less +4 -0
- package/nstyles/variables/theme/default/button.less +7 -0
- package/nstyles/variables/theme/default/common.less +60 -0
- package/nstyles/variables/theme/default/index.less +7 -0
- package/nstyles/variables/theme/default/layout.less +40 -0
- package/nstyles/variables/theme/default/table.less +37 -0
- package/nstyles/variables/theme/default/tag.less +3 -0
- package/nstyles/variables/theme/default/upload.less +3 -0
- package/nstyles/variables/theme/index.less +13 -0
- package/nstyles/variables/theme/lsv/button.less +7 -0
- package/nstyles/variables/theme/lsv/common.less +39 -0
- package/nstyles/variables/theme/lsv/index.less +5 -0
- package/nstyles/variables/theme/lsv/layout.less +21 -0
- package/nstyles/variables/theme/lsv/table.less +20 -0
- package/nstyles/variables/theme/lsv/tag.less +3 -0
- package/nstyles/variables/theme/small/button.less +7 -0
- package/nstyles/variables/theme/small/common.less +41 -0
- package/nstyles/variables/theme/small/index.less +5 -0
- package/nstyles/variables/theme/small/layout.less +21 -0
- package/nstyles/variables/theme/small/table.less +17 -0
- package/nstyles/variables/theme/small/tag.less +3 -0
- package/package.json +28 -7
- package/plugin/index.js +12 -0
- package/plugin/module/date-format.js +30 -0
- package/plugin/module/loading.js +26 -0
- package/plugin/module/warn-handler.js +11 -0
- package/styles/image/indicator-card-header.png +0 -0
- package/styles/image/inspur.png +0 -0
- package/styles/image/lan_navigator.png +0 -0
- package/styles/image/layout-header-bg-canglan.png +0 -0
- package/styles/image/layout-header-bg-cuiwei.png +0 -0
- package/styles/image/lv_navigator.png +0 -0
- package/utils/ajax/abort-controller.js +70 -0
- package/utils/ajax/cancel-reason.js +25 -0
- package/utils/ajax/cancel-token.js +83 -0
- package/utils/ajax/content-type.js +30 -0
- package/utils/ajax/headers.js +11 -0
- package/utils/ajax/interceptors.js +45 -10
- package/utils/ajax/sseFetchUtil.js +118 -0
- package/utils/ajax/throttle.js +49 -0
- package/utils/assist.js +155 -27
- package/utils/base64.js +126 -0
- package/utils/blob.js +47 -0
- package/utils/context-menu.js +65 -0
- package/utils/crypto/aes.js +23 -0
- package/utils/crypto/index.js +10 -0
- package/utils/crypto/rsa.js +23 -0
- package/utils/date.js +334 -305
- package/utils/dict/built-in-dict.js +20 -0
- package/utils/dict/index.js +191 -0
- package/utils/event.js +72 -0
- package/utils/excel.js +502 -290
- package/utils/file.js +19 -0
- package/utils/form/validate.js +29 -0
- package/utils/half-year.js +68 -0
- package/utils/index.js +37 -0
- package/utils/json.js +44 -0
- package/utils/locale/en-US.js +174 -0
- package/utils/locale/zh-CN.js +174 -0
- package/utils/lodop.js +5 -0
- package/utils/menu/index.js +292 -15
- package/utils/mime_type.js +67 -0
- package/utils/modelerUtil.js +4 -1
- package/utils/n/api.js +38 -0
- package/utils/n/date.js +57 -0
- package/utils/n/index.js +10 -0
- package/utils/n/is-type.js +176 -0
- package/utils/n/number.js +144 -0
- package/utils/n/permission-cache.js +11 -0
- package/utils/n/reuqest/axiosN.js +17 -0
- package/utils/n/reuqest/content-type.js +19 -0
- package/utils/n/reuqest/interceptors.js +95 -0
- package/utils/n/reuqest/url-params.js +12 -0
- package/utils/n/storage.js +51 -0
- package/utils/n/token.js +51 -0
- package/utils/n/user-cache.js +11 -0
- package/utils/n/user.js +34 -0
- package/utils/n/uuid.js +16 -0
- package/utils/n-generator-routers.js +208 -0
- package/utils/n-router.js +205 -0
- package/utils/n-theme.js +30 -0
- package/utils/number.js +72 -15
- package/utils/oss.js +57 -0
- package/utils/platform.js +824 -32
- package/utils/quarter.js +58 -0
- package/utils/storage.js +198 -0
- package/utils/style.js +24 -0
- package/utils/theme.js +98 -3
- package/utils/transfer-queue.js +7 -0
- package/utils/transform.js +205 -0
- package/utils/type.js +102 -0
- package/utils/util.js +795 -0
- package/utils/vForm.js +349 -0
- package/utils/validator.js +181 -0
- package/config/themes/gold/default.css +0 -243
- package/config/themes/gold/default.css.map +0 -1
- package/config/themes/gold/default.less +0 -320
- package/config/themes/lime/default.css +0 -243
- package/config/themes/lime/default.css.map +0 -1
- package/config/themes/lime/default.less +0 -320
package/utils/excel.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
|
-
import XLSX from 'xlsx';
|
|
3
|
-
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
|
|
2
|
+
import XLSX from '@lambo-design/xlsx';
|
|
3
|
+
import * as cpexcel from '@lambo-design/xlsx/dist/cpexcel.full.mjs';
|
|
4
4
|
XLSX.set_cptable(cpexcel);
|
|
5
5
|
import {deepCopy} from "./assist";
|
|
6
|
+
import XLSXStyle from '@lambo-design/xlsx-style'
|
|
6
7
|
|
|
8
|
+
/**
|
|
9
|
+
* 表头内容转换规则
|
|
10
|
+
* @type {{'': string, '#': string, 序号: string, 操作: string, 编号: string}}
|
|
11
|
+
*/
|
|
7
12
|
const titleRules = {
|
|
8
13
|
'': '',
|
|
9
14
|
'#': '#',
|
|
@@ -11,14 +16,303 @@ const titleRules = {
|
|
|
11
16
|
'编号': '编号',
|
|
12
17
|
'操作': '操作',
|
|
13
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* 列类型转换规则
|
|
21
|
+
* @type {{'single-selection': string, select: string, selection: string, checkbox: string, index: string, radio: string}}
|
|
22
|
+
*/
|
|
14
23
|
const typeRules = {
|
|
15
24
|
'index': 'index',
|
|
16
25
|
'select': 'select',
|
|
17
26
|
'selection': 'selection',
|
|
18
|
-
'single-selection': 'single-selection'
|
|
27
|
+
'single-selection': 'single-selection',
|
|
28
|
+
'checkbox': 'checkbox',
|
|
29
|
+
'radio': 'radio'
|
|
19
30
|
}
|
|
20
31
|
|
|
21
|
-
|
|
32
|
+
/**
|
|
33
|
+
* 标题样式
|
|
34
|
+
* @type {{border: {top: {color: {rgb: string}, style: string}, left: {color: {rgb: string}, style: string}, bottom: {color: {rgb: string}, style: string}, right: {color: {rgb: string}, style: string}}, alignment: {horizontal: string, vertical: string}, fill: {fgColor: {rgb: string}, bgColor: {indexed: number}}}}
|
|
35
|
+
*/
|
|
36
|
+
let titleStyle = {
|
|
37
|
+
border: {
|
|
38
|
+
left: {style: 'thin', color: {rgb: "000000"}},
|
|
39
|
+
top: {style: 'thin', color: {rgb: "000000"}},
|
|
40
|
+
right: {style: 'thin', color: {rgb: "000000"}},
|
|
41
|
+
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
42
|
+
},
|
|
43
|
+
font: { bold: true },
|
|
44
|
+
alignment: {horizontal: "center", vertical: "center"}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 表头样式
|
|
48
|
+
* @type {{border: {top: {color: {rgb: string}, style: string}, left: {color: {rgb: string}, style: string}, bottom: {color: {rgb: string}, style: string}, right: {color: {rgb: string}, style: string}}, alignment: {horizontal: string, vertical: string}, fill: {fgColor: {rgb: string}, bgColor: {indexed: number}}}}
|
|
49
|
+
*/
|
|
50
|
+
let headStyle = {
|
|
51
|
+
border: {
|
|
52
|
+
left: {style: 'thin', color: {rgb: "000000"}},
|
|
53
|
+
top: {style: 'thin', color: {rgb: "000000"}},
|
|
54
|
+
right: {style: 'thin', color: {rgb: "000000"}},
|
|
55
|
+
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
56
|
+
},
|
|
57
|
+
alignment: {horizontal: "center", vertical: "center"},
|
|
58
|
+
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "5A9BD5"}}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 表格斑马纹样式
|
|
62
|
+
* @type {{border: {top: {color: {rgb: string}, style: string}, left: {color: {rgb: string}, style: string}, bottom: {color: {rgb: string}, style: string}, right: {color: {rgb: string}, style: string}}, alignment: {vertical: string}, fill: {fgColor: {rgb: string}, bgColor: {indexed: number}}}}
|
|
63
|
+
*/
|
|
64
|
+
let bodyPairStyle = {
|
|
65
|
+
border: {
|
|
66
|
+
left: {style: 'thin', color: {rgb: "000000"}},
|
|
67
|
+
top: {style: 'thin', color: {rgb: "000000"}},
|
|
68
|
+
right: {style: 'thin', color: {rgb: "000000"}},
|
|
69
|
+
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
70
|
+
},
|
|
71
|
+
alignment: {vertical: "center"},
|
|
72
|
+
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "DDEBF7"}}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 表格普通样式
|
|
76
|
+
* @type {{border: {top: {color: {rgb: string}, style: string}, left: {color: {rgb: string}, style: string}, bottom: {color: {rgb: string}, style: string}, right: {color: {rgb: string}, style: string}}, alignment: {vertical: string}}}
|
|
77
|
+
*/
|
|
78
|
+
let bodyStyle = {
|
|
79
|
+
border: {
|
|
80
|
+
left: {style: 'thin', color: {rgb: "000000"}},
|
|
81
|
+
top: {style: 'thin', color: {rgb: "000000"}},
|
|
82
|
+
right: {style: 'thin', color: {rgb: "000000"}},
|
|
83
|
+
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
84
|
+
},
|
|
85
|
+
alignment: {vertical: "center"}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 表格底部扩展行样式
|
|
90
|
+
* @type {alignment: {vertical: string}}
|
|
91
|
+
*/
|
|
92
|
+
let footerStyle = {
|
|
93
|
+
alignment: {vertical: "center"}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 过滤掉filterData中titleRules、typeRules相关的列
|
|
98
|
+
* @param filterData
|
|
99
|
+
* @param key 包含typeRules内容的属性名
|
|
100
|
+
* @param name 包含titleRules内容的属性名
|
|
101
|
+
* @returns {*}
|
|
102
|
+
*/
|
|
103
|
+
function title_filter_base(filterData,key,name) {
|
|
104
|
+
for (var i = 0; i < filterData.length; i++) {
|
|
105
|
+
if ((filterData[i].hasOwnProperty(key) && filterData[i][key]
|
|
106
|
+
&& filterData[i][key] === typeRules[filterData[i][key]])
|
|
107
|
+
|| filterData[i][name] === titleRules[filterData[i][name]]) {
|
|
108
|
+
filterData.splice(i, 1)
|
|
109
|
+
i--
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return filterData
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function title_filter(data) {
|
|
116
|
+
let filterData = deepCopy(data);
|
|
117
|
+
return title_filter_base(filterData,'type','title')
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function title_el_filter(data) {
|
|
121
|
+
let filterData = deepCopy(data);
|
|
122
|
+
return title_filter_base(filterData,'property','label')
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 组织表格导出时需要的表头单元格内容
|
|
127
|
+
* @param treeData 列描述
|
|
128
|
+
* @param key 单元格显示内容对应列描述中的属性名
|
|
129
|
+
* @returns {*[][]}
|
|
130
|
+
*/
|
|
131
|
+
function title_transform_base(treeData,key) {
|
|
132
|
+
// 找到树的最大深度
|
|
133
|
+
const maxDepth = findMaxDepth(treeData);
|
|
134
|
+
|
|
135
|
+
// 初始化结果数组,每一层都是一个空数组
|
|
136
|
+
const result = Array.from({ length: maxDepth }, () => []);
|
|
137
|
+
|
|
138
|
+
// 辅助函数,用于找到树的最大深度
|
|
139
|
+
function findMaxDepth(nodes) {
|
|
140
|
+
let maxDepth = 0;
|
|
141
|
+
|
|
142
|
+
function traverse(node, depth = 1) {
|
|
143
|
+
maxDepth = Math.max(maxDepth, depth);
|
|
144
|
+
if (node.children) {
|
|
145
|
+
node.children.forEach(child => traverse(child, depth + 1));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
nodes.forEach(node => traverse(node));
|
|
150
|
+
|
|
151
|
+
return maxDepth;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 辅助函数,用于创建并返回从根节点到当前节点的路径
|
|
155
|
+
function getPath(node, path = [], key) {
|
|
156
|
+
path.unshift(node[key]); // 将当前节点的标题添加到路径的开头
|
|
157
|
+
if (node.parent) {
|
|
158
|
+
return getPath(node.parent, path, key); // 递归调用,直到根节点
|
|
159
|
+
}
|
|
160
|
+
return path;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// 递归函数,用于遍历树的每个节点并收集标题
|
|
164
|
+
function traverseTree(node, depth = 0, parent = null, key) {
|
|
165
|
+
// 给节点添加 parent 属性,方便后续创建路径
|
|
166
|
+
node.parent = parent;
|
|
167
|
+
|
|
168
|
+
// 确保当前深度的结果数组已初始化
|
|
169
|
+
if (result.length <= depth) {
|
|
170
|
+
result.push([]);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// 获取从根节点到当前节点的路径
|
|
174
|
+
const path = getPath(node,[],key);
|
|
175
|
+
|
|
176
|
+
// 当前层级和子层级都增加当前节点
|
|
177
|
+
for (let i = depth; i < maxDepth; i++) {
|
|
178
|
+
result[i].push(node[key])
|
|
179
|
+
}
|
|
180
|
+
// 当前层级的父层级增加对应的父节点
|
|
181
|
+
for (let j = 0; j < depth; j++) {
|
|
182
|
+
result[j].push(path[j])
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
// 如果还有子节点,递归遍历子节点
|
|
187
|
+
if (node.children) {
|
|
188
|
+
for (let i = 0; i < maxDepth; i++) {
|
|
189
|
+
result[i].pop()
|
|
190
|
+
}
|
|
191
|
+
node.children.forEach(child => {
|
|
192
|
+
traverseTree(child, depth + 1, node, key)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 遍历所有根节点并收集标题
|
|
198
|
+
treeData.forEach(rootNode => traverseTree(rootNode,0,null,key));
|
|
199
|
+
|
|
200
|
+
// 去除每个节点上的 parent 属性(如果需要)
|
|
201
|
+
function removeParentProps(nodes) {
|
|
202
|
+
nodes.forEach(node => {
|
|
203
|
+
delete node.parent;
|
|
204
|
+
if (node.children) {
|
|
205
|
+
removeParentProps(node.children);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
removeParentProps(treeData); // 清理 treeData 中的 parent 属性(可选)
|
|
210
|
+
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export const title_transform = (paramData) => {
|
|
215
|
+
let data = title_filter(paramData)
|
|
216
|
+
return title_transform_base(data,'title')
|
|
217
|
+
}
|
|
218
|
+
export const title_el_transform = (paramData) => {
|
|
219
|
+
let data = title_el_filter(paramData)
|
|
220
|
+
return title_transform_base(data,'label')
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* 表格导出时数据区域内容对应的属性名列表
|
|
225
|
+
* @param data 列描述
|
|
226
|
+
* @param key 表格导出时数据区域内容对应列描述中的属性名
|
|
227
|
+
* @returns {*[]}
|
|
228
|
+
*/
|
|
229
|
+
export const key_transform_base = (data,key) => {
|
|
230
|
+
let result = []
|
|
231
|
+
function traverse(node,key) {
|
|
232
|
+
if (node.children) {
|
|
233
|
+
node.children.forEach(child => traverse(child,key));
|
|
234
|
+
}else{
|
|
235
|
+
result.push(node[key])
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
data.forEach(node => traverse(node,key));
|
|
240
|
+
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export const key_transform = (paramData) => {
|
|
245
|
+
let data = title_filter(paramData)
|
|
246
|
+
// let data = paramData
|
|
247
|
+
return key_transform_base(data,'key')
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export const key_el_transform = (paramData) => {
|
|
251
|
+
let data = title_el_filter(paramData)
|
|
252
|
+
// let data = paramData
|
|
253
|
+
return key_transform_base(data,'property')
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export const key_vxe_transform = (paramData) => {
|
|
257
|
+
let data = title_filter(paramData)
|
|
258
|
+
// let data = paramData
|
|
259
|
+
return key_transform_base(data,'field')
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 表格导出时,表头数据中存储的枚举信息汇总
|
|
264
|
+
* @param data 列描述
|
|
265
|
+
* @param key 表格数据内容对应列描述的key
|
|
266
|
+
* @returns {*[]}
|
|
267
|
+
*/
|
|
268
|
+
export const enums_transform_base = (data,key) => {
|
|
269
|
+
let result = []
|
|
270
|
+
function traverse(node,key) {
|
|
271
|
+
if (node.children) {
|
|
272
|
+
node.children.forEach(child => traverse(child,key));
|
|
273
|
+
}else if (node.enums){
|
|
274
|
+
result.push({key:node[key],enums:node.enums})
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
data.forEach(node => traverse(node,key));
|
|
279
|
+
return result
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export const enums_transform = (paramData) => {
|
|
283
|
+
let result = []
|
|
284
|
+
let data = title_filter(paramData)
|
|
285
|
+
// let data = paramData
|
|
286
|
+
return enums_transform_base(data,'key')
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export const enums_el_transform = (paramData) => {
|
|
290
|
+
let result = []
|
|
291
|
+
let data = title_el_filter(paramData)
|
|
292
|
+
// let data = paramData
|
|
293
|
+
return enums_transform_base(data,'property')
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export const enums_vxe_transform = (paramData) => {
|
|
297
|
+
let result = []
|
|
298
|
+
let data = title_filter(paramData)
|
|
299
|
+
// let data = paramData
|
|
300
|
+
return enums_transform_base(data,'field')
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
export const enums_to_value = (enums,jsonData)=>{
|
|
305
|
+
if(enums&&enums.length>0){
|
|
306
|
+
return jsonData.map(v => enums.map(e =>{
|
|
307
|
+
v[e.key] = e.enums[v[e.key]]
|
|
308
|
+
return v
|
|
309
|
+
})[0])
|
|
310
|
+
}else{
|
|
311
|
+
return jsonData
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function auto_width(ws, data, startRow=0) {
|
|
22
316
|
/*set worksheet max width per col*/
|
|
23
317
|
const colWidth = data.map(row => row.map(val => {
|
|
24
318
|
/*if null/undefined*/
|
|
@@ -34,7 +328,12 @@ function auto_width(ws, data) {
|
|
|
34
328
|
}))
|
|
35
329
|
/*start in the first row*/
|
|
36
330
|
let result = colWidth[0];
|
|
37
|
-
|
|
331
|
+
if (startRow > 0) {
|
|
332
|
+
// 排除header中title和search数据
|
|
333
|
+
result = colWidth[startRow];
|
|
334
|
+
}
|
|
335
|
+
// 计算列宽时,查询条件行数据不参与计算
|
|
336
|
+
for (let i = startRow > 0 ? startRow : 1; i < colWidth.length; i++) {
|
|
38
337
|
for (let j = 0; j < colWidth[i].length; j++) {
|
|
39
338
|
if (result[j]['wch'] < colWidth[i][j]['wch']) {
|
|
40
339
|
result[j]['wch'] = colWidth[i][j]['wch'] > 7 ? colWidth[i][j]['wch'] : 7;
|
|
@@ -44,33 +343,80 @@ function auto_width(ws, data) {
|
|
|
44
343
|
ws['!cols'] = result;
|
|
45
344
|
}
|
|
46
345
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
let
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
let
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
function merge_cell({ws,data,startRow}) {
|
|
349
|
+
let mergeData = [];
|
|
350
|
+
|
|
351
|
+
for (let i = 0; i < data.length; i++) {
|
|
352
|
+
for (let j = 0; j < data[i].length; j++) {
|
|
353
|
+
let currentCellValue = data[i][j];
|
|
354
|
+
let merge = { s: { r: i + startRow, c: j }, e: { r: i + startRow, c: j } };
|
|
355
|
+
|
|
356
|
+
// Check horizontal direction for merges
|
|
357
|
+
while (
|
|
358
|
+
j + 1 < data[i].length &&
|
|
359
|
+
data[i][j + 1] === currentCellValue &&
|
|
360
|
+
!isCellMerged(mergeData, { r: i + startRow, c: j + 1 })
|
|
361
|
+
) {
|
|
362
|
+
merge.e.c = j + 1;
|
|
363
|
+
j++;
|
|
59
364
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
365
|
+
|
|
366
|
+
// Check vertical direction for merges
|
|
367
|
+
let originalRow = i + startRow;
|
|
368
|
+
while (
|
|
369
|
+
i + 1 < data.length &&
|
|
370
|
+
data[i + 1][j] === currentCellValue &&
|
|
371
|
+
!isCellMerged(mergeData, { r: i + startRow + 1, c: j })
|
|
372
|
+
) {
|
|
373
|
+
i++;
|
|
374
|
+
|
|
375
|
+
// Update the starting row if it's the first iteration of the vertical loop
|
|
376
|
+
// if (i === originalRow + 1) {
|
|
377
|
+
// merge.s.r = i;
|
|
378
|
+
// }
|
|
379
|
+
|
|
380
|
+
// Expand the end row
|
|
381
|
+
merge.e.r = i;
|
|
64
382
|
}
|
|
65
|
-
|
|
66
|
-
|
|
383
|
+
|
|
384
|
+
// Add the merge object to the array if it's not empty
|
|
385
|
+
if (merge.e.c > merge.s.c || merge.e.r > merge.s.r) {
|
|
386
|
+
mergeData.push(merge);
|
|
387
|
+
|
|
388
|
+
// Adjust the outer loop variables since we might have incremented i inside the loop
|
|
389
|
+
i = originalRow;
|
|
390
|
+
j = merge.e.c;
|
|
67
391
|
}
|
|
68
392
|
}
|
|
69
393
|
}
|
|
70
|
-
|
|
394
|
+
|
|
395
|
+
// return mergeData
|
|
396
|
+
// Add the merge ranges to the worksheet
|
|
397
|
+
if (ws['!merges']) {
|
|
398
|
+
ws['!merges'] = ws['!merges'].concat(mergeData);
|
|
399
|
+
} else {
|
|
400
|
+
ws['!merges'] = mergeData;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
}
|
|
404
|
+
// Helper function to check if a cell is already part of a merge range
|
|
405
|
+
function isCellMerged(mergeData, cell) {
|
|
406
|
+
for (let merge of mergeData) {
|
|
407
|
+
if (
|
|
408
|
+
cell.r >= merge.s.r &&
|
|
409
|
+
cell.r <= merge.e.r &&
|
|
410
|
+
cell.c >= merge.s.c &&
|
|
411
|
+
cell.c <= merge.e.c
|
|
412
|
+
) {
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return false;
|
|
71
417
|
}
|
|
72
418
|
|
|
73
|
-
function merge_content(ws, tableData, spanColumnKeys,
|
|
419
|
+
function merge_content({ws, tableData, spanColumnKeys, startRow}) {
|
|
74
420
|
if (spanColumnKeys == null || spanColumnKeys.length === 0) {
|
|
75
421
|
return null;
|
|
76
422
|
}
|
|
@@ -85,7 +431,7 @@ function merge_content(ws, tableData, spanColumnKeys, titleLen) {
|
|
|
85
431
|
}
|
|
86
432
|
for (let i = 0; i < dLen; i++) {
|
|
87
433
|
for (let j = 0; j < kLen; j++) {
|
|
88
|
-
let merge = {s: {r: i +
|
|
434
|
+
let merge = {s: {r: i + startRow, c: j}, e: {r: i + startRow, c: j}}
|
|
89
435
|
flag = false
|
|
90
436
|
//如果单元格和右侧内容相同则合并
|
|
91
437
|
let n = 1;
|
|
@@ -105,7 +451,7 @@ function merge_content(ws, tableData, spanColumnKeys, titleLen) {
|
|
|
105
451
|
break
|
|
106
452
|
}
|
|
107
453
|
params[i + m][j].disable = true
|
|
108
|
-
merge.e.r = i +
|
|
454
|
+
merge.e.r = i + startRow + m
|
|
109
455
|
flag = true
|
|
110
456
|
m++;
|
|
111
457
|
}
|
|
@@ -118,7 +464,7 @@ function merge_content(ws, tableData, spanColumnKeys, titleLen) {
|
|
|
118
464
|
ws['!merges'] = ws['!merges'].concat(mergeData)
|
|
119
465
|
}
|
|
120
466
|
|
|
121
|
-
function add_style(ws, title) {
|
|
467
|
+
function add_style({ws, title, startRow, footerRow}) {
|
|
122
468
|
|
|
123
469
|
// 补充空白数据
|
|
124
470
|
let rangs = ws['!ref'].split(":");
|
|
@@ -127,7 +473,7 @@ function add_style(ws, title) {
|
|
|
127
473
|
Object.keys(ws).forEach(item => {
|
|
128
474
|
if (/^[A-Z]+\d+$/.test(item)) {
|
|
129
475
|
var alphabet = item.replace(/[^a-z]+/ig, "");
|
|
130
|
-
if (colhash.indexOf(alphabet)
|
|
476
|
+
if (colhash.indexOf(alphabet) === -1) {
|
|
131
477
|
colhash.push(alphabet)
|
|
132
478
|
for (var i = 1; i <= rowSum; i++) {
|
|
133
479
|
if (!ws.hasOwnProperty(alphabet + i)) {
|
|
@@ -141,55 +487,47 @@ function add_style(ws, title) {
|
|
|
141
487
|
}
|
|
142
488
|
})
|
|
143
489
|
|
|
144
|
-
let
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
150
|
-
},
|
|
151
|
-
alignment: {horizontal: "center", vertical: "center"},
|
|
152
|
-
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "5A9BD5"}}
|
|
153
|
-
}
|
|
154
|
-
let bodyPairStyle = {
|
|
155
|
-
border: {
|
|
156
|
-
left: {style: 'thin', color: {rgb: "000000"}},
|
|
157
|
-
top: {style: 'thin', color: {rgb: "000000"}},
|
|
158
|
-
right: {style: 'thin', color: {rgb: "000000"}},
|
|
159
|
-
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
160
|
-
},
|
|
161
|
-
alignment: {vertical: "center"},
|
|
162
|
-
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "DDEBF7"}}
|
|
163
|
-
}
|
|
164
|
-
let bodyStyle = {
|
|
165
|
-
border: {
|
|
166
|
-
left: {style: 'thin', color: {rgb: "000000"}},
|
|
167
|
-
top: {style: 'thin', color: {rgb: "000000"}},
|
|
168
|
-
right: {style: 'thin', color: {rgb: "000000"}},
|
|
169
|
-
bottom: {style: 'thin', color: {rgb: "000000"}},
|
|
170
|
-
},
|
|
171
|
-
alignment: {vertical: "center"}
|
|
172
|
-
}
|
|
173
|
-
Object.keys(ws).forEach(item => {
|
|
490
|
+
let titleReg = new RegExp("^[A-Z]1$", "im");
|
|
491
|
+
let titleExtReg = new RegExp("^[A-Z][1-" + parseInt(startRow>0?startRow:2) + "]$", "im");
|
|
492
|
+
let headReg = new RegExp("^[A-Z]+[" + parseInt(startRow + 1) + "-" + parseInt(startRow + title.length) + "]$", "im");
|
|
493
|
+
let bodyReg = new RegExp("^[A-Z]+([" + parseInt(startRow + title.length) + "-9]|[1-9]\\d+)$", "im");
|
|
494
|
+
let footerExtReg = null
|
|
174
495
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (reg.test(item)) {
|
|
180
|
-
ws[item].s = titlestyle
|
|
181
|
-
} else
|
|
496
|
+
if (footerRow === 1) {
|
|
497
|
+
// 底部扩展最后一行正则表达式 该行样式需要无边框
|
|
498
|
+
footerExtReg = new RegExp("^[A-Z]+" + rowSum + "$", "im");
|
|
499
|
+
}
|
|
182
500
|
|
|
501
|
+
Object.keys(ws).forEach(item => {
|
|
502
|
+
if(titleReg.test(item)&&startRow>0){
|
|
503
|
+
/**
|
|
504
|
+
* 加载标题样式:加粗,水平垂直居中,边框
|
|
505
|
+
*/
|
|
506
|
+
ws[item].s = titleStyle
|
|
507
|
+
}else if(titleExtReg.test(item)&&startRow>0){
|
|
508
|
+
/**
|
|
509
|
+
* 加载标题扩展信息样式:加粗,水平垂直居中,边框
|
|
510
|
+
*/
|
|
511
|
+
ws[item].s = bodyStyle
|
|
512
|
+
} else if (headReg.test(item)) {
|
|
513
|
+
/**
|
|
514
|
+
* 加载表头样式:蓝色背景,水平垂直居中,边框
|
|
515
|
+
*/
|
|
516
|
+
ws[item].s = headStyle
|
|
517
|
+
} else if (footerExtReg && footerExtReg.test(item)) {
|
|
518
|
+
/**
|
|
519
|
+
* 加载表尾样式:无边框,垂直居中
|
|
520
|
+
*/
|
|
521
|
+
ws[item].s = footerStyle
|
|
522
|
+
} else if (bodyReg.test(item)) {
|
|
183
523
|
/**
|
|
184
524
|
* 表体样式: 垂直居中,边框
|
|
185
525
|
*/
|
|
186
|
-
|
|
187
|
-
if (parseInt(item.replace(/[^0-9]/ig, "")) % 2 == 0) {
|
|
526
|
+
if (parseInt(item.replace(/[^0-9]/ig, "")) % 2 === 0) {
|
|
188
527
|
ws[item].s = bodyStyle
|
|
189
528
|
} else {
|
|
190
529
|
ws[item].s = bodyPairStyle
|
|
191
530
|
}
|
|
192
|
-
|
|
193
531
|
}
|
|
194
532
|
})
|
|
195
533
|
/* ws.B2 = {
|
|
@@ -200,210 +538,6 @@ function add_style(ws, title) {
|
|
|
200
538
|
|
|
201
539
|
}
|
|
202
540
|
|
|
203
|
-
function title_filter(data) {
|
|
204
|
-
let filterData = deepCopy(data);
|
|
205
|
-
for (var i = 0; i < filterData.length; i++) {
|
|
206
|
-
if ((filterData[i].hasOwnProperty('type') && filterData[i].type == typeRules[filterData[i].type]) ||
|
|
207
|
-
// !filterData[i].hasOwnProperty('title') ||
|
|
208
|
-
filterData[i].title == titleRules[filterData[i].title]) {
|
|
209
|
-
filterData.splice(i, 1)
|
|
210
|
-
i--
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return filterData
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function title_el_filter(data) {
|
|
217
|
-
let filterData = deepCopy(data);
|
|
218
|
-
|
|
219
|
-
for (var i = 0; i < filterData.length; i++) {
|
|
220
|
-
if ((filterData[i].hasOwnProperty('property') && filterData[i].property == typeRules[filterData[i].property]) ||
|
|
221
|
-
// !filterData[i].hasOwnProperty('title') ||
|
|
222
|
-
filterData[i].label == titleRules[filterData[i].label]) {
|
|
223
|
-
filterData.splice(i, 1)
|
|
224
|
-
i--
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return filterData
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function json_to_array(key, jsonData) {
|
|
231
|
-
return jsonData.map(v => key.map(j => {
|
|
232
|
-
return v[j]
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export const enums_to_value = (enums,jsonData)=>{
|
|
237
|
-
if(enums&&enums.length>0){
|
|
238
|
-
return jsonData.map(v => enums.map(e =>{
|
|
239
|
-
v[e.key] = e.enums[v[e.key]]
|
|
240
|
-
return v
|
|
241
|
-
})[0])
|
|
242
|
-
}else{
|
|
243
|
-
return jsonData
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// fix data,return string
|
|
248
|
-
function fixdata(data) {
|
|
249
|
-
let o = ''
|
|
250
|
-
let l = 0
|
|
251
|
-
const w = 10240
|
|
252
|
-
for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
|
|
253
|
-
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
|
|
254
|
-
return o
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// get head from excel file,return array
|
|
258
|
-
function get_header_row(sheet) {
|
|
259
|
-
const headers = []
|
|
260
|
-
const range = XLSX.utils.decode_range(sheet['!ref'])
|
|
261
|
-
let C
|
|
262
|
-
const R = range.s.r
|
|
263
|
-
/* start in the first row */
|
|
264
|
-
for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
|
|
265
|
-
var cell = sheet[XLSX.utils.encode_cell({c: C, r: R})]
|
|
266
|
-
/* find the cell in the first row */
|
|
267
|
-
var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
|
|
268
|
-
if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
|
|
269
|
-
headers.push(hdr)
|
|
270
|
-
}
|
|
271
|
-
return headers
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export const title_transform = (paramData) => {
|
|
275
|
-
let result = []
|
|
276
|
-
let data1 = []
|
|
277
|
-
let data2 = []
|
|
278
|
-
let flag = false
|
|
279
|
-
let data = title_filter(paramData)
|
|
280
|
-
// let data = paramData
|
|
281
|
-
for (var i = 0; i < data.length; i++) {
|
|
282
|
-
data1.push(data[i].title)
|
|
283
|
-
data2.push(data[i].title)
|
|
284
|
-
if ('children' in data[i]) {
|
|
285
|
-
flag = true
|
|
286
|
-
data2.pop()
|
|
287
|
-
let children = data[i].children
|
|
288
|
-
for (var j = 0; j < children.length; j++) {
|
|
289
|
-
data1.push(data[i].title)
|
|
290
|
-
data2.push(children[j].title)
|
|
291
|
-
}
|
|
292
|
-
data1.pop()
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
result.push(data1)
|
|
296
|
-
if (flag) {
|
|
297
|
-
result.push(data2)
|
|
298
|
-
}
|
|
299
|
-
return result
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
export const title_el_transform = (paramData) => {
|
|
304
|
-
let result = []
|
|
305
|
-
let data1 = []
|
|
306
|
-
let data2 = []
|
|
307
|
-
let flag = false
|
|
308
|
-
let data = title_el_filter(paramData)
|
|
309
|
-
// let data = paramData
|
|
310
|
-
for (var i = 0; i < data.length; i++) {
|
|
311
|
-
data1.push(data[i].label)
|
|
312
|
-
data2.push(data[i].label)
|
|
313
|
-
if ('children' in data[i]) {
|
|
314
|
-
flag = true
|
|
315
|
-
data2.pop()
|
|
316
|
-
let children = data[i].children
|
|
317
|
-
for (var j = 0; j < children.length; j++) {
|
|
318
|
-
data1.push(data[i].label)
|
|
319
|
-
data2.push(children[j].label)
|
|
320
|
-
}
|
|
321
|
-
data1.pop()
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
result.push(data1)
|
|
325
|
-
if (flag) {
|
|
326
|
-
result.push(data2)
|
|
327
|
-
}
|
|
328
|
-
return result
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
export const key_transform = (paramData) => {
|
|
332
|
-
let result = []
|
|
333
|
-
let data = title_filter(paramData)
|
|
334
|
-
// let data = paramData
|
|
335
|
-
for (var i = 0; i < data.length; i++) {
|
|
336
|
-
if ("children" in data[i]) {
|
|
337
|
-
let children = data[i].children
|
|
338
|
-
for (var j = 0; j < children.length; j++) {
|
|
339
|
-
result.push(children[j].key)
|
|
340
|
-
}
|
|
341
|
-
} else {
|
|
342
|
-
result.push(data[i].key)
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
return result
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
export const key_el_transform = (paramData) => {
|
|
349
|
-
let result = []
|
|
350
|
-
let data = title_el_filter(paramData)
|
|
351
|
-
// let data = paramData
|
|
352
|
-
for (var i = 0; i < data.length; i++) {
|
|
353
|
-
if ("children" in data[i]) {
|
|
354
|
-
let children = data[i].children
|
|
355
|
-
for (var j = 0; j < children.length; j++) {
|
|
356
|
-
result.push(children[j].property)
|
|
357
|
-
}
|
|
358
|
-
} else {
|
|
359
|
-
result.push(data[i].property)
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
return result
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export const enums_transform = (paramData) => {
|
|
366
|
-
let result = []
|
|
367
|
-
let data = title_filter(paramData)
|
|
368
|
-
// let data = paramData
|
|
369
|
-
for (var i = 0; i < data.length; i++) {
|
|
370
|
-
if ("children" in data[i]) {
|
|
371
|
-
let children = data[i].children
|
|
372
|
-
for (var j = 0; j < children.length; j++) {
|
|
373
|
-
if("enums" in children[j]){
|
|
374
|
-
result.push({key:children[j].key,enums:children[j].enums})
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
} else {
|
|
378
|
-
if("enums" in data[i]){
|
|
379
|
-
result.push({key:data[i].key,enums:data[i].enums})
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
return result
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
export const enums_el_transform = (paramData) => {
|
|
387
|
-
let result = []
|
|
388
|
-
let data = title_el_filter(paramData)
|
|
389
|
-
// let data = paramData
|
|
390
|
-
for (var i = 0; i < data.length; i++) {
|
|
391
|
-
if ("children" in data[i]) {
|
|
392
|
-
let children = data[i].children
|
|
393
|
-
for (var j = 0; j < children.length; j++) {
|
|
394
|
-
if("enums" in children[j]){
|
|
395
|
-
result.push({key:children[j].property,enums:children[j].enums})
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
} else {
|
|
399
|
-
if("enums" in data[i]){
|
|
400
|
-
result.push({key:data[i].property,enums:data[i].enums})
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
return result
|
|
405
|
-
}
|
|
406
|
-
|
|
407
541
|
export const export_table_to_excel = (id, filename) => {
|
|
408
542
|
const table = document.getElementById(id);
|
|
409
543
|
const wb = XLSX.utils.table_to_book(table);
|
|
@@ -417,6 +551,11 @@ export const export_table_to_excel = (id, filename) => {
|
|
|
417
551
|
// XLSX.writeFile(wb, filename);
|
|
418
552
|
}
|
|
419
553
|
|
|
554
|
+
function json_to_array(key, jsonData) {
|
|
555
|
+
return jsonData.map(v => key.map(j => {
|
|
556
|
+
return v[j]
|
|
557
|
+
}));
|
|
558
|
+
}
|
|
420
559
|
export const export_json_to_excel = ({data, key, title, filename, spanColumns, autoWidth, format}) => {
|
|
421
560
|
const wb = XLSX.utils.book_new();
|
|
422
561
|
const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: false});
|
|
@@ -427,46 +566,100 @@ export const export_json_to_excel = ({data, key, title, filename, spanColumns, a
|
|
|
427
566
|
const arr = json_to_array(key, data);
|
|
428
567
|
auto_width(ws, arr);
|
|
429
568
|
}
|
|
430
|
-
merge_content(ws, data, spanColumns)
|
|
431
|
-
XLSX.utils.book_append_sheet(wb, ws,
|
|
569
|
+
merge_content(ws, data, spanColumns, title.length)
|
|
570
|
+
XLSX.utils.book_append_sheet(wb, ws, '');
|
|
432
571
|
XLSX.writeFile(wb, filename + '.' + format);
|
|
433
572
|
}
|
|
434
573
|
|
|
435
|
-
export const export_array_to_excel = ({key, data, title, filename, spanColumns, autoWidth, format}) => {
|
|
574
|
+
export const export_array_to_excel = ({key, data, title, header = [], footer = [], filename, spanColumns, autoWidth, format}) => {
|
|
436
575
|
const wb = XLSX.utils.book_new();
|
|
437
|
-
|
|
438
|
-
console.log(arr)
|
|
576
|
+
let arr = json_to_array(key, data);
|
|
439
577
|
for (var i = title.length; i > 0; i--) {
|
|
440
578
|
arr.unshift(title[i - 1])
|
|
441
579
|
}
|
|
580
|
+
if(header){
|
|
581
|
+
arr = [...header,...arr]
|
|
582
|
+
}
|
|
583
|
+
if(footer){
|
|
584
|
+
arr = [...arr,...footer]
|
|
585
|
+
}
|
|
586
|
+
|
|
442
587
|
const ws = XLSX.utils.aoa_to_sheet(arr);
|
|
443
588
|
if (autoWidth) {
|
|
444
|
-
|
|
589
|
+
// 计算列宽时,查询条件行数据不参与计算
|
|
590
|
+
auto_width(ws, arr, header.length);
|
|
445
591
|
}
|
|
446
592
|
// 合并表头
|
|
447
593
|
if (!ws['!merges']) ws['!merges'] = [];
|
|
448
594
|
if (title.length > 1) {
|
|
449
|
-
|
|
595
|
+
merge_cell({ws, data:title, startRow: header.length})
|
|
596
|
+
}
|
|
597
|
+
merge_cell({ws,data:header,startRow: 0 })
|
|
598
|
+
merge_content(ws, data, spanColumns, title.length + header.length)
|
|
599
|
+
add_style({ws, title, startRow: header.length, footerRow: footer.length})
|
|
600
|
+
XLSX.utils.book_append_sheet(wb, ws, '');
|
|
601
|
+
if(format === 'csv'){
|
|
602
|
+
XLSX.writeFile(wb, filename + '.' + format,{
|
|
603
|
+
// 要生成的文件类型
|
|
604
|
+
bookType: "csv",
|
|
605
|
+
// // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
|
|
606
|
+
bookSST: false});
|
|
607
|
+
}else{
|
|
608
|
+
// XLSX.writeFileXLSX(wb, filename + '.' + format);
|
|
609
|
+
const workbookBlob = workbook2blob(wb);
|
|
610
|
+
saveAs(workbookBlob, filename + '.' + format);
|
|
450
611
|
}
|
|
451
|
-
merge_content(ws, data, spanColumns, title.length)
|
|
452
|
-
add_style(ws, title)
|
|
453
|
-
XLSX.utils.book_append_sheet(wb, ws, filename);
|
|
454
|
-
XLSX.writeFileXLSX(wb, filename + '.' + "xlsx");
|
|
455
612
|
}
|
|
456
613
|
|
|
614
|
+
/**
|
|
615
|
+
* 将一个字符串 s 转换为一个 ArrayBuffer 对象(如果可用)或一个普通数组(如果 ArrayBuffer 不可用)
|
|
616
|
+
* @param s
|
|
617
|
+
* @returns {any[]|ArrayBuffer}
|
|
618
|
+
*/
|
|
457
619
|
function s2ab(s) {
|
|
458
620
|
if (typeof ArrayBuffer !== 'undefined') {
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
for (
|
|
621
|
+
let buf = new ArrayBuffer(s.length);
|
|
622
|
+
let view = new Uint8Array(buf);
|
|
623
|
+
for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
|
|
462
624
|
return buf;
|
|
463
625
|
} else {
|
|
464
|
-
|
|
465
|
-
for (
|
|
626
|
+
let buf = new Array(s.length);
|
|
627
|
+
for (let i = 0; i !== s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
|
|
466
628
|
return buf;
|
|
467
629
|
}
|
|
468
630
|
}
|
|
469
631
|
|
|
632
|
+
/**
|
|
633
|
+
* 将一个 ArrayBuffer 或 TypedArray 对象转换为一个字符串
|
|
634
|
+
* @param data
|
|
635
|
+
* @returns {string}
|
|
636
|
+
*/
|
|
637
|
+
function ab2s(data) {
|
|
638
|
+
let o = ''
|
|
639
|
+
let l = 0
|
|
640
|
+
const w = 10240
|
|
641
|
+
for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
|
|
642
|
+
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
|
|
643
|
+
return o
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// 将workbook装化成blob对象
|
|
647
|
+
function workbook2blob(workbook) {
|
|
648
|
+
// 生成excel的配置项
|
|
649
|
+
const wopts = {
|
|
650
|
+
// 要生成的文件类型
|
|
651
|
+
bookType: "xlsx",
|
|
652
|
+
// // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
|
|
653
|
+
bookSST: false,
|
|
654
|
+
type: "binary"
|
|
655
|
+
};
|
|
656
|
+
let wbout = XLSXStyle.write(workbook, wopts);
|
|
657
|
+
let blob = new Blob([s2ab(wbout)], {
|
|
658
|
+
type: "application/octet-stream"
|
|
659
|
+
});
|
|
660
|
+
return blob;
|
|
661
|
+
}
|
|
662
|
+
|
|
470
663
|
export const saveAs = function(blob, fileName) {
|
|
471
664
|
// IE10+
|
|
472
665
|
if (window.navigator.msSaveOrOpenBlob) {
|
|
@@ -494,9 +687,26 @@ export const saveAs = function(blob, fileName) {
|
|
|
494
687
|
}
|
|
495
688
|
}
|
|
496
689
|
|
|
690
|
+
// get head from excel file,return array
|
|
691
|
+
function get_header_row(sheet) {
|
|
692
|
+
const headers = []
|
|
693
|
+
const range = XLSX.utils.decode_range(sheet['!ref'])
|
|
694
|
+
let C
|
|
695
|
+
const R = range.s.r
|
|
696
|
+
/* start in the first row */
|
|
697
|
+
for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
|
|
698
|
+
var cell = sheet[XLSX.utils.encode_cell({c: C, r: R})]
|
|
699
|
+
/* find the cell in the first row */
|
|
700
|
+
var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
|
|
701
|
+
if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
|
|
702
|
+
headers.push(hdr)
|
|
703
|
+
}
|
|
704
|
+
return headers
|
|
705
|
+
}
|
|
706
|
+
|
|
497
707
|
export const read = (data, type) => {
|
|
498
708
|
/* if type == 'base64' must fix data first */
|
|
499
|
-
// const fixedData =
|
|
709
|
+
// const fixedData = ab2s(data)
|
|
500
710
|
// const workbook = XLSX.read(btoa(fixedData), { type: 'base64' })
|
|
501
711
|
const workbook = XLSX.read(data, {type: type});
|
|
502
712
|
const firstSheetName = workbook.SheetNames[0];
|
|
@@ -512,10 +722,12 @@ export default {
|
|
|
512
722
|
export_json_to_excel,
|
|
513
723
|
key_transform,
|
|
514
724
|
key_el_transform,
|
|
725
|
+
key_vxe_transform,
|
|
515
726
|
title_transform,
|
|
516
727
|
title_el_transform,
|
|
517
728
|
enums_transform,
|
|
518
729
|
enums_el_transform,
|
|
730
|
+
enums_vxe_transform,
|
|
519
731
|
enums_to_value,
|
|
520
732
|
read,
|
|
521
733
|
s2ab,
|