@lambo-design/shared 1.0.0-beta.1
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 +25 -0
- package/config/env.js +4 -0
- package/config/index.js +3 -0
- package/config/themes/default/default.css +241 -0
- package/config/themes/default/default.less +319 -0
- package/config/themes/default/var.less +314 -0
- package/config/themes/gold/default.css +241 -0
- package/config/themes/gold/default.less +319 -0
- package/config/themes/gold/var.less +314 -0
- package/config/themes/index.js +10 -0
- package/config/themes/lime/default.css +241 -0
- package/config/themes/lime/default.less +319 -0
- package/config/themes/lime/var.less +314 -0
- package/config/themes/theme-default.js +252 -0
- package/config/themes/theme-gold.js +252 -0
- package/config/themes/theme-lime.js +252 -0
- package/index.js +3 -0
- package/package.json +20 -0
- package/styles/variables.less +21 -0
- package/utils/ajax/cacheconf.js +19 -0
- package/utils/ajax/index.js +12 -0
- package/utils/ajax/interceptors.js +90 -0
- package/utils/assist.js +79 -0
- package/utils/bus.js +3 -0
- package/utils/crypto/index.js +38 -0
- package/utils/crypto/md5.js +152 -0
- package/utils/crypto/sm3.js +235 -0
- package/utils/date.js +352 -0
- package/utils/dom.js +38 -0
- package/utils/excel.js +523 -0
- package/utils/index.js +5 -0
- package/utils/lodop.js +160 -0
- package/utils/modelerUtil.js +224 -0
- package/utils/number.js +123 -0
- package/utils/platform.js +519 -0
- package/utils/theme.js +43 -0
- package/utils/zoomScroll.js +9 -0
- package/vendor/xlsx-0.19.1.tgz +0 -0
package/utils/excel.js
ADDED
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import XLSX from 'xlsx';
|
|
3
|
+
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
|
|
4
|
+
XLSX.set_cptable(cpexcel);
|
|
5
|
+
import {deepCopy} from "./assist";
|
|
6
|
+
|
|
7
|
+
const titleRules = {
|
|
8
|
+
'': '',
|
|
9
|
+
'#': '#',
|
|
10
|
+
'序号': '序号',
|
|
11
|
+
'编号': '编号',
|
|
12
|
+
'操作': '操作',
|
|
13
|
+
}
|
|
14
|
+
const typeRules = {
|
|
15
|
+
'index': 'index',
|
|
16
|
+
'select': 'select',
|
|
17
|
+
'selection': 'selection',
|
|
18
|
+
'single-selection': 'single-selection'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function auto_width(ws, data) {
|
|
22
|
+
/*set worksheet max width per col*/
|
|
23
|
+
const colWidth = data.map(row => row.map(val => {
|
|
24
|
+
/*if null/undefined*/
|
|
25
|
+
if (val == null) {
|
|
26
|
+
return {'wch': 10};
|
|
27
|
+
}
|
|
28
|
+
/*if chinese*/
|
|
29
|
+
else if (val.toString().charCodeAt(0) > 255) {
|
|
30
|
+
return {'wch': val.toString().length * 2};
|
|
31
|
+
} else {
|
|
32
|
+
return {'wch': val.toString().length > 7 ? val.toString().length : 7};
|
|
33
|
+
}
|
|
34
|
+
}))
|
|
35
|
+
/*start in the first row*/
|
|
36
|
+
let result = colWidth[0];
|
|
37
|
+
for (let i = 1; i < colWidth.length; i++) {
|
|
38
|
+
for (let j = 0; j < colWidth[i].length; j++) {
|
|
39
|
+
if (result[j]['wch'] < colWidth[i][j]['wch']) {
|
|
40
|
+
result[j]['wch'] = colWidth[i][j]['wch'] > 7 ? colWidth[i][j]['wch'] : 7;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
ws['!cols'] = result;
|
|
45
|
+
}
|
|
46
|
+
|
|
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
|
|
59
|
+
}
|
|
60
|
+
while ((i + col) < title.length && title[i][j] === title[i + col][j]) {
|
|
61
|
+
merge.e.r = i + col
|
|
62
|
+
col++
|
|
63
|
+
flag = true
|
|
64
|
+
}
|
|
65
|
+
if (flag) {
|
|
66
|
+
mergeData.push(merge)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ws['!merges'] = ws['!merges'].concat(mergeData)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function merge_content(ws, tableData, spanColumnKeys, titleLen) {
|
|
74
|
+
if (spanColumnKeys == null || spanColumnKeys.length === 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
let flag = false
|
|
78
|
+
let mergeData = []
|
|
79
|
+
let sck = spanColumnKeys, dLen = tableData.length, kLen = sck.length, params = [];
|
|
80
|
+
for (let i = 0; i < dLen; i++) {
|
|
81
|
+
params[i] = []
|
|
82
|
+
for (let j = 0; j < kLen; j++) {
|
|
83
|
+
params[i][j] = {}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (let i = 0; i < dLen; i++) {
|
|
87
|
+
for (let j = 0; j < kLen; j++) {
|
|
88
|
+
let merge = {s: {r: i + titleLen, c: j}, e: {r: i + titleLen, c: j}}
|
|
89
|
+
flag = false
|
|
90
|
+
//如果单元格和右侧内容相同则合并
|
|
91
|
+
let n = 1;
|
|
92
|
+
while (j + n < kLen && tableData[i][sck[j]] === tableData[i][sck[j + n]]) {
|
|
93
|
+
if (params[i][j + n].hasOwnProperty('disable')) {
|
|
94
|
+
break
|
|
95
|
+
}
|
|
96
|
+
params[i][j + n].disable = true
|
|
97
|
+
merge.e.c = j + n
|
|
98
|
+
flag = true
|
|
99
|
+
n++;
|
|
100
|
+
}
|
|
101
|
+
//如果单元格和下侧内容相同则合并
|
|
102
|
+
let m = 1;
|
|
103
|
+
while (i + m < dLen && tableData[i][sck[j]] === tableData[i + m][sck[j]] && tableData[i + m][sck[j]] !== '小计') {
|
|
104
|
+
if (params[i + m][j].hasOwnProperty('disable')) {
|
|
105
|
+
break
|
|
106
|
+
}
|
|
107
|
+
params[i + m][j].disable = true
|
|
108
|
+
merge.e.r = i + titleLen + m
|
|
109
|
+
flag = true
|
|
110
|
+
m++;
|
|
111
|
+
}
|
|
112
|
+
if (flag) {
|
|
113
|
+
mergeData.push(merge)
|
|
114
|
+
params[i][j].disable = true
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
ws['!merges'] = ws['!merges'].concat(mergeData)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function add_style(ws, title) {
|
|
122
|
+
|
|
123
|
+
// 补充空白数据
|
|
124
|
+
let rangs = ws['!ref'].split(":");
|
|
125
|
+
let rowSum = parseInt(rangs[1].replace(/[^0-9]/ig, ""))
|
|
126
|
+
let colhash = []
|
|
127
|
+
Object.keys(ws).forEach(item => {
|
|
128
|
+
if (/^[A-Z]+\d+$/.test(item)) {
|
|
129
|
+
var alphabet = item.replace(/[^a-z]+/ig, "");
|
|
130
|
+
if (colhash.indexOf(alphabet) == -1) {
|
|
131
|
+
colhash.push(alphabet)
|
|
132
|
+
for (var i = 1; i <= rowSum; i++) {
|
|
133
|
+
if (!ws.hasOwnProperty(alphabet + i)) {
|
|
134
|
+
ws[alphabet + i] = {
|
|
135
|
+
v: '',
|
|
136
|
+
t: 's'
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
|
|
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 => {
|
|
174
|
+
|
|
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
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* 表体样式: 垂直居中,边框
|
|
185
|
+
*/
|
|
186
|
+
if (/^[A-Z]+\d+$/.test(item)) {
|
|
187
|
+
if (parseInt(item.replace(/[^0-9]/ig, "")) % 2 == 0) {
|
|
188
|
+
ws[item].s = bodyStyle
|
|
189
|
+
} else {
|
|
190
|
+
ws[item].s = bodyPairStyle
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
/* ws.B2 = {
|
|
196
|
+
v:'',
|
|
197
|
+
t:'s',
|
|
198
|
+
s:bodyPairStyle
|
|
199
|
+
}*/
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
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
|
+
export const export_table_to_excel = (id, filename) => {
|
|
408
|
+
const table = document.getElementById(id);
|
|
409
|
+
const wb = XLSX.utils.table_to_book(table);
|
|
410
|
+
XLSX.writeFile(wb, filename + ".xlsx");
|
|
411
|
+
|
|
412
|
+
/* the second way */
|
|
413
|
+
// const table = document.getElementById(id);
|
|
414
|
+
// const wb = XLSX.utils.book_new();
|
|
415
|
+
// const ws = XLSX.utils.table_to_sheet(table);
|
|
416
|
+
// XLSX.utils.book_append_sheet(wb, ws, filename);
|
|
417
|
+
// XLSX.writeFile(wb, filename);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export const export_json_to_excel = ({data, key, title, filename, spanColumns, autoWidth, format}) => {
|
|
421
|
+
const wb = XLSX.utils.book_new();
|
|
422
|
+
const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: false});
|
|
423
|
+
for (var i = title.length; i > 0; i--) {
|
|
424
|
+
data.unshift(title[i - 1])
|
|
425
|
+
}
|
|
426
|
+
if (autoWidth) {
|
|
427
|
+
const arr = json_to_array(key, data);
|
|
428
|
+
auto_width(ws, arr);
|
|
429
|
+
}
|
|
430
|
+
merge_content(ws, data, spanColumns)
|
|
431
|
+
XLSX.utils.book_append_sheet(wb, ws, filename);
|
|
432
|
+
XLSX.writeFile(wb, filename + '.' + format);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
export const export_array_to_excel = ({key, data, title, filename, spanColumns, autoWidth, format}) => {
|
|
436
|
+
const wb = XLSX.utils.book_new();
|
|
437
|
+
const arr = json_to_array(key, data);
|
|
438
|
+
console.log(arr)
|
|
439
|
+
for (var i = title.length; i > 0; i--) {
|
|
440
|
+
arr.unshift(title[i - 1])
|
|
441
|
+
}
|
|
442
|
+
const ws = XLSX.utils.aoa_to_sheet(arr);
|
|
443
|
+
if (autoWidth) {
|
|
444
|
+
auto_width(ws, arr);
|
|
445
|
+
}
|
|
446
|
+
// 合并表头
|
|
447
|
+
if (!ws['!merges']) ws['!merges'] = [];
|
|
448
|
+
if (title.length > 1) {
|
|
449
|
+
merge_title(ws, title)
|
|
450
|
+
}
|
|
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
|
+
}
|
|
456
|
+
|
|
457
|
+
function s2ab(s) {
|
|
458
|
+
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;
|
|
462
|
+
return buf;
|
|
463
|
+
} else {
|
|
464
|
+
var buf = new Array(s.length);
|
|
465
|
+
for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
|
|
466
|
+
return buf;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export const saveAs = function(blob, fileName) {
|
|
471
|
+
// IE10+
|
|
472
|
+
if (window.navigator.msSaveOrOpenBlob) {
|
|
473
|
+
navigator.msSaveBlob(blob, fileName)
|
|
474
|
+
} else {
|
|
475
|
+
if (typeof blob == "object" && blob instanceof Blob) {
|
|
476
|
+
blob = URL.createObjectURL(blob); // 创建blob地址
|
|
477
|
+
}
|
|
478
|
+
let aLink = document.createElement("a");
|
|
479
|
+
aLink.href = blob;
|
|
480
|
+
// HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
|
|
481
|
+
aLink.download = fileName || "下载";
|
|
482
|
+
let event;
|
|
483
|
+
if (window.MouseEvent) event = new MouseEvent("click");
|
|
484
|
+
//移动端
|
|
485
|
+
else {
|
|
486
|
+
event = document.createEvent("MouseEvents");
|
|
487
|
+
event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
|
488
|
+
}
|
|
489
|
+
aLink.dispatchEvent(event);
|
|
490
|
+
setTimeout(function () {
|
|
491
|
+
aLink.remove();
|
|
492
|
+
URL.revokeObjectURL(blob);
|
|
493
|
+
}, 100);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export const read = (data, type) => {
|
|
498
|
+
/* if type == 'base64' must fix data first */
|
|
499
|
+
// const fixedData = fixdata(data)
|
|
500
|
+
// const workbook = XLSX.read(btoa(fixedData), { type: 'base64' })
|
|
501
|
+
const workbook = XLSX.read(data, {type: type});
|
|
502
|
+
const firstSheetName = workbook.SheetNames[0];
|
|
503
|
+
const worksheet = workbook.Sheets[firstSheetName];
|
|
504
|
+
const header = get_header_row(worksheet);
|
|
505
|
+
const results = XLSX.utils.sheet_to_json(worksheet);
|
|
506
|
+
return {header, results};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
export default {
|
|
510
|
+
export_table_to_excel,
|
|
511
|
+
export_array_to_excel,
|
|
512
|
+
export_json_to_excel,
|
|
513
|
+
key_transform,
|
|
514
|
+
key_el_transform,
|
|
515
|
+
title_transform,
|
|
516
|
+
title_el_transform,
|
|
517
|
+
enums_transform,
|
|
518
|
+
enums_el_transform,
|
|
519
|
+
enums_to_value,
|
|
520
|
+
read,
|
|
521
|
+
s2ab,
|
|
522
|
+
saveAs
|
|
523
|
+
}
|
package/utils/index.js
ADDED
package/utils/lodop.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
var CreatedOKLodop7766 = null, CLodopIsLocal;
|
|
2
|
+
|
|
3
|
+
//====判断是否需要 Web打印服务CLodop:===
|
|
4
|
+
//===(不支持插件的浏览器版本需要用它)===
|
|
5
|
+
function needCLodop() {
|
|
6
|
+
try {
|
|
7
|
+
var ua = navigator.userAgent;
|
|
8
|
+
if (ua.match(/Windows\sPhone/i))
|
|
9
|
+
return true;
|
|
10
|
+
if (ua.match(/iPhone|iPod|iPad/i))
|
|
11
|
+
return true;
|
|
12
|
+
if (ua.match(/Android/i))
|
|
13
|
+
return true;
|
|
14
|
+
if (ua.match(/Edge\D?\d+/i))
|
|
15
|
+
return true;
|
|
16
|
+
|
|
17
|
+
var verTrident = ua.match(/Trident\D?\d+/i);
|
|
18
|
+
var verIE = ua.match(/MSIE\D?\d+/i);
|
|
19
|
+
var verOPR = ua.match(/OPR\D?\d+/i);
|
|
20
|
+
var verFF = ua.match(/Firefox\D?\d+/i);
|
|
21
|
+
var x64 = ua.match(/x64/i);
|
|
22
|
+
if ((!verTrident) && (!verIE) && (x64))
|
|
23
|
+
return true;
|
|
24
|
+
else if (verFF) {
|
|
25
|
+
verFF = verFF[0].match(/\d+/);
|
|
26
|
+
if ((verFF[0] >= 41) || (x64))
|
|
27
|
+
return true;
|
|
28
|
+
} else if (verOPR) {
|
|
29
|
+
verOPR = verOPR[0].match(/\d+/);
|
|
30
|
+
if (verOPR[0] >= 32)
|
|
31
|
+
return true;
|
|
32
|
+
} else if ((!verTrident) && (!verIE)) {
|
|
33
|
+
var verChrome = ua.match(/Chrome\D?\d+/i);
|
|
34
|
+
if (verChrome) {
|
|
35
|
+
verChrome = verChrome[0].match(/\d+/);
|
|
36
|
+
if (verChrome[0] >= 41)
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//====页面引用CLodop云打印必须的JS文件,用双端口(8000和18000)避免其中某个被占用:====
|
|
47
|
+
if (needCLodop()) {
|
|
48
|
+
var src1 = "http://localhost:8000/CLodopfuncs.js?priority=1";
|
|
49
|
+
var src2 = "http://localhost:18000/CLodopfuncs.js?priority=0";
|
|
50
|
+
|
|
51
|
+
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
|
52
|
+
var oscript = document.createElement("script");
|
|
53
|
+
oscript.src = src1;
|
|
54
|
+
head.insertBefore(oscript, head.firstChild);
|
|
55
|
+
oscript = document.createElement("script");
|
|
56
|
+
oscript.src = src2;
|
|
57
|
+
head.insertBefore(oscript, head.firstChild);
|
|
58
|
+
CLodopIsLocal = !!((src1 + src2).match(/\/\/localho|\/\/127.0.0./i));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//====获取LODOP对象的主过程:====
|
|
62
|
+
export function getLodop(oOBJECT, oEMBED) {
|
|
63
|
+
// var printHint = "<div class='print-hint' ></div>"
|
|
64
|
+
// printHint.className = 'print-hint'
|
|
65
|
+
var strHtmInstall = "<div >打印控件未安装!点击这里<a href='file/install_lodop32.exe' target='view_window'>执行安装</a>,安装后请刷新页面或重新进入。</div>";
|
|
66
|
+
var strHtmUpdate = "<div >打印控件需要升级!点击这里<a href='file/install_lodop32.exe' target='view_window'>执行升级</a>,升级后请重新进入。</div>";
|
|
67
|
+
var strHtm64_Install = "<div >打印控件未安装!点击这里<a href='file/install_lodop64.exe' target='view_window'>执行安装</a>,安装后请刷新页面或重新进入。</div>";
|
|
68
|
+
var strHtm64_Update = "<div >打印控件需要升级!点击这里<a href='file/install_lodop64.exe' target='view_window'>执行升级</a>,升级后请重新进入。</div>";
|
|
69
|
+
var strHtmFireFox = "<div >(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</div>";
|
|
70
|
+
var strHtmChrome = "<div >(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</div>";
|
|
71
|
+
var strCLodopInstall_1 = "<div >Web打印服务CLodop未安装启动,点击这里<a href='file/CLodop_Setup_for_Win32NT.exe' target='view_window'>下载执行安装</a></div>";
|
|
72
|
+
var strCLodopInstall_2 = "<div >(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
|
|
73
|
+
var strCLodopInstall_3 = ",成功后请刷新本页面。</div>";
|
|
74
|
+
var strCLodopUpdate = "<div >Web打印服务CLodop需升级!点击这里<a href='file/CLodop_Setup_for_Win32NT.exe' target='view_window'>执行升级</a>,升级后请刷新页面。</div>";
|
|
75
|
+
var LODOP;
|
|
76
|
+
try {
|
|
77
|
+
var ua = navigator.userAgent;
|
|
78
|
+
var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
|
|
79
|
+
if (needCLodop()) {
|
|
80
|
+
try {
|
|
81
|
+
LODOP = getCLodop();
|
|
82
|
+
} catch (err) {
|
|
83
|
+
}
|
|
84
|
+
if (!LODOP && document.readyState !== "complete") {
|
|
85
|
+
alert("网页还没下载完毕,请稍等一下再操作.");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!LODOP) {
|
|
89
|
+
let info = "<div class='print-hint'>" + (strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : "") + strCLodopInstall_3) + "</div>";
|
|
90
|
+
let html = document.getElementById("app").innerHTML
|
|
91
|
+
document.getElementById("app").innerHTML = info + html
|
|
92
|
+
return;
|
|
93
|
+
} else {
|
|
94
|
+
if (CLODOP.CVERSION < "3.0.7.5") {
|
|
95
|
+
let info = "<div class='print-hint'>" + strCLodopUpdate + "</div>";
|
|
96
|
+
let html = document.getElementById("app").innerHTML
|
|
97
|
+
document.getElementById("app").innerHTML = info + html
|
|
98
|
+
// document.body.innerHTML = strCLodopUpdate + document.body.innerHTML;
|
|
99
|
+
}
|
|
100
|
+
if (oEMBED && oEMBED.parentNode)
|
|
101
|
+
oEMBED.parentNode.removeChild(oEMBED);
|
|
102
|
+
if (oOBJECT && oOBJECT.parentNode)
|
|
103
|
+
oOBJECT.parentNode.removeChild(oOBJECT);
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
var is64IE = isIE && !!(ua.match(/x64/i));
|
|
107
|
+
//=====如果页面有Lodop就直接使用,没有则新建:==========
|
|
108
|
+
if (oOBJECT || oEMBED) {
|
|
109
|
+
if (isIE)
|
|
110
|
+
LODOP = oOBJECT;
|
|
111
|
+
else
|
|
112
|
+
LODOP = oEMBED;
|
|
113
|
+
} else if (!CreatedOKLodop7766) {
|
|
114
|
+
LODOP = document.createElement("object");
|
|
115
|
+
LODOP.setAttribute("width", 0);
|
|
116
|
+
LODOP.setAttribute("height", 0);
|
|
117
|
+
LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
|
|
118
|
+
if (isIE)
|
|
119
|
+
LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
|
|
120
|
+
else
|
|
121
|
+
LODOP.setAttribute("type", "application/x-print-lodop");
|
|
122
|
+
document.documentElement.appendChild(LODOP);
|
|
123
|
+
CreatedOKLodop7766 = LODOP;
|
|
124
|
+
} else
|
|
125
|
+
LODOP = CreatedOKLodop7766;
|
|
126
|
+
//=====Lodop插件未安装时提示下载地址:==========
|
|
127
|
+
if ((!LODOP) || (!LODOP.VERSION)) {
|
|
128
|
+
if (ua.indexOf('Chrome') >= 0) {
|
|
129
|
+
let info = "<div class='print-hint'>" + strHtmChrome + "</div>";
|
|
130
|
+
let html = document.getElementById("app").innerHTML
|
|
131
|
+
document.getElementById("app").innerHTML = info + html
|
|
132
|
+
}
|
|
133
|
+
if (ua.indexOf('Firefox') >= 0) {
|
|
134
|
+
let info = "<div class='print-hint'>" + strHtmFireFox + "</div>";
|
|
135
|
+
let html = document.getElementById("app").innerHTML
|
|
136
|
+
document.getElementById("app").innerHTML = info + html
|
|
137
|
+
}
|
|
138
|
+
let info = "<div class='print-hint'>" + (is64IE ? strHtm64_Install : strHtmInstall) + "</div>";
|
|
139
|
+
let html = document.getElementById("app").innerHTML
|
|
140
|
+
document.getElementById("app").innerHTML = info + html
|
|
141
|
+
return LODOP;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (LODOP.VERSION < "6.2.2.6") {
|
|
145
|
+
if (!needCLodop()) {
|
|
146
|
+
let info = "<div class='print-hint'>" + (is64IE ? strHtm64_Update : strHtmUpdate) + "</div>";
|
|
147
|
+
let html = document.getElementById("app").innerHTML
|
|
148
|
+
document.getElementById("app").innerHTML = info + html
|
|
149
|
+
}
|
|
150
|
+
return LODOP;
|
|
151
|
+
}
|
|
152
|
+
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):==
|
|
153
|
+
LODOP.SET_LICENSES("浪潮软件股份有限公司", "E06FBED5C95F9D41C185E57C393C53F6AE2", "浪潮軟件股份有限公司", "410D0FEB0AABCBD335D53B757C0BF007CFE");
|
|
154
|
+
LODOP.SET_LICENSES("THIRD LICENSE", "", "Inspur software Co., Ltd", "DB58BD6748AE0A151B3648415F61251084E");
|
|
155
|
+
//=======================================================
|
|
156
|
+
return LODOP;
|
|
157
|
+
} catch (err) {
|
|
158
|
+
alert("getLodop出错:" + err);
|
|
159
|
+
}
|
|
160
|
+
}
|