@corbe30/fortune-excel 1.0.3
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/.github/workflows/main.yml +30 -0
- package/.github/workflows/publish.yml +30 -0
- package/.storybook/main.ts +18 -0
- package/.storybook/preview.ts +15 -0
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/HandleZip.d.ts +8 -0
- package/dist/HandleZip.js +37 -0
- package/dist/ICommon.d.ts +34 -0
- package/dist/ICommon.js +1 -0
- package/dist/ToExcel/ExcelBorder.d.ts +3 -0
- package/dist/ToExcel/ExcelBorder.js +1412 -0
- package/dist/ToExcel/ExcelConvert.d.ts +16 -0
- package/dist/ToExcel/ExcelConvert.js +92 -0
- package/dist/ToExcel/ExcelFile.d.ts +1 -0
- package/dist/ToExcel/ExcelFile.js +30 -0
- package/dist/ToExcel/ExcelImage.d.ts +2 -0
- package/dist/ToExcel/ExcelImage.js +64 -0
- package/dist/ToExcel/ExcelStyle.d.ts +3 -0
- package/dist/ToExcel/ExcelStyle.js +53 -0
- package/dist/ToFortuneSheet/FortuneBase.d.ts +133 -0
- package/dist/ToFortuneSheet/FortuneBase.js +28 -0
- package/dist/ToFortuneSheet/FortuneCell.d.ts +25 -0
- package/dist/ToFortuneSheet/FortuneCell.js +782 -0
- package/dist/ToFortuneSheet/FortuneFile.d.ts +50 -0
- package/dist/ToFortuneSheet/FortuneFile.js +432 -0
- package/dist/ToFortuneSheet/FortuneImage.d.ts +20 -0
- package/dist/ToFortuneSheet/FortuneImage.js +51 -0
- package/dist/ToFortuneSheet/FortuneSheet.d.ts +36 -0
- package/dist/ToFortuneSheet/FortuneSheet.js +581 -0
- package/dist/ToFortuneSheet/IFortune.d.ts +301 -0
- package/dist/ToFortuneSheet/IFortune.js +1 -0
- package/dist/ToFortuneSheet/ReadXml.d.ts +61 -0
- package/dist/ToFortuneSheet/ReadXml.js +337 -0
- package/dist/common/constant.d.ts +25 -0
- package/dist/common/constant.js +277 -0
- package/dist/common/emf.d.ts +3 -0
- package/dist/common/emf.js +1294 -0
- package/dist/common/method.d.ts +132 -0
- package/dist/common/method.js +1075 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +24 -0
- package/package.json +47 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,1075 @@
|
|
|
1
|
+
import { columeHeader_word, columeHeader_word_index } from "./constant.js";
|
|
2
|
+
export function getRangetxt(range, sheettxt) {
|
|
3
|
+
let row0 = range["row"][0], row1 = range["row"][1];
|
|
4
|
+
let column0 = range["column"][0], column1 = range["column"][1];
|
|
5
|
+
if (row0 == null && row1 == null) {
|
|
6
|
+
return sheettxt + chatatABC(column0) + ":" + chatatABC(column1);
|
|
7
|
+
}
|
|
8
|
+
else if (column0 == null && column1 == null) {
|
|
9
|
+
return sheettxt + (row0 + 1) + ":" + (row1 + 1);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
if (column0 == column1 && row0 == row1) {
|
|
13
|
+
return sheettxt + chatatABC(column0) + (row0 + 1);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return (sheettxt +
|
|
17
|
+
chatatABC(column0) +
|
|
18
|
+
(row0 + 1) +
|
|
19
|
+
":" +
|
|
20
|
+
chatatABC(column1) +
|
|
21
|
+
(row1 + 1));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function getcellrange(txt, sheets = {}, sheetId = "1") {
|
|
26
|
+
let val = txt.split("!");
|
|
27
|
+
let sheettxt = "", rangetxt = "", sheetIndex = -1;
|
|
28
|
+
if (val.length > 1) {
|
|
29
|
+
sheettxt = val[0];
|
|
30
|
+
rangetxt = val[1];
|
|
31
|
+
let si = sheets[sheettxt];
|
|
32
|
+
if (si == null) {
|
|
33
|
+
sheetIndex = parseInt(sheetId);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
sheetIndex = parseInt(si);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
sheetIndex = parseInt(sheetId);
|
|
41
|
+
rangetxt = val[0];
|
|
42
|
+
}
|
|
43
|
+
if (rangetxt.indexOf(":") == -1) {
|
|
44
|
+
let row = parseInt(rangetxt.replace(/[^0-9]/g, "")) - 1;
|
|
45
|
+
let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, ""));
|
|
46
|
+
if (!isNaN(row) && !isNaN(col)) {
|
|
47
|
+
return {
|
|
48
|
+
row: [row, row],
|
|
49
|
+
column: [col, col],
|
|
50
|
+
sheetIndex: sheetIndex,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
let rangetxtArray = rangetxt.split(":");
|
|
59
|
+
let row = [], col = [];
|
|
60
|
+
row[0] = parseInt(rangetxtArray[0].replace(/[^0-9]/g, "")) - 1;
|
|
61
|
+
row[1] = parseInt(rangetxtArray[1].replace(/[^0-9]/g, "")) - 1;
|
|
62
|
+
// if (isNaN(row[0])) {
|
|
63
|
+
// row[0] = 0;
|
|
64
|
+
// }
|
|
65
|
+
// if (isNaN(row[1])) {
|
|
66
|
+
// row[1] = sheetdata.length - 1;
|
|
67
|
+
// }
|
|
68
|
+
if (row[0] > row[1]) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
col[0] = ABCatNum(rangetxtArray[0].replace(/[^A-Za-z]/g, ""));
|
|
72
|
+
col[1] = ABCatNum(rangetxtArray[1].replace(/[^A-Za-z]/g, ""));
|
|
73
|
+
// if (isNaN(col[0])) {
|
|
74
|
+
// col[0] = 0;
|
|
75
|
+
// }
|
|
76
|
+
// if (isNaN(col[1])) {
|
|
77
|
+
// col[1] = sheetdata[0].length - 1;
|
|
78
|
+
// }
|
|
79
|
+
if (col[0] > col[1]) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
row: row,
|
|
84
|
+
column: col,
|
|
85
|
+
sheetIndex: sheetIndex,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//列下标 字母转数字
|
|
90
|
+
function ABCatNum(abc) {
|
|
91
|
+
abc = abc.toUpperCase();
|
|
92
|
+
let abc_len = abc.length;
|
|
93
|
+
if (abc_len == 0) {
|
|
94
|
+
return NaN;
|
|
95
|
+
}
|
|
96
|
+
let abc_array = abc.split("");
|
|
97
|
+
let wordlen = columeHeader_word.length;
|
|
98
|
+
let ret = 0;
|
|
99
|
+
for (let i = abc_len - 1; i >= 0; i--) {
|
|
100
|
+
if (i == abc_len - 1) {
|
|
101
|
+
ret += columeHeader_word_index[abc_array[i]];
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
ret +=
|
|
105
|
+
Math.pow(wordlen, abc_len - i - 1) *
|
|
106
|
+
(columeHeader_word_index[abc_array[i]] + 1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return ret;
|
|
110
|
+
}
|
|
111
|
+
//列下标 数字转字母
|
|
112
|
+
function chatatABC(index) {
|
|
113
|
+
let wordlen = columeHeader_word.length;
|
|
114
|
+
if (index < wordlen) {
|
|
115
|
+
return columeHeader_word[index];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
let last = 0, pre = 0, ret = "";
|
|
119
|
+
let i = 1, n = 0;
|
|
120
|
+
while (index >= (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i++) - 1)) {
|
|
121
|
+
n = i;
|
|
122
|
+
}
|
|
123
|
+
let index_ab = index - (wordlen / (wordlen - 1)) * (Math.pow(wordlen, n - 1) - 1); //970
|
|
124
|
+
last = index_ab + 1;
|
|
125
|
+
for (let x = n; x > 0; x--) {
|
|
126
|
+
let last1 = last, x1 = x; //-702=268, 3
|
|
127
|
+
if (x == 1) {
|
|
128
|
+
last1 = last1 % wordlen;
|
|
129
|
+
if (last1 == 0) {
|
|
130
|
+
last1 = 26;
|
|
131
|
+
}
|
|
132
|
+
return ret + columeHeader_word[last1 - 1];
|
|
133
|
+
}
|
|
134
|
+
last1 = Math.ceil(last1 / Math.pow(wordlen, x - 1));
|
|
135
|
+
//last1 = last1 % wordlen;
|
|
136
|
+
ret += columeHeader_word[last1 - 1];
|
|
137
|
+
if (x > 1) {
|
|
138
|
+
last = last - (last1 - 1) * wordlen;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @return ratio, default 0.75 1in = 2.54cm = 25.4mm = 72pt = 6pc, pt = 1/72 In, px = 1/dpi In
|
|
145
|
+
*/
|
|
146
|
+
export function getptToPxRatioByDPI() {
|
|
147
|
+
return 72 / 96;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @emus EMUs, Excel drawing unit
|
|
151
|
+
* @return pixel
|
|
152
|
+
*/
|
|
153
|
+
export function getPxByEMUs(emus) {
|
|
154
|
+
if (emus == null) {
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
let inch = emus / 914400;
|
|
158
|
+
let pt = inch * 72;
|
|
159
|
+
let px = pt / getptToPxRatioByDPI();
|
|
160
|
+
return px;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* @dom xml attribute object
|
|
164
|
+
* @attr attribute name
|
|
165
|
+
* @d if attribute is null, return default value
|
|
166
|
+
* @return attribute value
|
|
167
|
+
*/
|
|
168
|
+
export function getXmlAttibute(dom, attr, d) {
|
|
169
|
+
let value = dom[attr];
|
|
170
|
+
value = value == null ? d : value;
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @columnWidth Excel column width
|
|
175
|
+
* @return pixel column width
|
|
176
|
+
*/
|
|
177
|
+
export function getColumnWidthPixel(columnWidth) {
|
|
178
|
+
let pix = Math.round((columnWidth - 0.83) * 8 + 5);
|
|
179
|
+
return pix;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @rowHeight Excel row height
|
|
183
|
+
* @return pixel row height
|
|
184
|
+
*/
|
|
185
|
+
export function getRowHeightPixel(rowHeight) {
|
|
186
|
+
let pix = Math.round(rowHeight / getptToPxRatioByDPI());
|
|
187
|
+
return pix;
|
|
188
|
+
}
|
|
189
|
+
export function LightenDarkenColor(sixColor, tint) {
|
|
190
|
+
let hex = sixColor.substring(sixColor.length - 6, sixColor.length);
|
|
191
|
+
let rgbArray = hexToRgbArray("#" + hex);
|
|
192
|
+
let hslArray = rgbToHsl(rgbArray[0], rgbArray[1], rgbArray[2]);
|
|
193
|
+
if (tint > 0) {
|
|
194
|
+
hslArray[2] = hslArray[2] * (1.0 - tint) + tint;
|
|
195
|
+
}
|
|
196
|
+
else if (tint < 0) {
|
|
197
|
+
hslArray[2] = hslArray[2] * (1.0 + tint);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return "#" + hex;
|
|
201
|
+
}
|
|
202
|
+
let newRgbArray = hslToRgb(hslArray[0], hslArray[1], hslArray[2]);
|
|
203
|
+
return rgbToHex("RGB(" + newRgbArray.join(",") + ")");
|
|
204
|
+
}
|
|
205
|
+
function rgbToHex(rgb) {
|
|
206
|
+
//十六进制颜色值的正则表达式
|
|
207
|
+
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
208
|
+
// 如果是rgb颜色表示
|
|
209
|
+
if (/^(rgb|RGB)/.test(rgb)) {
|
|
210
|
+
var aColor = rgb.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|
211
|
+
var strHex = "#";
|
|
212
|
+
for (var i = 0; i < aColor.length; i++) {
|
|
213
|
+
var hex = Number(aColor[i]).toString(16);
|
|
214
|
+
if (hex.length < 2) {
|
|
215
|
+
hex = "0" + hex;
|
|
216
|
+
}
|
|
217
|
+
strHex += hex;
|
|
218
|
+
}
|
|
219
|
+
if (strHex.length !== 7) {
|
|
220
|
+
strHex = rgb;
|
|
221
|
+
}
|
|
222
|
+
return strHex;
|
|
223
|
+
}
|
|
224
|
+
else if (reg.test(rgb)) {
|
|
225
|
+
var aNum = rgb.replace(/#/, "").split("");
|
|
226
|
+
if (aNum.length === 6) {
|
|
227
|
+
return rgb;
|
|
228
|
+
}
|
|
229
|
+
else if (aNum.length === 3) {
|
|
230
|
+
var numHex = "#";
|
|
231
|
+
for (var i = 0; i < aNum.length; i += 1) {
|
|
232
|
+
numHex += aNum[i] + aNum[i];
|
|
233
|
+
}
|
|
234
|
+
return numHex;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return rgb;
|
|
238
|
+
}
|
|
239
|
+
function hexToRgb(hex) {
|
|
240
|
+
var sColor = hex.toLowerCase();
|
|
241
|
+
//十六进制颜色值的正则表达式
|
|
242
|
+
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
243
|
+
// 如果是16进制颜色
|
|
244
|
+
if (sColor && reg.test(sColor)) {
|
|
245
|
+
if (sColor.length === 4) {
|
|
246
|
+
var sColorNew = "#";
|
|
247
|
+
for (var i = 1; i < 4; i += 1) {
|
|
248
|
+
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|
249
|
+
}
|
|
250
|
+
sColor = sColorNew;
|
|
251
|
+
}
|
|
252
|
+
//处理六位的颜色值
|
|
253
|
+
var sColorChange = [];
|
|
254
|
+
for (var i = 1; i < 7; i += 2) {
|
|
255
|
+
sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
|
|
256
|
+
}
|
|
257
|
+
return "RGB(" + sColorChange.join(",") + ")";
|
|
258
|
+
}
|
|
259
|
+
return sColor;
|
|
260
|
+
}
|
|
261
|
+
function hexToRgbArray(hex) {
|
|
262
|
+
var sColor = hex.toLowerCase();
|
|
263
|
+
//十六进制颜色值的正则表达式
|
|
264
|
+
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
265
|
+
// 如果是16进制颜色
|
|
266
|
+
if (sColor && reg.test(sColor)) {
|
|
267
|
+
if (sColor.length === 4) {
|
|
268
|
+
var sColorNew = "#";
|
|
269
|
+
for (var i = 1; i < 4; i += 1) {
|
|
270
|
+
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|
271
|
+
}
|
|
272
|
+
sColor = sColorNew;
|
|
273
|
+
}
|
|
274
|
+
//处理六位的颜色值
|
|
275
|
+
var sColorChange = [];
|
|
276
|
+
for (var i = 1; i < 7; i += 2) {
|
|
277
|
+
sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
|
|
278
|
+
}
|
|
279
|
+
return sColorChange;
|
|
280
|
+
}
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* HSL颜色值转换为RGB.
|
|
285
|
+
* 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space.
|
|
286
|
+
* h, s, 和 l 设定在 [0, 1] 之间
|
|
287
|
+
* 返回的 r, g, 和 b 在 [0, 255]之间
|
|
288
|
+
*
|
|
289
|
+
* @param Number h 色相
|
|
290
|
+
* @param Number s 饱和度
|
|
291
|
+
* @param Number l 亮度
|
|
292
|
+
* @return Array RGB色值数值
|
|
293
|
+
*/
|
|
294
|
+
function hslToRgb(h, s, l) {
|
|
295
|
+
var r, g, b;
|
|
296
|
+
if (s == 0) {
|
|
297
|
+
r = g = b = l; // achromatic
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
var hue2rgb = function hue2rgb(p, q, t) {
|
|
301
|
+
if (t < 0)
|
|
302
|
+
t += 1;
|
|
303
|
+
if (t > 1)
|
|
304
|
+
t -= 1;
|
|
305
|
+
if (t < 1 / 6)
|
|
306
|
+
return p + (q - p) * 6 * t;
|
|
307
|
+
if (t < 1 / 2)
|
|
308
|
+
return q;
|
|
309
|
+
if (t < 2 / 3)
|
|
310
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
311
|
+
return p;
|
|
312
|
+
};
|
|
313
|
+
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
314
|
+
var p = 2 * l - q;
|
|
315
|
+
r = hue2rgb(p, q, h + 1 / 3);
|
|
316
|
+
g = hue2rgb(p, q, h);
|
|
317
|
+
b = hue2rgb(p, q, h - 1 / 3);
|
|
318
|
+
}
|
|
319
|
+
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* RGB 颜色值转换为 HSL.
|
|
323
|
+
* 转换公式参考自 http://en.wikipedia.org/wiki/HSL_color_space.
|
|
324
|
+
* r, g, 和 b 需要在 [0, 255] 范围内
|
|
325
|
+
* 返回的 h, s, 和 l 在 [0, 1] 之间
|
|
326
|
+
*
|
|
327
|
+
* @param Number r 红色色值
|
|
328
|
+
* @param Number g 绿色色值
|
|
329
|
+
* @param Number b 蓝色色值
|
|
330
|
+
* @return Array HSL各值数组
|
|
331
|
+
*/
|
|
332
|
+
function rgbToHsl(r, g, b) {
|
|
333
|
+
(r /= 255), (g /= 255), (b /= 255);
|
|
334
|
+
var max = Math.max(r, g, b), min = Math.min(r, g, b);
|
|
335
|
+
var h, s, l = (max + min) / 2;
|
|
336
|
+
if (max == min) {
|
|
337
|
+
h = s = 0; // achromatic
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
var d = max - min;
|
|
341
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
342
|
+
switch (max) {
|
|
343
|
+
case r:
|
|
344
|
+
h = (g - b) / d + (g < b ? 6 : 0);
|
|
345
|
+
break;
|
|
346
|
+
case g:
|
|
347
|
+
h = (b - r) / d + 2;
|
|
348
|
+
break;
|
|
349
|
+
case b:
|
|
350
|
+
h = (r - g) / d + 4;
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
h /= 6;
|
|
354
|
+
}
|
|
355
|
+
return [h, s, l];
|
|
356
|
+
}
|
|
357
|
+
export function generateRandomIndex(prefix) {
|
|
358
|
+
if (prefix == null) {
|
|
359
|
+
prefix = "Sheet";
|
|
360
|
+
}
|
|
361
|
+
let userAgent = window.navigator.userAgent
|
|
362
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
363
|
+
.split("");
|
|
364
|
+
let mid = "";
|
|
365
|
+
for (let i = 0; i < 5; i++) {
|
|
366
|
+
mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];
|
|
367
|
+
}
|
|
368
|
+
let time = new Date().getTime();
|
|
369
|
+
return prefix + "_" + mid + "_" + time;
|
|
370
|
+
}
|
|
371
|
+
export function escapeCharacter(str) {
|
|
372
|
+
if (str == null || str.length == 0) {
|
|
373
|
+
return str;
|
|
374
|
+
}
|
|
375
|
+
return str
|
|
376
|
+
.replace(/&/g, "&")
|
|
377
|
+
.replace(/"/g, '"')
|
|
378
|
+
.replace(/</g, "<")
|
|
379
|
+
.replace(/>/g, ">")
|
|
380
|
+
.replace(/ /g, " ")
|
|
381
|
+
.replace(/'/g, "'")
|
|
382
|
+
.replace(/¡/g, "¡")
|
|
383
|
+
.replace(/¢/g, "¢")
|
|
384
|
+
.replace(/£/g, "£")
|
|
385
|
+
.replace(/¤/g, "¤")
|
|
386
|
+
.replace(/¥/g, "¥")
|
|
387
|
+
.replace(/¦/g, "¦")
|
|
388
|
+
.replace(/§/g, "§")
|
|
389
|
+
.replace(/¨/g, "¨")
|
|
390
|
+
.replace(/©/g, "©")
|
|
391
|
+
.replace(/ª/g, "ª")
|
|
392
|
+
.replace(/«/g, "«")
|
|
393
|
+
.replace(/¬/g, "¬")
|
|
394
|
+
.replace(/­/g, "")
|
|
395
|
+
.replace(/®/g, "®")
|
|
396
|
+
.replace(/¯/g, "¯")
|
|
397
|
+
.replace(/°/g, "°")
|
|
398
|
+
.replace(/±/g, "±")
|
|
399
|
+
.replace(/²/g, "²")
|
|
400
|
+
.replace(/³/g, "³")
|
|
401
|
+
.replace(/´/g, "´")
|
|
402
|
+
.replace(/µ/g, "µ")
|
|
403
|
+
.replace(/¶/g, "¶")
|
|
404
|
+
.replace(/·/g, "·")
|
|
405
|
+
.replace(/¸/g, "¸")
|
|
406
|
+
.replace(/¹/g, "¹")
|
|
407
|
+
.replace(/º/g, "º")
|
|
408
|
+
.replace(/»/g, "»")
|
|
409
|
+
.replace(/¼/g, "¼")
|
|
410
|
+
.replace(/½/g, "½")
|
|
411
|
+
.replace(/¾/g, "¾")
|
|
412
|
+
.replace(/¿/g, "¿")
|
|
413
|
+
.replace(/×/g, "×")
|
|
414
|
+
.replace(/÷/g, "÷")
|
|
415
|
+
.replace(/À/g, "À")
|
|
416
|
+
.replace(/Á/g, "Á")
|
|
417
|
+
.replace(/Â/g, "Â")
|
|
418
|
+
.replace(/Ã/g, "Ã")
|
|
419
|
+
.replace(/Ä/g, "Ä")
|
|
420
|
+
.replace(/Å/g, "Å")
|
|
421
|
+
.replace(/Æ/g, "Æ")
|
|
422
|
+
.replace(/Ç/g, "Ç")
|
|
423
|
+
.replace(/È/g, "È")
|
|
424
|
+
.replace(/É/g, "É")
|
|
425
|
+
.replace(/Ê/g, "Ê")
|
|
426
|
+
.replace(/Ë/g, "Ë")
|
|
427
|
+
.replace(/Ì/g, "Ì")
|
|
428
|
+
.replace(/Í/g, "Í")
|
|
429
|
+
.replace(/Î/g, "Î")
|
|
430
|
+
.replace(/Ï/g, "Ï")
|
|
431
|
+
.replace(/Ð/g, "Ð")
|
|
432
|
+
.replace(/Ñ/g, "Ñ")
|
|
433
|
+
.replace(/Ò/g, "Ò")
|
|
434
|
+
.replace(/Ó/g, "Ó")
|
|
435
|
+
.replace(/Ô/g, "Ô")
|
|
436
|
+
.replace(/Õ/g, "Õ")
|
|
437
|
+
.replace(/Ö/g, "Ö")
|
|
438
|
+
.replace(/Ø/g, "Ø")
|
|
439
|
+
.replace(/Ù/g, "Ù")
|
|
440
|
+
.replace(/Ú/g, "Ú")
|
|
441
|
+
.replace(/Û/g, "Û")
|
|
442
|
+
.replace(/Ü/g, "Ü")
|
|
443
|
+
.replace(/Ý/g, "Ý")
|
|
444
|
+
.replace(/Þ/g, "Þ")
|
|
445
|
+
.replace(/ß/g, "ß")
|
|
446
|
+
.replace(/à/g, "à")
|
|
447
|
+
.replace(/á/g, "á")
|
|
448
|
+
.replace(/â/g, "â")
|
|
449
|
+
.replace(/ã/g, "ã")
|
|
450
|
+
.replace(/ä/g, "ä")
|
|
451
|
+
.replace(/å/g, "å")
|
|
452
|
+
.replace(/æ/g, "æ")
|
|
453
|
+
.replace(/ç/g, "ç")
|
|
454
|
+
.replace(/è/g, "è")
|
|
455
|
+
.replace(/é/g, "é")
|
|
456
|
+
.replace(/ê/g, "ê")
|
|
457
|
+
.replace(/ë/g, "ë")
|
|
458
|
+
.replace(/ì/g, "ì")
|
|
459
|
+
.replace(/í/g, "í")
|
|
460
|
+
.replace(/î/g, "î")
|
|
461
|
+
.replace(/ï/g, "ï")
|
|
462
|
+
.replace(/ð/g, "ð")
|
|
463
|
+
.replace(/ñ/g, "ñ")
|
|
464
|
+
.replace(/ò/g, "ò")
|
|
465
|
+
.replace(/ó/g, "ó")
|
|
466
|
+
.replace(/ô/g, "ô")
|
|
467
|
+
.replace(/õ/g, "õ")
|
|
468
|
+
.replace(/ö/g, "ö")
|
|
469
|
+
.replace(/ø/g, "ø")
|
|
470
|
+
.replace(/ù/g, "ù")
|
|
471
|
+
.replace(/ú/g, "ú")
|
|
472
|
+
.replace(/û/g, "û")
|
|
473
|
+
.replace(/ü/g, "ü")
|
|
474
|
+
.replace(/ý/g, "ý")
|
|
475
|
+
.replace(/þ/g, "þ")
|
|
476
|
+
.replace(/ÿ/g, "ÿ");
|
|
477
|
+
}
|
|
478
|
+
export class fromulaRef {
|
|
479
|
+
static trim(str) {
|
|
480
|
+
if (str == null) {
|
|
481
|
+
str = "";
|
|
482
|
+
}
|
|
483
|
+
return str.replace(/(^\s*)|(\s*$)/g, "");
|
|
484
|
+
}
|
|
485
|
+
static functionCopy(txt, mode, step) {
|
|
486
|
+
let _this = this;
|
|
487
|
+
if (_this.operatorjson == null) {
|
|
488
|
+
let arr = _this.operator.split("|"), op = {};
|
|
489
|
+
for (let i = 0; i < arr.length; i++) {
|
|
490
|
+
op[arr[i].toString()] = 1;
|
|
491
|
+
}
|
|
492
|
+
_this.operatorjson = op;
|
|
493
|
+
}
|
|
494
|
+
if (mode == null) {
|
|
495
|
+
mode = "down";
|
|
496
|
+
}
|
|
497
|
+
if (step == null) {
|
|
498
|
+
step = 1;
|
|
499
|
+
}
|
|
500
|
+
if (txt.substr(0, 1) == "=") {
|
|
501
|
+
txt = txt.substr(1);
|
|
502
|
+
}
|
|
503
|
+
let funcstack = txt.split("");
|
|
504
|
+
let i = 0, str = "", function_str = "", ispassby = true;
|
|
505
|
+
let matchConfig = {
|
|
506
|
+
bracket: 0,
|
|
507
|
+
comma: 0,
|
|
508
|
+
squote: 0,
|
|
509
|
+
dquote: 0,
|
|
510
|
+
};
|
|
511
|
+
while (i < funcstack.length) {
|
|
512
|
+
let s = funcstack[i];
|
|
513
|
+
if (s == "(" && matchConfig.dquote == 0) {
|
|
514
|
+
matchConfig.bracket += 1;
|
|
515
|
+
if (str.length > 0) {
|
|
516
|
+
function_str += str + "(";
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
function_str += "(";
|
|
520
|
+
}
|
|
521
|
+
str = "";
|
|
522
|
+
}
|
|
523
|
+
else if (s == ")" && matchConfig.dquote == 0) {
|
|
524
|
+
matchConfig.bracket -= 1;
|
|
525
|
+
function_str += _this.functionCopy(str, mode, step) + ")";
|
|
526
|
+
str = "";
|
|
527
|
+
}
|
|
528
|
+
else if (s == '"' && matchConfig.squote == 0) {
|
|
529
|
+
if (matchConfig.dquote > 0) {
|
|
530
|
+
function_str += str + '"';
|
|
531
|
+
matchConfig.dquote -= 1;
|
|
532
|
+
str = "";
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
matchConfig.dquote += 1;
|
|
536
|
+
str += '"';
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
else if (s == "," && matchConfig.dquote == 0) {
|
|
540
|
+
function_str += _this.functionCopy(str, mode, step) + ",";
|
|
541
|
+
str = "";
|
|
542
|
+
}
|
|
543
|
+
else if (s == "&" && matchConfig.dquote == 0) {
|
|
544
|
+
if (str.length > 0) {
|
|
545
|
+
function_str += _this.functionCopy(str, mode, step) + "&";
|
|
546
|
+
str = "";
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
function_str += "&";
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
else if (s in _this.operatorjson && matchConfig.dquote == 0) {
|
|
553
|
+
let s_next = "";
|
|
554
|
+
if (i + 1 < funcstack.length) {
|
|
555
|
+
s_next = funcstack[i + 1];
|
|
556
|
+
}
|
|
557
|
+
let p = i - 1, s_pre = null;
|
|
558
|
+
if (p >= 0) {
|
|
559
|
+
do {
|
|
560
|
+
s_pre = funcstack[p--];
|
|
561
|
+
} while (p >= 0 && s_pre == " ");
|
|
562
|
+
}
|
|
563
|
+
if (s + s_next in _this.operatorjson) {
|
|
564
|
+
if (str.length > 0) {
|
|
565
|
+
function_str += _this.functionCopy(str, mode, step) + s + s_next;
|
|
566
|
+
str = "";
|
|
567
|
+
}
|
|
568
|
+
else {
|
|
569
|
+
function_str += s + s_next;
|
|
570
|
+
}
|
|
571
|
+
i++;
|
|
572
|
+
}
|
|
573
|
+
else if (!/[^0-9]/.test(s_next) &&
|
|
574
|
+
s == "-" &&
|
|
575
|
+
(s_pre == "(" ||
|
|
576
|
+
s_pre == null ||
|
|
577
|
+
s_pre == "," ||
|
|
578
|
+
s_pre == " " ||
|
|
579
|
+
s_pre in _this.operatorjson)) {
|
|
580
|
+
str += s;
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
if (str.length > 0) {
|
|
584
|
+
function_str += _this.functionCopy(str, mode, step) + s;
|
|
585
|
+
str = "";
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
function_str += s;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
str += s;
|
|
594
|
+
}
|
|
595
|
+
if (i == funcstack.length - 1) {
|
|
596
|
+
if (_this.iscelldata(_this.trim(str))) {
|
|
597
|
+
if (mode == "down") {
|
|
598
|
+
function_str += _this.downparam(_this.trim(str), step);
|
|
599
|
+
}
|
|
600
|
+
else if (mode == "up") {
|
|
601
|
+
function_str += _this.upparam(_this.trim(str), step);
|
|
602
|
+
}
|
|
603
|
+
else if (mode == "left") {
|
|
604
|
+
function_str += _this.leftparam(_this.trim(str), step);
|
|
605
|
+
}
|
|
606
|
+
else if (mode == "right") {
|
|
607
|
+
function_str += _this.rightparam(_this.trim(str), step);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
function_str += _this.trim(str);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
i++;
|
|
615
|
+
}
|
|
616
|
+
return function_str;
|
|
617
|
+
}
|
|
618
|
+
static downparam(txt, step) {
|
|
619
|
+
return this.updateparam("d", txt, step);
|
|
620
|
+
}
|
|
621
|
+
static upparam(txt, step) {
|
|
622
|
+
return this.updateparam("u", txt, step);
|
|
623
|
+
}
|
|
624
|
+
static leftparam(txt, step) {
|
|
625
|
+
return this.updateparam("l", txt, step);
|
|
626
|
+
}
|
|
627
|
+
static rightparam(txt, step) {
|
|
628
|
+
return this.updateparam("r", txt, step);
|
|
629
|
+
}
|
|
630
|
+
static updateparam(orient, txt, step) {
|
|
631
|
+
let _this = this;
|
|
632
|
+
let val = txt.split("!"), rangetxt, prefix = "";
|
|
633
|
+
if (val.length > 1) {
|
|
634
|
+
rangetxt = val[1];
|
|
635
|
+
prefix = val[0] + "!";
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
rangetxt = val[0];
|
|
639
|
+
}
|
|
640
|
+
if (rangetxt.indexOf(":") == -1) {
|
|
641
|
+
let row = parseInt(rangetxt.replace(/[^0-9]/g, ""));
|
|
642
|
+
let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, ""));
|
|
643
|
+
let freezonFuc = _this.isfreezonFuc(rangetxt);
|
|
644
|
+
let $row = freezonFuc[0] ? "$" : "", $col = freezonFuc[1] ? "$" : "";
|
|
645
|
+
if (orient == "u" && !freezonFuc[0]) {
|
|
646
|
+
row -= step;
|
|
647
|
+
}
|
|
648
|
+
else if (orient == "r" && !freezonFuc[1]) {
|
|
649
|
+
col += step;
|
|
650
|
+
}
|
|
651
|
+
else if (orient == "l" && !freezonFuc[1]) {
|
|
652
|
+
col -= step;
|
|
653
|
+
}
|
|
654
|
+
else if (!freezonFuc[0]) {
|
|
655
|
+
row += step;
|
|
656
|
+
}
|
|
657
|
+
if (row < 0 || col < 0) {
|
|
658
|
+
return _this.error.r;
|
|
659
|
+
}
|
|
660
|
+
if (!isNaN(row) && !isNaN(col)) {
|
|
661
|
+
return prefix + $col + chatatABC(col) + $row + row;
|
|
662
|
+
}
|
|
663
|
+
else if (!isNaN(row)) {
|
|
664
|
+
return prefix + $row + row;
|
|
665
|
+
}
|
|
666
|
+
else if (!isNaN(col)) {
|
|
667
|
+
return prefix + $col + chatatABC(col);
|
|
668
|
+
}
|
|
669
|
+
else {
|
|
670
|
+
return txt;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
rangetxt = rangetxt.split(":");
|
|
675
|
+
let row = [], col = [];
|
|
676
|
+
row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, ""));
|
|
677
|
+
row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, ""));
|
|
678
|
+
if (row[0] > row[1]) {
|
|
679
|
+
return txt;
|
|
680
|
+
}
|
|
681
|
+
col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, ""));
|
|
682
|
+
col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, ""));
|
|
683
|
+
if (col[0] > col[1]) {
|
|
684
|
+
return txt;
|
|
685
|
+
}
|
|
686
|
+
let freezonFuc0 = _this.isfreezonFuc(rangetxt[0]);
|
|
687
|
+
let freezonFuc1 = _this.isfreezonFuc(rangetxt[1]);
|
|
688
|
+
let $row0 = freezonFuc0[0] ? "$" : "", $col0 = freezonFuc0[1] ? "$" : "";
|
|
689
|
+
let $row1 = freezonFuc1[0] ? "$" : "", $col1 = freezonFuc1[1] ? "$" : "";
|
|
690
|
+
if (orient == "u") {
|
|
691
|
+
if (!freezonFuc0[0]) {
|
|
692
|
+
row[0] -= step;
|
|
693
|
+
}
|
|
694
|
+
if (!freezonFuc1[0]) {
|
|
695
|
+
row[1] -= step;
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
else if (orient == "r") {
|
|
699
|
+
if (!freezonFuc0[1]) {
|
|
700
|
+
col[0] += step;
|
|
701
|
+
}
|
|
702
|
+
if (!freezonFuc1[1]) {
|
|
703
|
+
col[1] += step;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
else if (orient == "l") {
|
|
707
|
+
if (!freezonFuc0[1]) {
|
|
708
|
+
col[0] -= step;
|
|
709
|
+
}
|
|
710
|
+
if (!freezonFuc1[1]) {
|
|
711
|
+
col[1] -= step;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
if (!freezonFuc0[0]) {
|
|
716
|
+
row[0] += step;
|
|
717
|
+
}
|
|
718
|
+
if (!freezonFuc1[0]) {
|
|
719
|
+
row[1] += step;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
if (row[0] < 0 || col[0] < 0) {
|
|
723
|
+
return _this.error.r;
|
|
724
|
+
}
|
|
725
|
+
if (isNaN(col[0]) && isNaN(col[1])) {
|
|
726
|
+
return prefix + $row0 + row[0] + ":" + $row1 + row[1];
|
|
727
|
+
}
|
|
728
|
+
else if (isNaN(row[0]) && isNaN(row[1])) {
|
|
729
|
+
return (prefix + $col0 + chatatABC(col[0]) + ":" + $col1 + chatatABC(col[1]));
|
|
730
|
+
}
|
|
731
|
+
else {
|
|
732
|
+
return (prefix +
|
|
733
|
+
$col0 +
|
|
734
|
+
chatatABC(col[0]) +
|
|
735
|
+
$row0 +
|
|
736
|
+
row[0] +
|
|
737
|
+
":" +
|
|
738
|
+
$col1 +
|
|
739
|
+
chatatABC(col[1]) +
|
|
740
|
+
$row1 +
|
|
741
|
+
row[1]);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
static iscelldata(txt) {
|
|
746
|
+
//判断是否为单元格格式
|
|
747
|
+
let val = txt.split("!"), rangetxt;
|
|
748
|
+
if (val.length > 1) {
|
|
749
|
+
rangetxt = val[1];
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
rangetxt = val[0];
|
|
753
|
+
}
|
|
754
|
+
let reg_cell = /^(([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+))$/g; //增加正则判断单元格为字母+数字的格式:如 A1:B3
|
|
755
|
+
let reg_cellRange = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+))))$/g; //增加正则判断单元格为字母+数字或字母的格式:如 A1:B3,A:A
|
|
756
|
+
if (rangetxt.indexOf(":") == -1) {
|
|
757
|
+
let row = parseInt(rangetxt.replace(/[^0-9]/g, "")) - 1;
|
|
758
|
+
let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, ""));
|
|
759
|
+
if (!isNaN(row) && !isNaN(col) && rangetxt.toString().match(reg_cell)) {
|
|
760
|
+
return true;
|
|
761
|
+
}
|
|
762
|
+
else if (!isNaN(row)) {
|
|
763
|
+
return false;
|
|
764
|
+
}
|
|
765
|
+
else if (!isNaN(col)) {
|
|
766
|
+
return false;
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
reg_cellRange =
|
|
774
|
+
/^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+)))|((([0-9]+)|([$][0-9]+s))))$/g;
|
|
775
|
+
rangetxt = rangetxt.split(":");
|
|
776
|
+
let row = [], col = [];
|
|
777
|
+
row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, "")) - 1;
|
|
778
|
+
row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, "")) - 1;
|
|
779
|
+
if (row[0] > row[1]) {
|
|
780
|
+
return false;
|
|
781
|
+
}
|
|
782
|
+
col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, ""));
|
|
783
|
+
col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, ""));
|
|
784
|
+
if (col[0] > col[1]) {
|
|
785
|
+
return false;
|
|
786
|
+
}
|
|
787
|
+
if (rangetxt[0].toString().match(reg_cellRange) &&
|
|
788
|
+
rangetxt[1].toString().match(reg_cellRange)) {
|
|
789
|
+
return true;
|
|
790
|
+
}
|
|
791
|
+
else {
|
|
792
|
+
return false;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
static isfreezonFuc(txt) {
|
|
797
|
+
let row = txt.replace(/[^0-9]/g, "");
|
|
798
|
+
let col = txt.replace(/[^A-Za-z]/g, "");
|
|
799
|
+
let row$ = txt.substr(txt.indexOf(row) - 1, 1);
|
|
800
|
+
let col$ = txt.substr(txt.indexOf(col) - 1, 1);
|
|
801
|
+
let ret = [false, false];
|
|
802
|
+
if (row$ == "$") {
|
|
803
|
+
ret[0] = true;
|
|
804
|
+
}
|
|
805
|
+
if (col$ == "$") {
|
|
806
|
+
ret[1] = true;
|
|
807
|
+
}
|
|
808
|
+
return ret;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
fromulaRef.operator = "==|!=|<>|<=|>=|=|+|-|>|<|/|*|%|&|^";
|
|
812
|
+
fromulaRef.error = {
|
|
813
|
+
v: "#VALUE!", //错误的参数或运算符
|
|
814
|
+
n: "#NAME?", //公式名称错误
|
|
815
|
+
na: "#N/A", //函数或公式中没有可用数值
|
|
816
|
+
r: "#REF!", //删除了由其他公式引用的单元格
|
|
817
|
+
d: "#DIV/0!", //除数是0或空单元格
|
|
818
|
+
nm: "#NUM!", //当公式或函数中某个数字有问题时
|
|
819
|
+
nl: "#NULL!", //交叉运算符(空格)使用不正确
|
|
820
|
+
sp: "#SPILL!", //数组范围有其它值
|
|
821
|
+
};
|
|
822
|
+
fromulaRef.operatorjson = null;
|
|
823
|
+
export function isChinese(temp) {
|
|
824
|
+
var re = /[^\u4e00-\u9fa5]/;
|
|
825
|
+
var reg = /[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/;
|
|
826
|
+
if (reg.test(temp))
|
|
827
|
+
return true;
|
|
828
|
+
if (re.test(temp))
|
|
829
|
+
return false;
|
|
830
|
+
return true;
|
|
831
|
+
}
|
|
832
|
+
export function isJapanese(temp) {
|
|
833
|
+
var re = /[^\u0800-\u4e00]/;
|
|
834
|
+
if (re.test(temp))
|
|
835
|
+
return false;
|
|
836
|
+
return true;
|
|
837
|
+
}
|
|
838
|
+
export function isKoera(chr) {
|
|
839
|
+
if ((chr > 0x3130 && chr < 0x318f) || (chr >= 0xac00 && chr <= 0xd7a3)) {
|
|
840
|
+
return true;
|
|
841
|
+
}
|
|
842
|
+
return false;
|
|
843
|
+
}
|
|
844
|
+
export function isContainMultiType(str) {
|
|
845
|
+
let isUnicode = false;
|
|
846
|
+
if (escape(str).indexOf("%u") > -1) {
|
|
847
|
+
isUnicode = true;
|
|
848
|
+
}
|
|
849
|
+
let isNot = false;
|
|
850
|
+
let reg = /[0-9a-z]/gi;
|
|
851
|
+
if (reg.test(str)) {
|
|
852
|
+
isNot = true;
|
|
853
|
+
}
|
|
854
|
+
let reEnSign = /[\x00-\xff]+/g;
|
|
855
|
+
if (reEnSign.test(str)) {
|
|
856
|
+
isNot = true;
|
|
857
|
+
}
|
|
858
|
+
if (isUnicode && isNot) {
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
863
|
+
/**
|
|
864
|
+
* multi sequence conversion
|
|
865
|
+
* example:
|
|
866
|
+
* 1、E14 -> 13_4
|
|
867
|
+
* 2、E14 J14 O14 T14 Y14 AD14 AI14 AN14 AS14 AX14 ->
|
|
868
|
+
* ['13_4', '13_9','13_14', '13_19', '13_24', '13_3', '13_8', '13_13', '13_18', '13_23']
|
|
869
|
+
* 3、E46:E47 -> ['45_4', '46_4']
|
|
870
|
+
*
|
|
871
|
+
* @param {string} sqref - before sequence
|
|
872
|
+
* @returns {string[]}
|
|
873
|
+
*/
|
|
874
|
+
export function getMultiSequenceToNum(sqref) {
|
|
875
|
+
if (!sqref || (sqref === null || sqref === void 0 ? void 0 : sqref.length) <= 0)
|
|
876
|
+
return [];
|
|
877
|
+
sqref = sqref.toUpperCase();
|
|
878
|
+
let sqrefRawArr = sqref.split(" ");
|
|
879
|
+
let sqrefArr = sqrefRawArr.filter((e) => e && e.trim());
|
|
880
|
+
let sqrefLastArr = getSqrefRawArrFormat(sqrefArr);
|
|
881
|
+
let resArr = [];
|
|
882
|
+
for (let i = 0; i < sqrefLastArr.length; i++) {
|
|
883
|
+
let _res = getSingleSequenceToNum(sqrefLastArr[i]);
|
|
884
|
+
if (_res)
|
|
885
|
+
resArr.push(_res);
|
|
886
|
+
}
|
|
887
|
+
return resArr;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* get region sequence
|
|
891
|
+
* example:
|
|
892
|
+
* 1、[A1:C2'] -> ['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
|
|
893
|
+
*
|
|
894
|
+
* @param {string[]} arr - formats arr
|
|
895
|
+
* @returns {string[]} - after arr
|
|
896
|
+
*/
|
|
897
|
+
export function getRegionSequence(arr) {
|
|
898
|
+
var _a, _b;
|
|
899
|
+
let formatArr = [];
|
|
900
|
+
const regEn = new RegExp(/[A-Z]+|[0-9]+/g);
|
|
901
|
+
const startArr = (_a = arr[0]) === null || _a === void 0 ? void 0 : _a.match(regEn);
|
|
902
|
+
const lastArr = (_b = arr[1]) === null || _b === void 0 ? void 0 : _b.match(regEn);
|
|
903
|
+
const columnMax = Math.max(...[ABCatNum(startArr[0]), ABCatNum(lastArr[0])]);
|
|
904
|
+
const columnMin = Math.min(...[ABCatNum(startArr[0]), ABCatNum(lastArr[0])]);
|
|
905
|
+
const rowMax = Math.max(...[parseInt(startArr[1]), parseInt(lastArr[1])]);
|
|
906
|
+
const rowMin = Math.min(...[parseInt(startArr[1]), parseInt(lastArr[1])]);
|
|
907
|
+
for (let i = columnMin; i <= columnMax; i++) {
|
|
908
|
+
for (let j = rowMin; j <= rowMax; j++) {
|
|
909
|
+
formatArr.push(`${chatatABC(i)}${j}`);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
return formatArr;
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* unified processing of conversion formats
|
|
916
|
+
* example:
|
|
917
|
+
* 1、['E38', 'A1:C2'] -> ['E38', 'A1', 'A2', 'B1', 'B2', 'C1', 'C2']
|
|
918
|
+
*
|
|
919
|
+
* @param {string[]} arr - formats arr
|
|
920
|
+
* @returns {string[]} - after arr
|
|
921
|
+
*/
|
|
922
|
+
export function getSqrefRawArrFormat(arr) {
|
|
923
|
+
arr === null || arr === void 0 ? void 0 : arr.map((el) => {
|
|
924
|
+
if (el.includes(":")) {
|
|
925
|
+
let tempArr = el.split(":");
|
|
926
|
+
if ((tempArr === null || tempArr === void 0 ? void 0 : tempArr.length) === 2) {
|
|
927
|
+
arr = arr.concat(getRegionSequence(tempArr));
|
|
928
|
+
arr.splice(arr.indexOf(el), 1);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
});
|
|
932
|
+
const resultArr = arr.filter((value, index, array) => array.indexOf(value) === index);
|
|
933
|
+
return resultArr;
|
|
934
|
+
}
|
|
935
|
+
/**
|
|
936
|
+
* single sequence to number
|
|
937
|
+
* example:
|
|
938
|
+
* 1、A1 -> 0_0
|
|
939
|
+
* 2、ES14 -> 13_4
|
|
940
|
+
*
|
|
941
|
+
* @param {string} sqref - before sequence
|
|
942
|
+
* @returns {string} - after sequence
|
|
943
|
+
*/
|
|
944
|
+
export function getSingleSequenceToNum(sqref) {
|
|
945
|
+
let sqrefArray = sqref.match(/[A-Z]+|[0-9]+/g);
|
|
946
|
+
let sqrefLen = sqrefArray.length;
|
|
947
|
+
let regEn = new RegExp("^[A-Z]+$");
|
|
948
|
+
let ret = "";
|
|
949
|
+
for (let i = sqrefLen - 1; i >= 0; i--) {
|
|
950
|
+
let cur = sqrefArray[i];
|
|
951
|
+
if (regEn.test(cur)) {
|
|
952
|
+
ret += ABCatNum(cur) + "_";
|
|
953
|
+
}
|
|
954
|
+
else {
|
|
955
|
+
ret += parseInt(cur) - 1 + "_";
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
return ret.substring(0, ret.length - 1);
|
|
959
|
+
}
|
|
960
|
+
/**
|
|
961
|
+
* R1C1 to Sequence
|
|
962
|
+
* example: sheet2!R1C1 => sheet!A1
|
|
963
|
+
*
|
|
964
|
+
* @param {string} value - R1C1 value
|
|
965
|
+
* @returns
|
|
966
|
+
*/
|
|
967
|
+
export function getTransR1C1ToSequence(value) {
|
|
968
|
+
if (!value && (value === null || value === void 0 ? void 0 : value.length) <= 0)
|
|
969
|
+
return "";
|
|
970
|
+
const len = value.length;
|
|
971
|
+
const index = value.lastIndexOf("!");
|
|
972
|
+
const valueArr = [value.slice(0, index), value.slice(index + 1, len)];
|
|
973
|
+
const repStr = valueArr[1] || "";
|
|
974
|
+
const indexR = repStr.indexOf("R");
|
|
975
|
+
const indexC = repStr.indexOf("C");
|
|
976
|
+
const row = Number(repStr.slice(indexR + 1, indexC));
|
|
977
|
+
const column = chatatABC(Number(repStr.slice(indexC + 1, repStr === null || repStr === void 0 ? void 0 : repStr.length)) - 1);
|
|
978
|
+
return `${valueArr[0]}!${column}${row}`;
|
|
979
|
+
}
|
|
980
|
+
/**
|
|
981
|
+
* strip x14 format data
|
|
982
|
+
*
|
|
983
|
+
* @param {string} value
|
|
984
|
+
* @returns {Object} - { formula, sqref }
|
|
985
|
+
*/
|
|
986
|
+
export function getPeelOffX14(value) {
|
|
987
|
+
var _a;
|
|
988
|
+
if (!value || (value === null || value === void 0 ? void 0 : value.length) <= 0)
|
|
989
|
+
return {};
|
|
990
|
+
// formula
|
|
991
|
+
const formulaReg = new RegExp("</x14:formula[^]>", "g");
|
|
992
|
+
const lastIndex = (_a = value.match(formulaReg)) === null || _a === void 0 ? void 0 : _a.length;
|
|
993
|
+
const lastValue = `</x14:formula${lastIndex}>`;
|
|
994
|
+
const lastValueEnd = value.indexOf(lastValue);
|
|
995
|
+
let formulaValue = value.substring(0, lastValueEnd + lastValue.length);
|
|
996
|
+
formulaValue = formulaValue
|
|
997
|
+
.replace(/<xm:f>/g, "")
|
|
998
|
+
.replace(/<\/xm:f>/g, "")
|
|
999
|
+
.replace(/x14:/g, "")
|
|
1000
|
+
.replace(/\/x14:/g, "");
|
|
1001
|
+
const formula = formulaValue;
|
|
1002
|
+
// sqref
|
|
1003
|
+
const xmSqrefLen = "<xm:sqref>".length;
|
|
1004
|
+
const sqrefStart = value.indexOf("<xm:sqref>");
|
|
1005
|
+
const sqrefEnd = value.indexOf("</xm:sqref>");
|
|
1006
|
+
const sqref = value.substring(sqrefStart + xmSqrefLen, sqrefEnd);
|
|
1007
|
+
return {
|
|
1008
|
+
formula,
|
|
1009
|
+
sqref,
|
|
1010
|
+
};
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* get the value in the formula
|
|
1014
|
+
*
|
|
1015
|
+
* @param {string} value - extracted value
|
|
1016
|
+
* @returns {string[]}
|
|
1017
|
+
*/
|
|
1018
|
+
export function getMultiFormulaValue(value) {
|
|
1019
|
+
var _a, _b;
|
|
1020
|
+
if (!value || (value === null || value === void 0 ? void 0 : value.length) <= 0)
|
|
1021
|
+
return [];
|
|
1022
|
+
const lenReg = new RegExp("formula", "g");
|
|
1023
|
+
const len = (((_a = value.match(lenReg)) === null || _a === void 0 ? void 0 : _a.length) || 0) / 2;
|
|
1024
|
+
if (len === 0)
|
|
1025
|
+
return [];
|
|
1026
|
+
let retArr = [];
|
|
1027
|
+
for (let i = 1; i <= len; i++) {
|
|
1028
|
+
const startLen = (_b = `<formula${i}>`) === null || _b === void 0 ? void 0 : _b.length;
|
|
1029
|
+
const start = value.indexOf(`<formula${i}>`);
|
|
1030
|
+
const end = value.indexOf(`</formula${i}>`);
|
|
1031
|
+
const _value = value.substring(start + startLen, end);
|
|
1032
|
+
retArr.push(escapeCharacter(_value.replace(/"|^\"|\"$/g, "")));
|
|
1033
|
+
}
|
|
1034
|
+
return retArr;
|
|
1035
|
+
}
|
|
1036
|
+
export var setMerge = function (luckyMerge = {}, worksheet) {
|
|
1037
|
+
const mergearr = Object.values(luckyMerge);
|
|
1038
|
+
mergearr.forEach(function (elem) {
|
|
1039
|
+
// elem格式:{r: 0, c: 0, rs: 1, cs: 2}
|
|
1040
|
+
// 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
|
|
1041
|
+
worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs);
|
|
1042
|
+
});
|
|
1043
|
+
};
|
|
1044
|
+
//获取数据类型
|
|
1045
|
+
export var getObjType = function (obj) {
|
|
1046
|
+
let toString = Object.prototype.toString;
|
|
1047
|
+
let map = {
|
|
1048
|
+
"[object Boolean]": "boolean",
|
|
1049
|
+
"[object Number]": "number",
|
|
1050
|
+
"[object String]": "string",
|
|
1051
|
+
"[object Function]": "function",
|
|
1052
|
+
"[object Array]": "array",
|
|
1053
|
+
"[object Date]": "date",
|
|
1054
|
+
"[object RegExp]": "regExp",
|
|
1055
|
+
"[object Undefined]": "undefined",
|
|
1056
|
+
"[object Null]": "null",
|
|
1057
|
+
"[object Object]": "object",
|
|
1058
|
+
};
|
|
1059
|
+
return map[toString.call(obj)];
|
|
1060
|
+
};
|
|
1061
|
+
//转换颜色
|
|
1062
|
+
export var rgb2hex = function (rgb) {
|
|
1063
|
+
if (rgb.charAt(0) == "#") {
|
|
1064
|
+
return rgb;
|
|
1065
|
+
}
|
|
1066
|
+
var ds = rgb.split(/\D+/);
|
|
1067
|
+
var decimal = Number(ds[1]) * 65536 + Number(ds[2]) * 256 + Number(ds[3]);
|
|
1068
|
+
return "#" + zero_fill_hex(decimal, 6);
|
|
1069
|
+
function zero_fill_hex(num, digits) {
|
|
1070
|
+
var s = num.toString(16);
|
|
1071
|
+
while (s.length < digits)
|
|
1072
|
+
s = "0" + s;
|
|
1073
|
+
return s;
|
|
1074
|
+
}
|
|
1075
|
+
};
|