@lambo-design/shared 1.0.0-beta.36 → 1.0.0-beta.361

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