@solar-angular/platform-browser 18.1.1 → 18.2.0

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.
@@ -1,6 +1,7 @@
1
1
  import { DatePipe, DOCUMENT } from '@angular/common';
2
- import { inject, Injectable } from '@angular/core';
2
+ import { inject, Injectable, LOCALE_ID } from '@angular/core';
3
3
  import { defer, firstValueFrom, map, shareReplay } from 'rxjs';
4
+ import { FileManager } from './file-manager';
4
5
  import { ResourceLoader } from './resource-loader';
5
6
  import * as i0 from "@angular/core";
6
7
  const EXCEL_COL_ALIAS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
@@ -10,96 +11,40 @@ export class SpreadsheetService {
10
11
  constructor() {
11
12
  this.document = inject(DOCUMENT);
12
13
  this.resourceLoader = inject(ResourceLoader);
13
- this.datePipe = new DatePipe('zh-CN');
14
+ this.fileManager = inject(FileManager);
15
+ this.datePipe = new DatePipe(inject(LOCALE_ID));
14
16
  // ExcelJS 对象,用时异步自动加载
15
17
  this.excel = defer(() => Promise.all([
16
18
  this.resourceLoader.loadScript('https://img.omofresh.com/js/aieyes-exceljs-o_1_8_10.min.js'), // 修改过的 https://www.npmjs.com/package/aieyes-exceljs-o
17
19
  this.resourceLoader.loadStylesheet('https://img.omofresh.com/css/exceljs.min.css'), // aieyes-exceljs-o 中定义的
18
20
  ])).pipe(map(() => ExcelJS), shareReplay(1));
19
21
  }
20
- /**
21
- * 根据当前的单元格找到下一列的地址
22
- * 采用倒序进位法,这样就不需要递归了
23
- */
24
- nextColOfCell(cell) {
25
- // 先把字母和数字分开,字母是列,数字是行,倒序排列
26
- const args = cell.match(CHAR_PATTERN).reverse();
27
- let needAppend = false;
28
- for (let i = 0; i < args.length; i++) {
29
- const arg = args[i];
30
- if (arg !== 'Z') {
31
- const idx = EXCEL_COL_ALIAS.indexOf(arg);
32
- args[i] = EXCEL_COL_ALIAS[idx + 1];
33
- break;
34
- }
35
- else {
36
- args[i] = 'A';
37
- if (i === args.length - 1) { // 说明是最后一个了,需要补A
38
- needAppend = true;
39
- }
40
- }
41
- }
42
- if (needAppend) {
43
- args.push('A');
44
- }
45
- return args.reverse().join(''); // 最终的结果,反转再合并
46
- }
47
- /**
48
- * 获取单元格的行
49
- */
50
- rowOfCell(cell) {
51
- return cell.match(NUMBER_PATTERN).join('');
52
- }
53
- /**
54
- * 获取单元格的列
55
- */
56
- colOfCell(cell) {
57
- return cell.match(CHAR_PATTERN).join('');
58
- }
59
- /**
60
- * 单元格的列号
61
- * 当作26进制计算列的编号
62
- */
63
- colNumberOfCell(cell) {
64
- let col = 0;
65
- cell.match(CHAR_PATTERN).reverse().forEach((c, i) => {
66
- if (i == 0) {
67
- // 个位
68
- col += EXCEL_COL_ALIAS.indexOf(c) + 1;
69
- }
70
- else {
71
- // 十位以上
72
- col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;
73
- }
74
- });
75
- return col;
76
- }
77
- async parseDomTable(table, _opts) {
22
+ async parseElement(table, _opts) {
78
23
  const excel = await firstValueFrom(this.excel);
79
24
  return excel.TableParser.utils.parseDomTable(table, _opts);
80
25
  }
81
26
  /**
82
27
  * 只导出一个table, 内容放在第一个sheet上
83
28
  */
84
- async exportDomTableById(tableId, fileName, _opts) {
85
- const table = this.document.getElementById(tableId);
29
+ async exportTable(idOrElement, fileName, _opts) {
30
+ const table = typeof idOrElement === 'string' ? this.document.getElementById(idOrElement) : idOrElement;
86
31
  const excel = await firstValueFrom(this.excel);
87
32
  const wb = new excel.Workbook();
88
33
  const ws = wb.addWorksheet(fileName);
89
- const re = await this.exportDomTable(wb, ws, table, null, null, _opts);
34
+ const re = await this.export(wb, ws, table, null, null, _opts);
90
35
  await this.saveAsFile(re.wb, fileName);
91
36
  }
92
37
  /**
93
38
  * 导出多个table, 内容放在多个sheet上
94
39
  */
95
- async exportDomTableSheets(tableIds, sheetNames, fileName, _opts) {
40
+ async exportTableSheets(tableIds, sheetNames, fileName, _opts) {
96
41
  const excel = await firstValueFrom(this.excel);
97
42
  let wb = new excel.Workbook();
98
43
  for (let index = 0; index < tableIds.length; index++) {
99
44
  const table = this.document.getElementById(tableIds[index]);
100
45
  const sheetName = sheetNames[index];
101
46
  const ws = wb.addWorksheet(sheetName);
102
- const re = await this.exportDomTable(wb, ws, table, null, null, _opts);
47
+ const re = await this.export(wb, ws, table, null, null, _opts);
103
48
  wb = re.wb;
104
49
  }
105
50
  await this.saveAsFile(wb, fileName);
@@ -107,18 +52,18 @@ export class SpreadsheetService {
107
52
  /**
108
53
  * 在一页中导出多个table, 每个table默认间隔1列
109
54
  */
110
- async exportDomTableParallel(tableIds, fileName, gap = 1, _opts) {
55
+ async exportTableParallel(tableIds, fileName, gap = 1, _opts) {
111
56
  const excel = await firstValueFrom(this.excel);
112
57
  let wb = new excel.Workbook();
113
58
  const ws = wb.addWorksheet(fileName);
114
59
  let cursor = 'A'; // 从第一列开始导出,并列几个table
115
60
  for (const tableId of tableIds) {
116
61
  const table = this.document.getElementById(tableId);
117
- const re = await this.exportDomTable(wb, ws, table, cursor, null, _opts);
62
+ const re = await this.export(wb, ws, table, cursor, null, _opts);
118
63
  const lastCol = re.cols[re.cols.length - 1];
119
- cursor = this.nextColOfCell(lastCol);
64
+ cursor = nextColOfCell(lastCol);
120
65
  for (let k = 0; k < gap; k++) {
121
- cursor = this.nextColOfCell(cursor);
66
+ cursor = nextColOfCell(cursor);
122
67
  }
123
68
  wb = re.wb;
124
69
  }
@@ -127,14 +72,14 @@ export class SpreadsheetService {
127
72
  /**
128
73
  * 在一页中垂直导出多个table
129
74
  */
130
- async exportDomTableVertical(tableIds, fileName, gap = 0, _opts) {
75
+ async exportTableVertical(tableIds, fileName, gap = 0, _opts) {
131
76
  let rowOffset = 0;
132
77
  const excel = await firstValueFrom(this.excel);
133
78
  let wb = new excel.Workbook();
134
79
  const ws = wb.addWorksheet(fileName);
135
80
  for (const tableId of tableIds) {
136
81
  const table = this.document.getElementById(tableId);
137
- const re = await this.exportDomTable(wb, ws, table, null, rowOffset, _opts);
82
+ const re = await this.export(wb, ws, table, null, rowOffset, _opts);
138
83
  rowOffset += re.rows.length + gap;
139
84
  wb = re.wb;
140
85
  }
@@ -146,14 +91,14 @@ export class SpreadsheetService {
146
91
  * rowOffset: 偏移的行数
147
92
  * @return 返回最后一列的列名
148
93
  */
149
- async exportDomTable(wb, ws, table, colCursor, rowOffset, _opts) {
94
+ async export(wb, ws, table, colCursor, rowOffset, _opts) {
150
95
  if (!_opts) {
151
96
  _opts = { cellDates: true, dateNF: 'yyyy/M/d' }; // 默认的日期格式
152
97
  }
153
98
  else {
154
99
  _opts.cellDates = true;
155
100
  }
156
- const ref = await this.parseDomTable(table, _opts);
101
+ const ref = await this.parseElement(table, _opts);
157
102
  let colOffset = 0; // colCursor偏移量,默认为0
158
103
  if (colCursor) {
159
104
  const c = ws.getColumn(colCursor);
@@ -163,9 +108,9 @@ export class SpreadsheetService {
163
108
  const cellMap = {};
164
109
  Object.keys(ref).sort().forEach(cellAlias => {
165
110
  if (!cellAlias.startsWith('!')) {
166
- let rowNum = this.rowOfCell(cellAlias);
111
+ let rowNum = rowOfCell(cellAlias);
167
112
  rowNum = String(parseInt(rowNum, 10) + rowOffset);
168
- const colNum = this.colNumberOfCell(cellAlias);
113
+ const colNum = colNumberOfCell(cellAlias);
169
114
  const col = ws.getColumn(colOffset + colNum); // 根据偏移量找出所在的列
170
115
  const finalCell = col.letter + rowNum;
171
116
  cellMap[finalCell] = ref[cellAlias];
@@ -173,13 +118,13 @@ export class SpreadsheetService {
173
118
  });
174
119
  const colSet = new Set();
175
120
  Object.keys(cellMap).forEach(k => {
176
- colSet.add(this.colOfCell(k));
121
+ colSet.add(colOfCell(k));
177
122
  });
178
123
  let cols = Array.from(colSet);
179
124
  // 因为excel的列都是连续的,如果导出table存在跨列的话这里面可能却少某一列,所以需要补充缺少的列名保证这一段是连续的
180
125
  let cursor = cols[0];
181
126
  for (let i = 0; i < ref['!cols'].length - 1; i++) {
182
- const next = this.nextColOfCell(cursor);
127
+ const next = nextColOfCell(cursor);
183
128
  colSet.add(next);
184
129
  cursor = next;
185
130
  }
@@ -265,10 +210,7 @@ export class SpreadsheetService {
265
210
  async saveAsFile(wb, fileName) {
266
211
  const excelData = await wb.xlsx.writeBuffer();
267
212
  const blob = new Blob([excelData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /* MediaType.Xlsx */ });
268
- const anchor = document.createElement('a');
269
- anchor.href = URL.createObjectURL(blob);
270
- anchor.download = fileName + '.xlsx';
271
- anchor.click();
213
+ this.fileManager.save(blob, fileName + '.xlsx');
272
214
  }
273
215
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpreadsheetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
274
216
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpreadsheetService, providedIn: 'root' }); }
@@ -279,4 +221,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
279
221
  providedIn: 'root'
280
222
  }]
281
223
  }] });
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3NwcmVhZHNoZWV0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFLbkQsTUFBTSxlQUFlLEdBQUcsNEJBQTRCLENBQUM7QUFDckQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDO0FBQ2hDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUtqQyxNQUFNLE9BQU8sa0JBQWtCO0lBSC9CO1FBSW1CLGFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEMsYUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxELHNCQUFzQjtRQUNMLFVBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyw0REFBNEQsQ0FBQyxFQUFFLHNEQUFzRDtZQUNwSixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyw4Q0FBOEMsQ0FBQyxFQUFFLHdCQUF3QjtTQUM3RyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUNsQixXQUFX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QUUsUUFBZ0I7UUFDaEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLDBGQUFnQixFQUFFLENBQUMsQ0FBQztRQUM3RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7K0dBdFJVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZWRpYVR5cGUgfSBmcm9tICdAc29sYXIta2l0L2NvcmUnO1xuaW1wb3J0IHsgZGVmZXIsIGZpcnN0VmFsdWVGcm9tLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUxvYWRlciB9IGZyb20gJy4vcmVzb3VyY2UtbG9hZGVyJztcbi8vIOS4jem7mOiupOmbhuaIkGV4Y2VsanPkuobvvIzpnIDopoHnmoTml7blgJnms6jlhaVYbHN4U2VydmljZeWKqOaAgeWKoOi9ve+8jOWboOS4uuS4jeaYr+avj+S4quWcsOaWuemDvemcgOimgeWvvOWHumV4Y2VsXG4vLyBpbXBvcnQge1RhYmxlUGFyc2VyLCBXb3JrYm9va30gZnJvbSAnYWlleWVzLWV4Y2VsanMtbyc7XG5kZWNsYXJlIGxldCBFeGNlbEpTOiBhbnk7ICAgLy8gZnJvbSBleGNlbGpzXG5cbmNvbnN0IEVYQ0VMX0NPTF9BTElBUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XG5jb25zdCBOVU1CRVJfUEFUVEVSTiA9IC9bMC05XS9nO1xuY29uc3QgQ0hBUl9QQVRURVJOID0gL1thLXpBLVpdL2c7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNwcmVhZHNoZWV0U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvYWRlciA9IGluamVjdChSZXNvdXJjZUxvYWRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoJ3poLUNOJyk7XG5cbiAgLy8gRXhjZWxKUyDlr7nosaHvvIznlKjml7blvILmraXoh6rliqjliqDovb1cbiAgcHJpdmF0ZSByZWFkb25seSBleGNlbCA9IGRlZmVyKCgpID0+IFByb21pc2UuYWxsKFtcbiAgICB0aGlzLnJlc291cmNlTG9hZGVyLmxvYWRTY3JpcHQoJ2h0dHBzOi8vaW1nLm9tb2ZyZXNoLmNvbS9qcy9haWV5ZXMtZXhjZWxqcy1vXzFfOF8xMC5taW4uanMnKSwgLy8g5L+u5pS56L+H55qEIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2FpZXllcy1leGNlbGpzLW9cbiAgICB0aGlzLnJlc291cmNlTG9hZGVyLmxvYWRTdHlsZXNoZWV0KCdodHRwczovL2ltZy5vbW9mcmVzaC5jb20vY3NzL2V4Y2VsanMubWluLmNzcycpLCAvLyBhaWV5ZXMtZXhjZWxqcy1vIOS4reWumuS5ieeahFxuICBdKSkucGlwZShcbiAgICBtYXAoKCkgPT4gRXhjZWxKUyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICog5qC55o2u5b2T5YmN55qE5Y2V5YWD5qC85om+5Yiw5LiL5LiA5YiX55qE5Zyw5Z2AXG4gICAqIOmHh+eUqOWAkuW6j+i/m+S9jeazle+8jOi/meagt+WwseS4jemcgOimgemAkuW9kuS6hlxuICAgKi9cbiAgcHJpdmF0ZSBuZXh0Q29sT2ZDZWxsKGNlbGw6IHN0cmluZykge1xuICAgIC8vIOWFiOaKiuWtl+avjeWSjOaVsOWtl+WIhuW8gO+8jOWtl+avjeaYr+WIl++8jOaVsOWtl+aYr+ihjO+8jOWAkuW6j+aOkuWIl1xuICAgIGNvbnN0IGFyZ3MgPSBjZWxsLm1hdGNoKENIQVJfUEFUVEVSTikhLnJldmVyc2UoKTtcbiAgICBsZXQgbmVlZEFwcGVuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgIGlmIChhcmcgIT09ICdaJykge1xuICAgICAgICBjb25zdCBpZHggPSBFWENFTF9DT0xfQUxJQVMuaW5kZXhPZihhcmcpO1xuICAgICAgICBhcmdzW2ldID0gRVhDRUxfQ09MX0FMSUFTW2lkeCArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3NbaV0gPSAnQSc7XG4gICAgICAgIGlmIChpID09PSBhcmdzLmxlbmd0aCAtIDEpIHsgICAgLy8g6K+05piO5piv5pyA5ZCO5LiA5Liq5LqG77yM6ZyA6KaB6KGlQVxuICAgICAgICAgIG5lZWRBcHBlbmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZWVkQXBwZW5kKSB7XG4gICAgICBhcmdzLnB1c2goJ0EnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3MucmV2ZXJzZSgpLmpvaW4oJycpOyAgICAvLyDmnIDnu4jnmoTnu5PmnpzvvIzlj43ovazlho3lkIjlubZcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bljZXlhYPmoLznmoTooYxcbiAgICovXG4gIHByaXZhdGUgcm93T2ZDZWxsKGNlbGw6IHN0cmluZykge1xuICAgIHJldHVybiBjZWxsLm1hdGNoKE5VTUJFUl9QQVRURVJOKSEuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Y2V5YWD5qC855qE5YiXXG4gICAqL1xuICBwcml2YXRlIGNvbE9mQ2VsbChjZWxsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY2VsbC5tYXRjaChDSEFSX1BBVFRFUk4pIS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlhYPmoLznmoTliJflj7dcbiAgICog5b2T5L2cMjbov5vliLborqHnrpfliJfnmoTnvJblj7dcbiAgICovXG4gIHByaXZhdGUgY29sTnVtYmVyT2ZDZWxsKGNlbGw6IHN0cmluZykge1xuICAgIGxldCBjb2wgPSAwO1xuICAgIGNlbGwubWF0Y2goQ0hBUl9QQVRURVJOKSEucmV2ZXJzZSgpLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgLy8g5Liq5L2NXG4gICAgICAgIGNvbCArPSBFWENFTF9DT0xfQUxJQVMuaW5kZXhPZihjKSArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDljYHkvY3ku6XkuIpcbiAgICAgICAgY29sICs9IChFWENFTF9DT0xfQUxJQVMuaW5kZXhPZihjKSArIDEpICogaSAqIDI2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb2w7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlRG9tVGFibGUodGFibGU6IEhUTUxFbGVtZW50LCBfb3B0cz86IGFueSkge1xuICAgIGNvbnN0IGV4Y2VsID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5leGNlbCk7XG4gICAgcmV0dXJuIGV4Y2VsLlRhYmxlUGFyc2VyLnV0aWxzLnBhcnNlRG9tVGFibGUodGFibGUsIF9vcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj6rlr7zlh7rkuIDkuKp0YWJsZSwg5YaF5a655pS+5Zyo56ys5LiA5Liqc2hlZXTkuIpcbiAgICovXG4gIGFzeW5jIGV4cG9ydERvbVRhYmxlQnlJZCh0YWJsZUlkOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIF9vcHRzPzogYW55KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlSWQpITtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuICAgIGNvbnN0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG4gICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoZmlsZU5hbWUpO1xuICAgIGNvbnN0IHJlID0gYXdhaXQgdGhpcy5leHBvcnREb21UYWJsZSh3Yiwgd3MsIHRhYmxlLCBudWxsLCBudWxsLCBfb3B0cyk7XG4gICAgYXdhaXQgdGhpcy5zYXZlQXNGaWxlKHJlLndiLCBmaWxlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICog5a+85Ye65aSa5LiqdGFibGUsIOWGheWuueaUvuWcqOWkmuS4qnNoZWV05LiKXG4gICAqL1xuICBhc3luYyBleHBvcnREb21UYWJsZVNoZWV0cyh0YWJsZUlkczogc3RyaW5nW10sIHNoZWV0TmFtZXM6IHN0cmluZ1tdLCBmaWxlTmFtZTogc3RyaW5nLCBfb3B0cz86IGFueSkge1xuICAgIGNvbnN0IGV4Y2VsID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5leGNlbCk7XG4gICAgbGV0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFibGVJZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVJZHNbaW5kZXhdKSE7XG4gICAgICBjb25zdCBzaGVldE5hbWUgPSBzaGVldE5hbWVzW2luZGV4XTtcbiAgICAgIGNvbnN0IHdzID0gd2IuYWRkV29ya3NoZWV0KHNoZWV0TmFtZSk7XG4gICAgICBjb25zdCByZSA9IGF3YWl0IHRoaXMuZXhwb3J0RG9tVGFibGUod2IsIHdzLCB0YWJsZSwgbnVsbCwgbnVsbCwgX29wdHMpO1xuICAgICAgd2IgPSByZS53YjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVBc0ZpbGUod2IsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjkuIDpobXkuK3lr7zlh7rlpJrkuKp0YWJsZSwg5q+P5LiqdGFibGXpu5jorqTpl7TpmpQx5YiXXG4gICAqL1xuICBhc3luYyBleHBvcnREb21UYWJsZVBhcmFsbGVsKHRhYmxlSWRzOiBzdHJpbmdbXSwgZmlsZU5hbWU6IHN0cmluZywgZ2FwID0gMSwgX29wdHM/OiBhbnkpIHtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuXG4gICAgbGV0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG4gICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoZmlsZU5hbWUpO1xuICAgIGxldCBjdXJzb3IgPSAnQSc7ICAgIC8vIOS7juesrOS4gOWIl+W8gOWni+WvvOWHuu+8jOW5tuWIl+WHoOS4qnRhYmxlXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlSWQgb2YgdGFibGVJZHMpIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUlkKSE7XG4gICAgICBjb25zdCByZSA9IGF3YWl0IHRoaXMuZXhwb3J0RG9tVGFibGUod2IsIHdzLCB0YWJsZSwgY3Vyc29yLCBudWxsLCBfb3B0cyk7XG4gICAgICBjb25zdCBsYXN0Q29sID0gcmUuY29sc1tyZS5jb2xzLmxlbmd0aCAtIDFdO1xuICAgICAgY3Vyc29yID0gdGhpcy5uZXh0Q29sT2ZDZWxsKGxhc3RDb2wpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBnYXA7IGsrKykge1xuICAgICAgICBjdXJzb3IgPSB0aGlzLm5leHRDb2xPZkNlbGwoY3Vyc29yKTtcbiAgICAgIH1cbiAgICAgIHdiID0gcmUud2I7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlQXNGaWxlKHdiLCBmaWxlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5LiA6aG15Lit5Z6C55u05a+85Ye65aSa5LiqdGFibGVcbiAgICovXG4gIGFzeW5jIGV4cG9ydERvbVRhYmxlVmVydGljYWwodGFibGVJZHM6IHN0cmluZ1tdLCBmaWxlTmFtZTogc3RyaW5nLCBnYXAgPSAwLCBfb3B0cz86IGFueSkge1xuICAgIGxldCByb3dPZmZzZXQgPSAwO1xuICAgIGNvbnN0IGV4Y2VsID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5leGNlbCk7XG4gICAgbGV0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG4gICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoZmlsZU5hbWUpO1xuXG4gICAgZm9yIChjb25zdCB0YWJsZUlkIG9mIHRhYmxlSWRzKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVJZCkhO1xuICAgICAgY29uc3QgcmUgPSBhd2FpdCB0aGlzLmV4cG9ydERvbVRhYmxlKHdiLCB3cywgdGFibGUsIG51bGwsIHJvd09mZnNldCwgX29wdHMpO1xuICAgICAgcm93T2Zmc2V0ICs9IHJlLnJvd3MubGVuZ3RoICsgZ2FwO1xuICAgICAgd2IgPSByZS53YjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVBc0ZpbGUod2IsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlr7zlh7pkb20gdGFibGVcbiAgICogY29sQ3Vyc29yOiDmoIforrDotbflp4vliJdcbiAgICogcm93T2Zmc2V0OiDlgY/np7vnmoTooYzmlbBcbiAgICogQHJldHVybiDov5Tlm57mnIDlkI7kuIDliJfnmoTliJflkI1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhwb3J0RG9tVGFibGUod2I6IGFueSwgd3M6IGFueSwgdGFibGU6IEhUTUxFbGVtZW50LCBjb2xDdXJzb3I/OiBzdHJpbmcgfCBudWxsLCByb3dPZmZzZXQ/OiBudW1iZXIgfCBudWxsLCBfb3B0cz86IGFueSkge1xuICAgIGlmICghX29wdHMpIHtcbiAgICAgIF9vcHRzID0geyBjZWxsRGF0ZXM6IHRydWUsIGRhdGVORjogJ3l5eXkvTS9kJyB9OyAgICAvLyDpu5jorqTnmoTml6XmnJ/moLzlvI9cbiAgICB9IGVsc2Uge1xuICAgICAgX29wdHMuY2VsbERhdGVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBhd2FpdCB0aGlzLnBhcnNlRG9tVGFibGUodGFibGUsIF9vcHRzKTtcbiAgICBsZXQgY29sT2Zmc2V0ID0gMDsgICAgLy8gY29sQ3Vyc29y5YGP56e76YeP77yM6buY6K6k5Li6MFxuICAgIGlmIChjb2xDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGMgPSB3cy5nZXRDb2x1bW4oY29sQ3Vyc29yKTtcbiAgICAgIGNvbE9mZnNldCA9IGMubnVtYmVyIC0gMTtcbiAgICB9XG4gICAgcm93T2Zmc2V0ID0gcm93T2Zmc2V0IHx8IDA7ICAgLy8gcm93T2Zmc2V06buY6K6k5Li6MFxuICAgIGNvbnN0IGNlbGxNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBPYmplY3Qua2V5cyhyZWYpLnNvcnQoKS5mb3JFYWNoKGNlbGxBbGlhcyA9PiB7XG4gICAgICBpZiAoIWNlbGxBbGlhcy5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgbGV0IHJvd051bSA9IHRoaXMucm93T2ZDZWxsKGNlbGxBbGlhcyk7XG4gICAgICAgIHJvd051bSA9IFN0cmluZyhwYXJzZUludChyb3dOdW0sIDEwKSArIHJvd09mZnNldCk7XG4gICAgICAgIGNvbnN0IGNvbE51bSA9IHRoaXMuY29sTnVtYmVyT2ZDZWxsKGNlbGxBbGlhcyk7XG4gICAgICAgIGNvbnN0IGNvbCA9IHdzLmdldENvbHVtbihjb2xPZmZzZXQgKyBjb2xOdW0pOyAvLyDmoLnmja7lgY/np7vph4/mib7lh7rmiYDlnKjnmoTliJdcbiAgICAgICAgY29uc3QgZmluYWxDZWxsID0gY29sLmxldHRlciArIHJvd051bTtcbiAgICAgICAgY2VsbE1hcFtmaW5hbENlbGxdID0gcmVmW2NlbGxBbGlhc107XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgT2JqZWN0LmtleXMoY2VsbE1hcCkuZm9yRWFjaChrID0+IHtcbiAgICAgIGNvbFNldC5hZGQodGhpcy5jb2xPZkNlbGwoaykpO1xuICAgIH0pO1xuICAgIGxldCBjb2xzID0gQXJyYXkuZnJvbShjb2xTZXQpO1xuICAgIC8vIOWboOS4umV4Y2Vs55qE5YiX6YO95piv6L+e57ut55qE77yM5aaC5p6c5a+85Ye6dGFibGXlrZjlnKjot6jliJfnmoTor53ov5nph4zpnaLlj6/og73ljbTlsJHmn5DkuIDliJfvvIzmiYDku6XpnIDopoHooaXlhYXnvLrlsJHnmoTliJflkI3kv53or4Hov5nkuIDmrrXmmK/ov57nu63nmoRcbiAgICBsZXQgY3Vyc29yID0gY29sc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZlsnIWNvbHMnXS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRDb2xPZkNlbGwoY3Vyc29yKTtcbiAgICAgIGNvbFNldC5hZGQobmV4dCk7XG4gICAgICBjdXJzb3IgPSBuZXh0O1xuICAgIH1cbiAgICBjb2xzID0gQXJyYXkuZnJvbShjb2xTZXQpLnNvcnQoKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gICAgICB9IGVsc2UgaWYgKGEubGVuZ3RoID4gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0pO1xuICAgIC8vIOi1i+WAvFxuICAgIE9iamVjdC5rZXlzKGNlbGxNYXApLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgY29uc3QgY2VsbCA9IHdzLmdldENlbGwoYWxpYXMpO1xuICAgICAgY29uc3QgY2VsbENvbmZpZyA9IGNlbGxNYXBbYWxpYXNdO1xuICAgICAgaWYgKGNlbGxDb25maWcudCA9PT0gJ2QnKSB7ICAgLy8g5pel5pyf5qC85byP6ZyA5qC85byP5YyW5ZCO5pi+56S677yM5o2i6KiA5LmL6L2s5Li65LqG5a2X56ym5LiyXG4gICAgICAgIGNlbGwudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShjZWxsQ29uZmlnLnYsIGNlbGxDb25maWcueik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjZWxsLnZhbHVlID0gY2VsbENvbmZpZy52O1xuICAgICAgfVxuICAgICAgLy8g6buY6K6k5bCx5pyJ6L655qGG55qEXG4gICAgICBpZiAoY2VsbENvbmZpZy5zdHlsZS5ib3JkZXJlZCkgeyAgICAvLyDooajnpLrpnIDopoHliqDovrnmoYZcbiAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSB7XG4gICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxuICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8g6buY6K6k5YaF5a655Z6C55u05bGF5Lit77yM5bem5Y+z5bGF5Lit5LiN5LiA5a6aXG4gICAgICBjZWxsLnN0eWxlLmFsaWdubWVudCA9IHtcbiAgICAgICAgaG9yaXpvbnRhbDogY2VsbENvbmZpZy5zdHlsZS5hbGlnbixcbiAgICAgICAgdmVydGljYWw6ICdtaWRkbGUnLFxuICAgICAgICB3cmFwVGV4dDogdHJ1ZVxuICAgICAgfTtcbiAgICAgIC8vIOWtl+S9k+m7mOiupOS4uuWui+S9k1xuICAgICAgY2VsbC5zdHlsZS5mb250ID0ge1xuICAgICAgICBib2xkOiBjZWxsQ29uZmlnLnN0eWxlLmJvbGQsXG4gICAgICAgIG5hbWU6ICflrovkvZMnLFxuICAgICAgICBzaXplOiBjZWxsQ29uZmlnLnN0eWxlLnBvdW5kIC8vIOWtl+WPt1xuICAgICAgfTtcbiAgICAgIC8vIOiDjOaZr+iJsi/liY3mma/oibJcbiAgICAgIGlmIChjZWxsQ29uZmlnLnN0eWxlLmJhY2tncm91bmQpIHtcbiAgICAgICAgY2VsbC5maWxsID0ge1xuICAgICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcbiAgICAgICAgICBwYXR0ZXJuOiAnc29saWQnLFxuICAgICAgICAgIGZnQ29sb3I6IHsgYXJnYjogY2VsbENvbmZpZy5zdHlsZS5iYWNrZ3JvdW5kIH0sICAgIC8vIOWunumZheS4imZnQ29sb3LmmK/nkIbop6PkuIrnmoTog4zmma/oibLvvIzogIzkuI3mmK/liY3mma/oibLvvIzkuI3nn6XpgZNleGNlbOaAjuS5iOWumuS5ieeahFxuICAgICAgICAgIC8vIGJnQ29sb3I6IHthcmdiOiAnZmZkOGU2ZGUnfVxuICAgICAgICB9IGFzIGFueTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyDorr7nva7mr4/ooYznmoTpq5jluqZcbiAgICAocmVmWychcm93cyddIGFzIGFueVtdKS5mb3JFYWNoKChyb3dDb25maWcsIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3cgPSB3cy5nZXRSb3cocm93SW5kZXggKyByb3dPZmZzZXQgKyAxKTtcbiAgICAgIHJvdy5oZWlnaHQgPSByb3dDb25maWcuaGVpZ2h0O1xuICAgIH0pO1xuICAgIC8vIOiuvue9ruWIl+WuvVxuICAgIChyZWZbJyFjb2xzJ10gYXMgYW55W10pLmZvckVhY2goKGNvbENvbmZpZywgY29sSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbEFsaWFzID0gY29sc1tjb2xJbmRleF07XG4gICAgICBjb25zdCBjb2wgPSB3cy5nZXRDb2x1bW4oY29sQWxpYXMpO1xuICAgICAgaWYgKGNvbENvbmZpZy53aWR0aCkge1xuICAgICAgICBjb2wud2lkdGggPSBjb2xDb25maWcud2lkdGg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8g5ZCI5bm25Y2V5YWD5qC8LCDnlLHkuo7kuI3kuIDlrprmnInvvIzmiYDku6XopoHliKTmlq3kuIDkuItcbiAgICAocmVmWychbWVyZ2VzJ10gYXMgYW55W10gfCBudWxsKT8uZm9yRWFjaChtZXJnZVBhcmFtID0+IHtcbiAgICAgIGNvbnN0IHMgPSBtZXJnZVBhcmFtWydzJ107XG4gICAgICBjb25zdCBlID0gbWVyZ2VQYXJhbVsnZSddO1xuICAgICAgY29uc3Qgc3RhcnRDZWxsID0gd3MuZ2V0Q2VsbChyb3dPZmZzZXQgKyBzLnIgKyAxLCBjb2xPZmZzZXQgKyBzLmMgKyAxKTtcbiAgICAgIGNvbnN0IGVuZENlbGwgPSB3cy5nZXRDZWxsKHJvd09mZnNldCArIGUuciArIDEsIGNvbE9mZnNldCArIGUuYyArIDEpO1xuICAgICAgd3MubWVyZ2VDZWxscyhbc3RhcnRDZWxsLmFkZHJlc3MsIGVuZENlbGwuYWRkcmVzc10pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHdiLCBjb2xzLCByb3dzOiByZWZbJyFyb3dzJ10gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkv53lrZhXb3JrYm9va+WIsOejgeebmOS4ilxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlQXNGaWxlKHdiOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGNlbERhdGEgPSBhd2FpdCB3Yi54bHN4LndyaXRlQnVmZmVyKCk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtleGNlbERhdGFdLCB7IHR5cGU6IE1lZGlhVHlwZS5YbHN4IH0pO1xuICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhbmNob3IuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgYW5jaG9yLmRvd25sb2FkID0gZmlsZU5hbWUgKyAnLnhsc3gnO1xuICAgIGFuY2hvci5jbGljaygpO1xuICB9XG59XG4iXX0=
224
+ /**
225
+ * 根据当前的单元格找到下一列的地址
226
+ * 采用倒序进位法,这样就不需要递归了
227
+ */
228
+ function nextColOfCell(cell) {
229
+ // 先把字母和数字分开,字母是列,数字是行,倒序排列
230
+ const args = cell.match(CHAR_PATTERN).reverse();
231
+ let needAppend = false;
232
+ for (let i = 0; i < args.length; i++) {
233
+ const arg = args[i];
234
+ if (arg !== 'Z') {
235
+ const idx = EXCEL_COL_ALIAS.indexOf(arg);
236
+ args[i] = EXCEL_COL_ALIAS[idx + 1];
237
+ break;
238
+ }
239
+ else {
240
+ args[i] = 'A';
241
+ if (i === args.length - 1) { // 说明是最后一个了,需要补A
242
+ needAppend = true;
243
+ }
244
+ }
245
+ }
246
+ if (needAppend) {
247
+ args.push('A');
248
+ }
249
+ return args.reverse().join(''); // 最终的结果,反转再合并
250
+ }
251
+ /**
252
+ * 获取单元格的行
253
+ */
254
+ function rowOfCell(cell) {
255
+ return cell.match(NUMBER_PATTERN).join('');
256
+ }
257
+ /**
258
+ * 获取单元格的列
259
+ */
260
+ function colOfCell(cell) {
261
+ return cell.match(CHAR_PATTERN).join('');
262
+ }
263
+ /**
264
+ * 单元格的列号
265
+ * 当作26进制计算列的编号
266
+ */
267
+ function colNumberOfCell(cell) {
268
+ let col = 0;
269
+ cell.match(CHAR_PATTERN).reverse().forEach((c, i) => {
270
+ if (i == 0) {
271
+ // 个位
272
+ col += EXCEL_COL_ALIAS.indexOf(c) + 1;
273
+ }
274
+ else {
275
+ // 十位以上
276
+ col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;
277
+ }
278
+ });
279
+ return col;
280
+ }
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3NwcmVhZHNoZWV0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUtuRCxNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQztBQUNyRCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUM7QUFDaEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBS2pDLE1BQU0sT0FBTyxrQkFBa0I7SUFIL0I7UUFJbUIsYUFBUSxHQUFhLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxhQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsc0JBQXNCO1FBQ0wsVUFBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLDREQUE0RCxDQUFDLEVBQUUsc0RBQXNEO1lBQ3BKLElBQUksQ0FBQyxjQUFjLENBQUMs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LENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxJQUFZO0lBQ25DLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1gsS0FBSztZQUNMLEdBQUcsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU87WUFDUCxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZWRpYVR5cGUgfSBmcm9tICdAc29sYXIta2l0L2NvcmUnO1xuaW1wb3J0IHsgZGVmZXIsIGZpcnN0VmFsdWVGcm9tLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGaWxlTWFuYWdlciB9IGZyb20gJy4vZmlsZS1tYW5hZ2VyJztcbmltcG9ydCB7IFJlc291cmNlTG9hZGVyIH0gZnJvbSAnLi9yZXNvdXJjZS1sb2FkZXInO1xuLy8g5LiN6buY6K6k6ZuG5oiQZXhjZWxqc+S6hu+8jOmcgOimgeeahOaXtuWAmeazqOWFpVhsc3hTZXJ2aWNl5Yqo5oCB5Yqg6L2977yM5Zug5Li65LiN5piv5q+P5Liq5Zyw5pa56YO96ZyA6KaB5a+85Ye6ZXhjZWxcbi8vIGltcG9ydCB7VGFibGVQYXJzZXIsIFdvcmtib29rfSBmcm9tICdhaWV5ZXMtZXhjZWxqcy1vJztcbmRlY2xhcmUgbGV0IEV4Y2VsSlM6IGFueTsgICAvLyBmcm9tIGV4Y2VsanNcblxuY29uc3QgRVhDRUxfQ09MX0FMSUFTID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcbmNvbnN0IE5VTUJFUl9QQVRURVJOID0gL1swLTldL2c7XG5jb25zdCBDSEFSX1BBVFRFUk4gPSAvW2EtekEtWl0vZztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3ByZWFkc2hlZXRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9hZGVyID0gaW5qZWN0KFJlc291cmNlTG9hZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlTWFuYWdlciA9IGluamVjdChGaWxlTWFuYWdlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoaW5qZWN0KExPQ0FMRV9JRCkpO1xuXG4gIC8vIEV4Y2VsSlMg5a+56LGh77yM55So5pe25byC5q2l6Ieq5Yqo5Yqg6L29XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjZWwgPSBkZWZlcigoKSA9PiBQcm9taXNlLmFsbChbXG4gICAgdGhpcy5yZXNvdXJjZUxvYWRlci5sb2FkU2NyaXB0KCdodHRwczovL2ltZy5vbW9mcmVzaC5jb20vanMvYWlleWVzLWV4Y2VsanMtb18xXzhfMTAubWluLmpzJyksIC8vIOS/ruaUuei/h+eahCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9haWV5ZXMtZXhjZWxqcy1vXG4gICAgdGhpcy5yZXNvdXJjZUxvYWRlci5sb2FkU3R5bGVzaGVldCgnaHR0cHM6Ly9pbWcub21vZnJlc2guY29tL2Nzcy9leGNlbGpzLm1pbi5jc3MnKSwgLy8gYWlleWVzLWV4Y2VsanMtbyDkuK3lrprkuYnnmoRcbiAgXSkpLnBpcGUoXG4gICAgbWFwKCgpID0+IEV4Y2VsSlMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcHJpdmF0ZSBhc3luYyBwYXJzZUVsZW1lbnQodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIF9vcHRzPzogYW55KSB7XG4gICAgY29uc3QgZXhjZWwgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmV4Y2VsKTtcbiAgICByZXR1cm4gZXhjZWwuVGFibGVQYXJzZXIudXRpbHMucGFyc2VEb21UYWJsZSh0YWJsZSwgX29wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPquWvvOWHuuS4gOS4qnRhYmxlLCDlhoXlrrnmlL7lnKjnrKzkuIDkuKpzaGVldOS4ilxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VGFibGUoaWRPckVsZW1lbnQ6IHN0cmluZyB8IEhUTUxUYWJsZUVsZW1lbnQsIGZpbGVOYW1lOiBzdHJpbmcsIF9vcHRzPzogYW55KSB7XG4gICAgY29uc3QgdGFibGUgPSB0eXBlb2YgaWRPckVsZW1lbnQgPT09ICdzdHJpbmcnID8gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZE9yRWxlbWVudCkhIGFzIEhUTUxUYWJsZUVsZW1lbnQgOiBpZE9yRWxlbWVudDtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuICAgIGNvbnN0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG4gICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoZmlsZU5hbWUpO1xuICAgIGNvbnN0IHJlID0gYXdhaXQgdGhpcy5leHBvcnQod2IsIHdzLCB0YWJsZSwgbnVsbCwgbnVsbCwgX29wdHMpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZUFzRmlsZShyZS53YiwgZmlsZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWvvOWHuuWkmuS4qnRhYmxlLCDlhoXlrrnmlL7lnKjlpJrkuKpzaGVldOS4ilxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VGFibGVTaGVldHModGFibGVJZHM6IHN0cmluZ1tdLCBzaGVldE5hbWVzOiBzdHJpbmdbXSwgZmlsZU5hbWU6IHN0cmluZywgX29wdHM/OiBhbnkpIHtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuICAgIGxldCB3YiA9IG5ldyBleGNlbC5Xb3JrYm9vaygpO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRhYmxlSWRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlSWRzW2luZGV4XSkgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgIGNvbnN0IHNoZWV0TmFtZSA9IHNoZWV0TmFtZXNbaW5kZXhdO1xuICAgICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoc2hlZXROYW1lKTtcbiAgICAgIGNvbnN0IHJlID0gYXdhaXQgdGhpcy5leHBvcnQod2IsIHdzLCB0YWJsZSwgbnVsbCwgbnVsbCwgX29wdHMpO1xuICAgICAgd2IgPSByZS53YjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVBc0ZpbGUod2IsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjkuIDpobXkuK3lr7zlh7rlpJrkuKp0YWJsZSwg5q+P5LiqdGFibGXpu5jorqTpl7TpmpQx5YiXXG4gICAqL1xuICBhc3luYyBleHBvcnRUYWJsZVBhcmFsbGVsKHRhYmxlSWRzOiBzdHJpbmdbXSwgZmlsZU5hbWU6IHN0cmluZywgZ2FwID0gMSwgX29wdHM/OiBhbnkpIHtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuXG4gICAgbGV0IHdiID0gbmV3IGV4Y2VsLldvcmtib29rKCk7XG4gICAgY29uc3Qgd3MgPSB3Yi5hZGRXb3Jrc2hlZXQoZmlsZU5hbWUpO1xuICAgIGxldCBjdXJzb3IgPSAnQSc7ICAgIC8vIOS7juesrOS4gOWIl+W8gOWni+WvvOWHuu+8jOW5tuWIl+WHoOS4qnRhYmxlXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlSWQgb2YgdGFibGVJZHMpIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUlkKSBhcyBIVE1MVGFibGVFbGVtZW50O1xuICAgICAgY29uc3QgcmUgPSBhd2FpdCB0aGlzLmV4cG9ydCh3Yiwgd3MsIHRhYmxlLCBjdXJzb3IsIG51bGwsIF9vcHRzKTtcbiAgICAgIGNvbnN0IGxhc3RDb2wgPSByZS5jb2xzW3JlLmNvbHMubGVuZ3RoIC0gMV07XG4gICAgICBjdXJzb3IgPSBuZXh0Q29sT2ZDZWxsKGxhc3RDb2wpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBnYXA7IGsrKykge1xuICAgICAgICBjdXJzb3IgPSBuZXh0Q29sT2ZDZWxsKGN1cnNvcik7XG4gICAgICB9XG4gICAgICB3YiA9IHJlLndiO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZUFzRmlsZSh3YiwgZmlsZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOS4gOmhteS4reWeguebtOWvvOWHuuWkmuS4qnRhYmxlXG4gICAqL1xuICBhc3luYyBleHBvcnRUYWJsZVZlcnRpY2FsKHRhYmxlSWRzOiBzdHJpbmdbXSwgZmlsZU5hbWU6IHN0cmluZywgZ2FwID0gMCwgX29wdHM/OiBhbnkpIHtcbiAgICBsZXQgcm93T2Zmc2V0ID0gMDtcbiAgICBjb25zdCBleGNlbCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZXhjZWwpO1xuICAgIGxldCB3YiA9IG5ldyBleGNlbC5Xb3JrYm9vaygpO1xuICAgIGNvbnN0IHdzID0gd2IuYWRkV29ya3NoZWV0KGZpbGVOYW1lKTtcblxuICAgIGZvciAoY29uc3QgdGFibGVJZCBvZiB0YWJsZUlkcykge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlSWQpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgICBjb25zdCByZSA9IGF3YWl0IHRoaXMuZXhwb3J0KHdiLCB3cywgdGFibGUsIG51bGwsIHJvd09mZnNldCwgX29wdHMpO1xuICAgICAgcm93T2Zmc2V0ICs9IHJlLnJvd3MubGVuZ3RoICsgZ2FwO1xuICAgICAgd2IgPSByZS53YjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVBc0ZpbGUod2IsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlr7zlh7pkb20gdGFibGVcbiAgICogY29sQ3Vyc29yOiDmoIforrDotbflp4vliJdcbiAgICogcm93T2Zmc2V0OiDlgY/np7vnmoTooYzmlbBcbiAgICogQHJldHVybiDov5Tlm57mnIDlkI7kuIDliJfnmoTliJflkI1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhwb3J0KHdiOiBhbnksIHdzOiBhbnksIHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjb2xDdXJzb3I/OiBzdHJpbmcgfCBudWxsLCByb3dPZmZzZXQ/OiBudW1iZXIgfCBudWxsLCBfb3B0cz86IGFueSkge1xuICAgIGlmICghX29wdHMpIHtcbiAgICAgIF9vcHRzID0geyBjZWxsRGF0ZXM6IHRydWUsIGRhdGVORjogJ3l5eXkvTS9kJyB9OyAgICAvLyDpu5jorqTnmoTml6XmnJ/moLzlvI9cbiAgICB9IGVsc2Uge1xuICAgICAgX29wdHMuY2VsbERhdGVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBhd2FpdCB0aGlzLnBhcnNlRWxlbWVudCh0YWJsZSwgX29wdHMpO1xuICAgIGxldCBjb2xPZmZzZXQgPSAwOyAgICAvLyBjb2xDdXJzb3LlgY/np7vph4/vvIzpu5jorqTkuLowXG4gICAgaWYgKGNvbEN1cnNvcikge1xuICAgICAgY29uc3QgYyA9IHdzLmdldENvbHVtbihjb2xDdXJzb3IpO1xuICAgICAgY29sT2Zmc2V0ID0gYy5udW1iZXIgLSAxO1xuICAgIH1cbiAgICByb3dPZmZzZXQgPSByb3dPZmZzZXQgfHwgMDsgICAvLyByb3dPZmZzZXTpu5jorqTkuLowXG4gICAgY29uc3QgY2VsbE1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJlZikuc29ydCgpLmZvckVhY2goY2VsbEFsaWFzID0+IHtcbiAgICAgIGlmICghY2VsbEFsaWFzLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBsZXQgcm93TnVtID0gcm93T2ZDZWxsKGNlbGxBbGlhcyk7XG4gICAgICAgIHJvd051bSA9IFN0cmluZyhwYXJzZUludChyb3dOdW0sIDEwKSArIHJvd09mZnNldCk7XG4gICAgICAgIGNvbnN0IGNvbE51bSA9IGNvbE51bWJlck9mQ2VsbChjZWxsQWxpYXMpO1xuICAgICAgICBjb25zdCBjb2wgPSB3cy5nZXRDb2x1bW4oY29sT2Zmc2V0ICsgY29sTnVtKTsgLy8g5qC55o2u5YGP56e76YeP5om+5Ye65omA5Zyo55qE5YiXXG4gICAgICAgIGNvbnN0IGZpbmFsQ2VsbCA9IGNvbC5sZXR0ZXIgKyByb3dOdW07XG4gICAgICAgIGNlbGxNYXBbZmluYWxDZWxsXSA9IHJlZltjZWxsQWxpYXNdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIE9iamVjdC5rZXlzKGNlbGxNYXApLmZvckVhY2goayA9PiB7XG4gICAgICBjb2xTZXQuYWRkKGNvbE9mQ2VsbChrKSk7XG4gICAgfSk7XG4gICAgbGV0IGNvbHMgPSBBcnJheS5mcm9tKGNvbFNldCk7XG4gICAgLy8g5Zug5Li6ZXhjZWznmoTliJfpg73mmK/ov57nu63nmoTvvIzlpoLmnpzlr7zlh7p0YWJsZeWtmOWcqOi3qOWIl+eahOivnei/memHjOmdouWPr+iDveWNtOWwkeafkOS4gOWIl++8jOaJgOS7pemcgOimgeihpeWFhee8uuWwkeeahOWIl+WQjeS/neivgei/meS4gOauteaYr+i/nue7reeahFxuICAgIGxldCBjdXJzb3IgPSBjb2xzWzBdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVmWychY29scyddLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgbmV4dCA9IG5leHRDb2xPZkNlbGwoY3Vyc29yKTtcbiAgICAgIGNvbFNldC5hZGQobmV4dCk7XG4gICAgICBjdXJzb3IgPSBuZXh0O1xuICAgIH1cbiAgICBjb2xzID0gQXJyYXkuZnJvbShjb2xTZXQpLnNvcnQoKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gICAgICB9IGVsc2UgaWYgKGEubGVuZ3RoID4gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0pO1xuICAgIC8vIOi1i+WAvFxuICAgIE9iamVjdC5rZXlzKGNlbGxNYXApLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgY29uc3QgY2VsbCA9IHdzLmdldENlbGwoYWxpYXMpO1xuICAgICAgY29uc3QgY2VsbENvbmZpZyA9IGNlbGxNYXBbYWxpYXNdO1xuICAgICAgaWYgKGNlbGxDb25maWcudCA9PT0gJ2QnKSB7ICAgLy8g5pel5pyf5qC85byP6ZyA5qC85byP5YyW5ZCO5pi+56S677yM5o2i6KiA5LmL6L2s5Li65LqG5a2X56ym5LiyXG4gICAgICAgIGNlbGwudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShjZWxsQ29uZmlnLnYsIGNlbGxDb25maWcueik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjZWxsLnZhbHVlID0gY2VsbENvbmZpZy52O1xuICAgICAgfVxuICAgICAgLy8g6buY6K6k5bCx5pyJ6L655qGG55qEXG4gICAgICBpZiAoY2VsbENvbmZpZy5zdHlsZS5ib3JkZXJlZCkgeyAgICAvLyDooajnpLrpnIDopoHliqDovrnmoYZcbiAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSB7XG4gICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxuICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8g6buY6K6k5YaF5a655Z6C55u05bGF5Lit77yM5bem5Y+z5bGF5Lit5LiN5LiA5a6aXG4gICAgICBjZWxsLnN0eWxlLmFsaWdubWVudCA9IHtcbiAgICAgICAgaG9yaXpvbnRhbDogY2VsbENvbmZpZy5zdHlsZS5hbGlnbixcbiAgICAgICAgdmVydGljYWw6ICdtaWRkbGUnLFxuICAgICAgICB3cmFwVGV4dDogdHJ1ZVxuICAgICAgfTtcbiAgICAgIC8vIOWtl+S9k+m7mOiupOS4uuWui+S9k1xuICAgICAgY2VsbC5zdHlsZS5mb250ID0ge1xuICAgICAgICBib2xkOiBjZWxsQ29uZmlnLnN0eWxlLmJvbGQsXG4gICAgICAgIG5hbWU6ICflrovkvZMnLFxuICAgICAgICBzaXplOiBjZWxsQ29uZmlnLnN0eWxlLnBvdW5kIC8vIOWtl+WPt1xuICAgICAgfTtcbiAgICAgIC8vIOiDjOaZr+iJsi/liY3mma/oibJcbiAgICAgIGlmIChjZWxsQ29uZmlnLnN0eWxlLmJhY2tncm91bmQpIHtcbiAgICAgICAgY2VsbC5maWxsID0ge1xuICAgICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcbiAgICAgICAgICBwYXR0ZXJuOiAnc29saWQnLFxuICAgICAgICAgIGZnQ29sb3I6IHsgYXJnYjogY2VsbENvbmZpZy5zdHlsZS5iYWNrZ3JvdW5kIH0sICAgIC8vIOWunumZheS4imZnQ29sb3LmmK/nkIbop6PkuIrnmoTog4zmma/oibLvvIzogIzkuI3mmK/liY3mma/oibLvvIzkuI3nn6XpgZNleGNlbOaAjuS5iOWumuS5ieeahFxuICAgICAgICAgIC8vIGJnQ29sb3I6IHthcmdiOiAnZmZkOGU2ZGUnfVxuICAgICAgICB9IGFzIGFueTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyDorr7nva7mr4/ooYznmoTpq5jluqZcbiAgICAocmVmWychcm93cyddIGFzIGFueVtdKS5mb3JFYWNoKChyb3dDb25maWcsIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3cgPSB3cy5nZXRSb3cocm93SW5kZXggKyByb3dPZmZzZXQgKyAxKTtcbiAgICAgIHJvdy5oZWlnaHQgPSByb3dDb25maWcuaGVpZ2h0O1xuICAgIH0pO1xuICAgIC8vIOiuvue9ruWIl+WuvVxuICAgIChyZWZbJyFjb2xzJ10gYXMgYW55W10pLmZvckVhY2goKGNvbENvbmZpZywgY29sSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbEFsaWFzID0gY29sc1tjb2xJbmRleF07XG4gICAgICBjb25zdCBjb2wgPSB3cy5nZXRDb2x1bW4oY29sQWxpYXMpO1xuICAgICAgaWYgKGNvbENvbmZpZy53aWR0aCkge1xuICAgICAgICBjb2wud2lkdGggPSBjb2xDb25maWcud2lkdGg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8g5ZCI5bm25Y2V5YWD5qC8LCDnlLHkuo7kuI3kuIDlrprmnInvvIzmiYDku6XopoHliKTmlq3kuIDkuItcbiAgICAocmVmWychbWVyZ2VzJ10gYXMgYW55W10gfCBudWxsKT8uZm9yRWFjaChtZXJnZVBhcmFtID0+IHtcbiAgICAgIGNvbnN0IHMgPSBtZXJnZVBhcmFtWydzJ107XG4gICAgICBjb25zdCBlID0gbWVyZ2VQYXJhbVsnZSddO1xuICAgICAgY29uc3Qgc3RhcnRDZWxsID0gd3MuZ2V0Q2VsbChyb3dPZmZzZXQgKyBzLnIgKyAxLCBjb2xPZmZzZXQgKyBzLmMgKyAxKTtcbiAgICAgIGNvbnN0IGVuZENlbGwgPSB3cy5nZXRDZWxsKHJvd09mZnNldCArIGUuciArIDEsIGNvbE9mZnNldCArIGUuYyArIDEpO1xuICAgICAgd3MubWVyZ2VDZWxscyhbc3RhcnRDZWxsLmFkZHJlc3MsIGVuZENlbGwuYWRkcmVzc10pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHdiLCBjb2xzLCByb3dzOiByZWZbJyFyb3dzJ10gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkv53lrZhXb3JrYm9va+WIsOejgeebmOS4ilxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlQXNGaWxlKHdiOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGNlbERhdGEgPSBhd2FpdCB3Yi54bHN4LndyaXRlQnVmZmVyKCk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtleGNlbERhdGFdLCB7IHR5cGU6IE1lZGlhVHlwZS5YbHN4IH0pO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIuc2F2ZShibG9iLCBmaWxlTmFtZSArICcueGxzeCcpXG4gIH1cbn1cblxuLyoqXG4gKiDmoLnmja7lvZPliY3nmoTljZXlhYPmoLzmib7liLDkuIvkuIDliJfnmoTlnLDlnYBcbiAqIOmHh+eUqOWAkuW6j+i/m+S9jeazle+8jOi/meagt+WwseS4jemcgOimgemAkuW9kuS6hlxuICovXG5mdW5jdGlvbiBuZXh0Q29sT2ZDZWxsKGNlbGw6IHN0cmluZykge1xuICAvLyDlhYjmiorlrZfmr43lkozmlbDlrZfliIblvIDvvIzlrZfmr43mmK/liJfvvIzmlbDlrZfmmK/ooYzvvIzlgJLluo/mjpLliJdcbiAgY29uc3QgYXJncyA9IGNlbGwubWF0Y2goQ0hBUl9QQVRURVJOKSEucmV2ZXJzZSgpO1xuICBsZXQgbmVlZEFwcGVuZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgIGlmIChhcmcgIT09ICdaJykge1xuICAgICAgY29uc3QgaWR4ID0gRVhDRUxfQ09MX0FMSUFTLmluZGV4T2YoYXJnKTtcbiAgICAgIGFyZ3NbaV0gPSBFWENFTF9DT0xfQUxJQVNbaWR4ICsgMV07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXJnc1tpXSA9ICdBJztcbiAgICAgIGlmIChpID09PSBhcmdzLmxlbmd0aCAtIDEpIHsgICAgLy8g6K+05piO5piv5pyA5ZCO5LiA5Liq5LqG77yM6ZyA6KaB6KGlQVxuICAgICAgICBuZWVkQXBwZW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRBcHBlbmQpIHtcbiAgICBhcmdzLnB1c2goJ0EnKTtcbiAgfVxuICByZXR1cm4gYXJncy5yZXZlcnNlKCkuam9pbignJyk7ICAgIC8vIOacgOe7iOeahOe7k+aenO+8jOWPjei9rOWGjeWQiOW5tlxufVxuXG4vKipcbiAqIOiOt+WPluWNleWFg+agvOeahOihjFxuICovXG5mdW5jdGlvbiByb3dPZkNlbGwoY2VsbDogc3RyaW5nKSB7XG4gIHJldHVybiBjZWxsLm1hdGNoKE5VTUJFUl9QQVRURVJOKSEuam9pbignJyk7XG59XG5cbi8qKlxuICog6I635Y+W5Y2V5YWD5qC855qE5YiXXG4gKi9cbmZ1bmN0aW9uIGNvbE9mQ2VsbChjZWxsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGNlbGwubWF0Y2goQ0hBUl9QQVRURVJOKSEuam9pbignJyk7XG59XG5cbi8qKlxuICog5Y2V5YWD5qC855qE5YiX5Y+3XG4gKiDlvZPkvZwyNui/m+WItuiuoeeul+WIl+eahOe8luWPt1xuICovXG5mdW5jdGlvbiBjb2xOdW1iZXJPZkNlbGwoY2VsbDogc3RyaW5nKSB7XG4gIGxldCBjb2wgPSAwO1xuICBjZWxsLm1hdGNoKENIQVJfUEFUVEVSTikhLnJldmVyc2UoKS5mb3JFYWNoKChjLCBpKSA9PiB7XG4gICAgaWYgKGkgPT0gMCkge1xuICAgICAgLy8g5Liq5L2NXG4gICAgICBjb2wgKz0gRVhDRUxfQ09MX0FMSUFTLmluZGV4T2YoYykgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDljYHkvY3ku6XkuIpcbiAgICAgIGNvbCArPSAoRVhDRUxfQ09MX0FMSUFTLmluZGV4T2YoYykgKyAxKSAqIGkgKiAyNjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29sO1xufVxuIl19
@@ -1,6 +1,6 @@
1
1
  import { DOCUMENT, DatePipe } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, Injectable, InjectionToken } from '@angular/core';
3
+ import { inject, Injectable, InjectionToken, LOCALE_ID } from '@angular/core';
4
4
  import { Observable, from, defer, map, shareReplay, firstValueFrom } from 'rxjs';
5
5
 
6
6
  class FileManager {
@@ -295,96 +295,40 @@ class SpreadsheetService {
295
295
  constructor() {
296
296
  this.document = inject(DOCUMENT);
297
297
  this.resourceLoader = inject(ResourceLoader);
298
- this.datePipe = new DatePipe('zh-CN');
298
+ this.fileManager = inject(FileManager);
299
+ this.datePipe = new DatePipe(inject(LOCALE_ID));
299
300
  // ExcelJS 对象,用时异步自动加载
300
301
  this.excel = defer(() => Promise.all([
301
302
  this.resourceLoader.loadScript('https://img.omofresh.com/js/aieyes-exceljs-o_1_8_10.min.js'), // 修改过的 https://www.npmjs.com/package/aieyes-exceljs-o
302
303
  this.resourceLoader.loadStylesheet('https://img.omofresh.com/css/exceljs.min.css'), // aieyes-exceljs-o 中定义的
303
304
  ])).pipe(map(() => ExcelJS), shareReplay(1));
304
305
  }
305
- /**
306
- * 根据当前的单元格找到下一列的地址
307
- * 采用倒序进位法,这样就不需要递归了
308
- */
309
- nextColOfCell(cell) {
310
- // 先把字母和数字分开,字母是列,数字是行,倒序排列
311
- const args = cell.match(CHAR_PATTERN).reverse();
312
- let needAppend = false;
313
- for (let i = 0; i < args.length; i++) {
314
- const arg = args[i];
315
- if (arg !== 'Z') {
316
- const idx = EXCEL_COL_ALIAS.indexOf(arg);
317
- args[i] = EXCEL_COL_ALIAS[idx + 1];
318
- break;
319
- }
320
- else {
321
- args[i] = 'A';
322
- if (i === args.length - 1) { // 说明是最后一个了,需要补A
323
- needAppend = true;
324
- }
325
- }
326
- }
327
- if (needAppend) {
328
- args.push('A');
329
- }
330
- return args.reverse().join(''); // 最终的结果,反转再合并
331
- }
332
- /**
333
- * 获取单元格的行
334
- */
335
- rowOfCell(cell) {
336
- return cell.match(NUMBER_PATTERN).join('');
337
- }
338
- /**
339
- * 获取单元格的列
340
- */
341
- colOfCell(cell) {
342
- return cell.match(CHAR_PATTERN).join('');
343
- }
344
- /**
345
- * 单元格的列号
346
- * 当作26进制计算列的编号
347
- */
348
- colNumberOfCell(cell) {
349
- let col = 0;
350
- cell.match(CHAR_PATTERN).reverse().forEach((c, i) => {
351
- if (i == 0) {
352
- // 个位
353
- col += EXCEL_COL_ALIAS.indexOf(c) + 1;
354
- }
355
- else {
356
- // 十位以上
357
- col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;
358
- }
359
- });
360
- return col;
361
- }
362
- async parseDomTable(table, _opts) {
306
+ async parseElement(table, _opts) {
363
307
  const excel = await firstValueFrom(this.excel);
364
308
  return excel.TableParser.utils.parseDomTable(table, _opts);
365
309
  }
366
310
  /**
367
311
  * 只导出一个table, 内容放在第一个sheet上
368
312
  */
369
- async exportDomTableById(tableId, fileName, _opts) {
370
- const table = this.document.getElementById(tableId);
313
+ async exportTable(idOrElement, fileName, _opts) {
314
+ const table = typeof idOrElement === 'string' ? this.document.getElementById(idOrElement) : idOrElement;
371
315
  const excel = await firstValueFrom(this.excel);
372
316
  const wb = new excel.Workbook();
373
317
  const ws = wb.addWorksheet(fileName);
374
- const re = await this.exportDomTable(wb, ws, table, null, null, _opts);
318
+ const re = await this.export(wb, ws, table, null, null, _opts);
375
319
  await this.saveAsFile(re.wb, fileName);
376
320
  }
377
321
  /**
378
322
  * 导出多个table, 内容放在多个sheet上
379
323
  */
380
- async exportDomTableSheets(tableIds, sheetNames, fileName, _opts) {
324
+ async exportTableSheets(tableIds, sheetNames, fileName, _opts) {
381
325
  const excel = await firstValueFrom(this.excel);
382
326
  let wb = new excel.Workbook();
383
327
  for (let index = 0; index < tableIds.length; index++) {
384
328
  const table = this.document.getElementById(tableIds[index]);
385
329
  const sheetName = sheetNames[index];
386
330
  const ws = wb.addWorksheet(sheetName);
387
- const re = await this.exportDomTable(wb, ws, table, null, null, _opts);
331
+ const re = await this.export(wb, ws, table, null, null, _opts);
388
332
  wb = re.wb;
389
333
  }
390
334
  await this.saveAsFile(wb, fileName);
@@ -392,18 +336,18 @@ class SpreadsheetService {
392
336
  /**
393
337
  * 在一页中导出多个table, 每个table默认间隔1列
394
338
  */
395
- async exportDomTableParallel(tableIds, fileName, gap = 1, _opts) {
339
+ async exportTableParallel(tableIds, fileName, gap = 1, _opts) {
396
340
  const excel = await firstValueFrom(this.excel);
397
341
  let wb = new excel.Workbook();
398
342
  const ws = wb.addWorksheet(fileName);
399
343
  let cursor = 'A'; // 从第一列开始导出,并列几个table
400
344
  for (const tableId of tableIds) {
401
345
  const table = this.document.getElementById(tableId);
402
- const re = await this.exportDomTable(wb, ws, table, cursor, null, _opts);
346
+ const re = await this.export(wb, ws, table, cursor, null, _opts);
403
347
  const lastCol = re.cols[re.cols.length - 1];
404
- cursor = this.nextColOfCell(lastCol);
348
+ cursor = nextColOfCell(lastCol);
405
349
  for (let k = 0; k < gap; k++) {
406
- cursor = this.nextColOfCell(cursor);
350
+ cursor = nextColOfCell(cursor);
407
351
  }
408
352
  wb = re.wb;
409
353
  }
@@ -412,14 +356,14 @@ class SpreadsheetService {
412
356
  /**
413
357
  * 在一页中垂直导出多个table
414
358
  */
415
- async exportDomTableVertical(tableIds, fileName, gap = 0, _opts) {
359
+ async exportTableVertical(tableIds, fileName, gap = 0, _opts) {
416
360
  let rowOffset = 0;
417
361
  const excel = await firstValueFrom(this.excel);
418
362
  let wb = new excel.Workbook();
419
363
  const ws = wb.addWorksheet(fileName);
420
364
  for (const tableId of tableIds) {
421
365
  const table = this.document.getElementById(tableId);
422
- const re = await this.exportDomTable(wb, ws, table, null, rowOffset, _opts);
366
+ const re = await this.export(wb, ws, table, null, rowOffset, _opts);
423
367
  rowOffset += re.rows.length + gap;
424
368
  wb = re.wb;
425
369
  }
@@ -431,14 +375,14 @@ class SpreadsheetService {
431
375
  * rowOffset: 偏移的行数
432
376
  * @return 返回最后一列的列名
433
377
  */
434
- async exportDomTable(wb, ws, table, colCursor, rowOffset, _opts) {
378
+ async export(wb, ws, table, colCursor, rowOffset, _opts) {
435
379
  if (!_opts) {
436
380
  _opts = { cellDates: true, dateNF: 'yyyy/M/d' }; // 默认的日期格式
437
381
  }
438
382
  else {
439
383
  _opts.cellDates = true;
440
384
  }
441
- const ref = await this.parseDomTable(table, _opts);
385
+ const ref = await this.parseElement(table, _opts);
442
386
  let colOffset = 0; // colCursor偏移量,默认为0
443
387
  if (colCursor) {
444
388
  const c = ws.getColumn(colCursor);
@@ -448,9 +392,9 @@ class SpreadsheetService {
448
392
  const cellMap = {};
449
393
  Object.keys(ref).sort().forEach(cellAlias => {
450
394
  if (!cellAlias.startsWith('!')) {
451
- let rowNum = this.rowOfCell(cellAlias);
395
+ let rowNum = rowOfCell(cellAlias);
452
396
  rowNum = String(parseInt(rowNum, 10) + rowOffset);
453
- const colNum = this.colNumberOfCell(cellAlias);
397
+ const colNum = colNumberOfCell(cellAlias);
454
398
  const col = ws.getColumn(colOffset + colNum); // 根据偏移量找出所在的列
455
399
  const finalCell = col.letter + rowNum;
456
400
  cellMap[finalCell] = ref[cellAlias];
@@ -458,13 +402,13 @@ class SpreadsheetService {
458
402
  });
459
403
  const colSet = new Set();
460
404
  Object.keys(cellMap).forEach(k => {
461
- colSet.add(this.colOfCell(k));
405
+ colSet.add(colOfCell(k));
462
406
  });
463
407
  let cols = Array.from(colSet);
464
408
  // 因为excel的列都是连续的,如果导出table存在跨列的话这里面可能却少某一列,所以需要补充缺少的列名保证这一段是连续的
465
409
  let cursor = cols[0];
466
410
  for (let i = 0; i < ref['!cols'].length - 1; i++) {
467
- const next = this.nextColOfCell(cursor);
411
+ const next = nextColOfCell(cursor);
468
412
  colSet.add(next);
469
413
  cursor = next;
470
414
  }
@@ -550,10 +494,7 @@ class SpreadsheetService {
550
494
  async saveAsFile(wb, fileName) {
551
495
  const excelData = await wb.xlsx.writeBuffer();
552
496
  const blob = new Blob([excelData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /* MediaType.Xlsx */ });
553
- const anchor = document.createElement('a');
554
- anchor.href = URL.createObjectURL(blob);
555
- anchor.download = fileName + '.xlsx';
556
- anchor.click();
497
+ this.fileManager.save(blob, fileName + '.xlsx');
557
498
  }
558
499
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpreadsheetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
559
500
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpreadsheetService, providedIn: 'root' }); }
@@ -564,6 +505,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
564
505
  providedIn: 'root'
565
506
  }]
566
507
  }] });
508
+ /**
509
+ * 根据当前的单元格找到下一列的地址
510
+ * 采用倒序进位法,这样就不需要递归了
511
+ */
512
+ function nextColOfCell(cell) {
513
+ // 先把字母和数字分开,字母是列,数字是行,倒序排列
514
+ const args = cell.match(CHAR_PATTERN).reverse();
515
+ let needAppend = false;
516
+ for (let i = 0; i < args.length; i++) {
517
+ const arg = args[i];
518
+ if (arg !== 'Z') {
519
+ const idx = EXCEL_COL_ALIAS.indexOf(arg);
520
+ args[i] = EXCEL_COL_ALIAS[idx + 1];
521
+ break;
522
+ }
523
+ else {
524
+ args[i] = 'A';
525
+ if (i === args.length - 1) { // 说明是最后一个了,需要补A
526
+ needAppend = true;
527
+ }
528
+ }
529
+ }
530
+ if (needAppend) {
531
+ args.push('A');
532
+ }
533
+ return args.reverse().join(''); // 最终的结果,反转再合并
534
+ }
535
+ /**
536
+ * 获取单元格的行
537
+ */
538
+ function rowOfCell(cell) {
539
+ return cell.match(NUMBER_PATTERN).join('');
540
+ }
541
+ /**
542
+ * 获取单元格的列
543
+ */
544
+ function colOfCell(cell) {
545
+ return cell.match(CHAR_PATTERN).join('');
546
+ }
547
+ /**
548
+ * 单元格的列号
549
+ * 当作26进制计算列的编号
550
+ */
551
+ function colNumberOfCell(cell) {
552
+ let col = 0;
553
+ cell.match(CHAR_PATTERN).reverse().forEach((c, i) => {
554
+ if (i == 0) {
555
+ // 个位
556
+ col += EXCEL_COL_ALIAS.indexOf(c) + 1;
557
+ }
558
+ else {
559
+ // 十位以上
560
+ col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;
561
+ }
562
+ });
563
+ return col;
564
+ }
567
565
 
568
566
  class LocalStorage {
569
567
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"solar-angular-platform-browser.mjs","sources":["../../../packages/platform-browser/src/file-manager.ts","../../../packages/platform-browser/src/fullscreen.service.ts","../../../packages/platform-browser/src/image-compressor.ts","../../../packages/platform-browser/src/resource-loader.ts","../../../packages/platform-browser/src/spreadsheet.service.ts","../../../packages/platform-browser/src/storage/local-storage.ts","../../../packages/platform-browser/src/storage/session-storage.ts","../../../packages/platform-browser/src/solar-angular-platform-browser.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FileManager {\n private readonly document = inject(DOCUMENT);\n\n /**\n * Opens a file picker dialog to allow the user to select files.\n *\n * @param options - Configuration options for the file picker.\n * @param options.accept - A string or array of strings specifying the file types accepted by the file picker.\n * @param options.multiple - If `true`, allows multiple file selections.\n * @returns A promise that resolves with an array of selected `File` objects.\n */\n pick(options: { accept?: string | string[]; multiple?: boolean }) {\n const input = this.document.createElement('input');\n input.type = 'file';\n input.accept = Array.isArray(options.accept) ? options.accept.join(',') : options.accept || '';\n input.multiple = !!options.multiple;\n\n return new Promise<File[]>((resolve, reject) => {\n input.onchange = () => {\n resolve(Array.from(input.files || []));\n };\n input.onerror = reject;\n input.click();\n });\n }\n\n async download(url: string, filename?: string) {\n const response = await fetch(url);\n const blob = await response.blob();\n this.save(blob, filename ?? new URL(url).pathname.split('/').pop()!)\n return blob;\n }\n\n save(blob: Blob, filename: string) {\n const anchor = this.document.createElement('a');\n anchor.href = URL.createObjectURL(blob);\n anchor.download = filename;\n anchor.click();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FullscreenService {\n private readonly document: Document = inject(DOCUMENT);\n\n /**\n * 切换全屏\n * @param target\n * @param options\n */\n toggle(target: HTMLElement = this.document.documentElement, options?: FullscreenOptions): Promise<void> {\n if (this.isFullscreen(target)) {\n return this.document.exitFullscreen();\n }\n\n return target.requestFullscreen(options);\n }\n\n /**\n * 元素是否为全屏\n * @param target\n */\n isFullscreen(target: HTMLElement = this.document.documentElement): boolean {\n return target === this.document.fullscreenElement;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, from } from 'rxjs';\n\n/**\n * 目前 NG 库 中还不能包含 WebWorker,这里使用 DI 的方式,由 App 提供 WebWorker:\n * ```ts\n * {\n * provide: IMAGE_COMPRESSOR_WEBWORKER_FACTORY,\n * useValue: () => new Worker(new URL('xxx.worker', import.meta.url), { type: 'module' })\n * }\n * ```\n * https://github.com/angular/angular-cli/issues/15059\n */\nexport const SUN_IMAGE_COMPRESSOR_WORKER_FACTORY = new InjectionToken<() => Worker>(\n 'ImageCompressorWorkerFactory'\n);\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ImageCompressor {\n private _format?: 'webp' | 'jpeg' | 'png';\n private document = inject(DOCUMENT);\n private workerFactory = inject(SUN_IMAGE_COMPRESSOR_WORKER_FACTORY, { optional: true });\n private canvas = this.document.createElement('canvas');\n\n /** 最佳图片格式,优先级:webp -> jpeg -> png */\n get format() {\n return this._format || (this._format = this.isSupportWEBP ? 'webp' : this.isSupportJPEG ? 'jpeg' : 'png');\n }\n\n /**\n * 是否支持WebP格式\n */\n get isSupportWEBP(): boolean {\n try {\n return this.canvas.toDataURL('image/webp').startsWith('data:image/webp');\n } catch (e) {\n return false;\n }\n }\n\n /**\n * 是否支持JPEG格式\n */\n get isSupportJPEG(): boolean {\n try {\n return this.canvas.toDataURL('image/jpeg').startsWith('data:image/jpeg');\n } catch (e) {\n return false;\n }\n }\n\n /**\n * 压缩图片\n * @param src 图片URL\n * @param quality 质量\n */\n compress(src: string, quality = 0.85): Observable<Blob> {\n const format = this.format;\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n return new Observable<Blob>((observer) => {\n img.onload = () => {\n this.resize(img);\n\n (('OffscreenCanvas' in window && this.workerFactory) ? this.drawInWorker(img, quality, format) : this.draw(img, quality, format)).subscribe(blob => {\n observer.next(blob);\n observer.complete();\n });\n };\n\n img.onerror = (error: Event | string) => {\n observer.error(error);\n observer.complete();\n };\n\n img.src = src;\n });\n }\n\n /**\n * 调整图像尺寸\n * @param img\n */\n private resize(img: HTMLImageElement) {\n const maxWidth = 1280;\n const maxHeight = 720;\n\n if (img.width > maxWidth) {\n const divisor = img.width / maxWidth;\n img.width /= divisor;\n img.height /= divisor;\n }\n\n if (img.height > maxHeight) {\n const divisor = img.height / maxHeight;\n img.width /= divisor;\n img.height /= divisor;\n }\n }\n\n /**\n * 在主线程中绘制\n * @param img 图像\n * @param quality 质量\n * @param format 格式\n */\n draw(img: HTMLImageElement, quality: number, format: string) {\n return new Observable<Blob>(observer => {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n canvas.toBlob(blob => {\n observer.next(blob!);\n observer.complete();\n }, 'image/' + format, quality);\n });\n }\n\n /**\n * 在WebWorker线程中绘制\n * @param img 图像\n * @param quality 质量\n * @param format 格式\n */\n drawInWorker(img: HTMLImageElement, quality: number, format: string) {\n const worker = this.workerFactory!();\n\n return new Observable<Blob>(observer => {\n const complete = () => {\n worker.terminate();\n observer.complete();\n };\n\n this.createImageBitmap(img).subscribe({\n next: imageBitmap => {\n worker.onmessage = ({ data }) => {\n observer.next(data);\n complete();\n };\n\n worker.onerror = error => {\n observer.error(error);\n complete();\n };\n\n worker.postMessage({ quality, format, imageBitmap }, [imageBitmap]);\n },\n error: error => {\n observer.error(error);\n complete();\n }\n });\n });\n }\n\n /**\n * 创建图像位图\n * @param img 图像源\n */\n createImageBitmap(img: HTMLImageElement): Observable<ImageBitmap> {\n return from(window.createImageBitmap(img, {\n resizeWidth: img.width,\n resizeHeight: img.height\n }).then(bitmap => {\n // 某些情况下,图片宽度与高度会调换,因此这里要做一个判断\n if (bitmap.width !== img.width) {\n return window.createImageBitmap(img, {\n resizeWidth: img.height,\n resizeHeight: img.width\n });\n }\n\n return bitmap;\n }));\n }\n\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ResourceLoader {\n private readonly document = inject(DOCUMENT);\n\n loadScript(url: string) {\n return new Promise<void>((resolve, reject) => {\n const script: HTMLScriptElement = this.document.createElement('script');\n script.type = 'text/javascript';\n script.src = url;\n\n script.onload = () => resolve();\n script.onerror = () => {\n this.document.head.removeChild(script);\n reject();\n };\n\n this.document.head.appendChild(script);\n });\n }\n\n loadStylesheet(url: string) {\n return new Promise<void>((resolve, reject) => {\n const link: HTMLLinkElement = this.document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = url;\n\n link.onload = () => resolve();\n link.onerror = () => {\n this.document.head.removeChild(link);\n reject();\n };\n\n this.document.head.appendChild(link);\n });\n }\n}\n","import { DatePipe, DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport { MediaType } from '@solar-kit/core';\nimport { defer, firstValueFrom, map, shareReplay } from 'rxjs';\nimport { ResourceLoader } from './resource-loader';\n// 不默认集成exceljs了,需要的时候注入XlsxService动态加载,因为不是每个地方都需要导出excel\n// import {TableParser, Workbook} from 'aieyes-exceljs-o';\ndeclare let ExcelJS: any; // from exceljs\n\nconst EXCEL_COL_ALIAS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst NUMBER_PATTERN = /[0-9]/g;\nconst CHAR_PATTERN = /[a-zA-Z]/g;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SpreadsheetService {\n private readonly document: Document = inject(DOCUMENT);\n private readonly resourceLoader = inject(ResourceLoader);\n private readonly datePipe = new DatePipe('zh-CN');\n\n // ExcelJS 对象,用时异步自动加载\n private readonly excel = defer(() => Promise.all([\n this.resourceLoader.loadScript('https://img.omofresh.com/js/aieyes-exceljs-o_1_8_10.min.js'), // 修改过的 https://www.npmjs.com/package/aieyes-exceljs-o\n this.resourceLoader.loadStylesheet('https://img.omofresh.com/css/exceljs.min.css'), // aieyes-exceljs-o 中定义的\n ])).pipe(\n map(() => ExcelJS),\n shareReplay(1)\n );\n\n /**\n * 根据当前的单元格找到下一列的地址\n * 采用倒序进位法,这样就不需要递归了\n */\n private nextColOfCell(cell: string) {\n // 先把字母和数字分开,字母是列,数字是行,倒序排列\n const args = cell.match(CHAR_PATTERN)!.reverse();\n let needAppend = false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg !== 'Z') {\n const idx = EXCEL_COL_ALIAS.indexOf(arg);\n args[i] = EXCEL_COL_ALIAS[idx + 1];\n break;\n } else {\n args[i] = 'A';\n if (i === args.length - 1) { // 说明是最后一个了,需要补A\n needAppend = true;\n }\n }\n }\n if (needAppend) {\n args.push('A');\n }\n return args.reverse().join(''); // 最终的结果,反转再合并\n }\n\n /**\n * 获取单元格的行\n */\n private rowOfCell(cell: string) {\n return cell.match(NUMBER_PATTERN)!.join('');\n }\n\n /**\n * 获取单元格的列\n */\n private colOfCell(cell: string) {\n return cell.match(CHAR_PATTERN)!.join('');\n }\n\n /**\n * 单元格的列号\n * 当作26进制计算列的编号\n */\n private colNumberOfCell(cell: string) {\n let col = 0;\n cell.match(CHAR_PATTERN)!.reverse().forEach((c, i) => {\n if (i == 0) {\n // 个位\n col += EXCEL_COL_ALIAS.indexOf(c) + 1;\n } else {\n // 十位以上\n col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;\n }\n });\n return col;\n }\n\n private async parseDomTable(table: HTMLElement, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n return excel.TableParser.utils.parseDomTable(table, _opts);\n }\n\n /**\n * 只导出一个table, 内容放在第一个sheet上\n */\n async exportDomTableById(tableId: string, fileName: string, _opts?: any) {\n const table = this.document.getElementById(tableId)!;\n const excel = await firstValueFrom(this.excel);\n const wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n const re = await this.exportDomTable(wb, ws, table, null, null, _opts);\n await this.saveAsFile(re.wb, fileName);\n }\n\n /**\n * 导出多个table, 内容放在多个sheet上\n */\n async exportDomTableSheets(tableIds: string[], sheetNames: string[], fileName: string, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n let wb = new excel.Workbook();\n\n for (let index = 0; index < tableIds.length; index++) {\n const table = this.document.getElementById(tableIds[index])!;\n const sheetName = sheetNames[index];\n const ws = wb.addWorksheet(sheetName);\n const re = await this.exportDomTable(wb, ws, table, null, null, _opts);\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 在一页中导出多个table, 每个table默认间隔1列\n */\n async exportDomTableParallel(tableIds: string[], fileName: string, gap = 1, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n\n let wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n let cursor = 'A'; // 从第一列开始导出,并列几个table\n\n for (const tableId of tableIds) {\n const table = this.document.getElementById(tableId)!;\n const re = await this.exportDomTable(wb, ws, table, cursor, null, _opts);\n const lastCol = re.cols[re.cols.length - 1];\n cursor = this.nextColOfCell(lastCol);\n for (let k = 0; k < gap; k++) {\n cursor = this.nextColOfCell(cursor);\n }\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 在一页中垂直导出多个table\n */\n async exportDomTableVertical(tableIds: string[], fileName: string, gap = 0, _opts?: any) {\n let rowOffset = 0;\n const excel = await firstValueFrom(this.excel);\n let wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n\n for (const tableId of tableIds) {\n const table = this.document.getElementById(tableId)!;\n const re = await this.exportDomTable(wb, ws, table, null, rowOffset, _opts);\n rowOffset += re.rows.length + gap;\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 导出dom table\n * colCursor: 标记起始列\n * rowOffset: 偏移的行数\n * @return 返回最后一列的列名\n */\n private async exportDomTable(wb: any, ws: any, table: HTMLElement, colCursor?: string | null, rowOffset?: number | null, _opts?: any) {\n if (!_opts) {\n _opts = { cellDates: true, dateNF: 'yyyy/M/d' }; // 默认的日期格式\n } else {\n _opts.cellDates = true;\n }\n\n const ref = await this.parseDomTable(table, _opts);\n let colOffset = 0; // colCursor偏移量,默认为0\n if (colCursor) {\n const c = ws.getColumn(colCursor);\n colOffset = c.number - 1;\n }\n rowOffset = rowOffset || 0; // rowOffset默认为0\n const cellMap: Record<string, any> = {};\n Object.keys(ref).sort().forEach(cellAlias => {\n if (!cellAlias.startsWith('!')) {\n let rowNum = this.rowOfCell(cellAlias);\n rowNum = String(parseInt(rowNum, 10) + rowOffset);\n const colNum = this.colNumberOfCell(cellAlias);\n const col = ws.getColumn(colOffset + colNum); // 根据偏移量找出所在的列\n const finalCell = col.letter + rowNum;\n cellMap[finalCell] = ref[cellAlias];\n }\n });\n const colSet = new Set<string>();\n Object.keys(cellMap).forEach(k => {\n colSet.add(this.colOfCell(k));\n });\n let cols = Array.from(colSet);\n // 因为excel的列都是连续的,如果导出table存在跨列的话这里面可能却少某一列,所以需要补充缺少的列名保证这一段是连续的\n let cursor = cols[0];\n for (let i = 0; i < ref['!cols'].length - 1; i++) {\n const next = this.nextColOfCell(cursor);\n colSet.add(next);\n cursor = next;\n }\n cols = Array.from(colSet).sort((a: string, b: string) => {\n if (a.length === b.length) {\n return a.localeCompare(b);\n } else if (a.length > b.length) {\n return 1;\n } else if (b.length > a.length) {\n return -1;\n }\n return -1;\n });\n // 赋值\n Object.keys(cellMap).forEach(alias => {\n const cell = ws.getCell(alias);\n const cellConfig = cellMap[alias];\n if (cellConfig.t === 'd') { // 日期格式需格式化后显示,换言之转为了字符串\n cell.value = this.datePipe.transform(cellConfig.v, cellConfig.z);\n } else {\n cell.value = cellConfig.v;\n }\n // 默认就有边框的\n if (cellConfig.style.bordered) { // 表示需要加边框\n cell.style.border = {\n top: { style: 'thin' },\n left: { style: 'thin' },\n bottom: { style: 'thin' },\n right: { style: 'thin' }\n };\n }\n // 默认内容垂直居中,左右居中不一定\n cell.style.alignment = {\n horizontal: cellConfig.style.align,\n vertical: 'middle',\n wrapText: true\n };\n // 字体默认为宋体\n cell.style.font = {\n bold: cellConfig.style.bold,\n name: '宋体',\n size: cellConfig.style.pound // 字号\n };\n // 背景色/前景色\n if (cellConfig.style.background) {\n cell.fill = {\n type: 'pattern',\n pattern: 'solid',\n fgColor: { argb: cellConfig.style.background }, // 实际上fgColor是理解上的背景色,而不是前景色,不知道excel怎么定义的\n // bgColor: {argb: 'ffd8e6de'}\n } as any;\n }\n });\n // 设置每行的高度\n (ref['!rows'] as any[]).forEach((rowConfig, rowIndex) => {\n const row = ws.getRow(rowIndex + rowOffset + 1);\n row.height = rowConfig.height;\n });\n // 设置列宽\n (ref['!cols'] as any[]).forEach((colConfig, colIndex) => {\n const colAlias = cols[colIndex];\n const col = ws.getColumn(colAlias);\n if (colConfig.width) {\n col.width = colConfig.width;\n }\n });\n // 合并单元格, 由于不一定有,所以要判断一下\n (ref['!merges'] as any[] | null)?.forEach(mergeParam => {\n const s = mergeParam['s'];\n const e = mergeParam['e'];\n const startCell = ws.getCell(rowOffset + s.r + 1, colOffset + s.c + 1);\n const endCell = ws.getCell(rowOffset + e.r + 1, colOffset + e.c + 1);\n ws.mergeCells([startCell.address, endCell.address]);\n });\n return { wb, cols, rows: ref['!rows'] };\n }\n\n /**\n * 保存Workbook到磁盘上\n */\n private async saveAsFile(wb: any, fileName: string) {\n const excelData = await wb.xlsx.writeBuffer();\n const blob = new Blob([excelData], { type: MediaType.Xlsx });\n const anchor = document.createElement('a');\n anchor.href = URL.createObjectURL(blob);\n anchor.download = fileName + '.xlsx';\n anchor.click();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalStorage {\n private readonly storage = inject(DOCUMENT).defaultView!.localStorage;\n\n /**\n * 保存数据\n * @param key 键名\n * @param value 数据\n */\n set<T = any>(key: string, value: T): void {\n this.storage.setItem(key, JSON.stringify(value));\n }\n\n /**\n * 获取数据\n * @param key 键名\n */\n get<T>(key: string): T | null {\n const data = this.storage.getItem(key);\n return data ? JSON.parse(data) : null;\n }\n\n /**\n * 移除数据\n * @param key 键名\n */\n remove(key: string): void {\n this.storage.removeItem(key);\n }\n\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SessionStorage {\n private readonly storage = inject(DOCUMENT).defaultView!.sessionStorage;\n\n /**\n * 保存数据\n * @param key 键名\n * @param value 数据\n */\n set<T = any>(key: string, value: T): void {\n this.storage.setItem(key, JSON.stringify(value));\n }\n\n /**\n * 获取数据\n * @param key 键名\n * @param defaults 默认值\n */\n get<T = any>(key: string): T | null {\n const data = this.storage.getItem(key);\n return data ? JSON.parse(data) : null;\n }\n\n /**\n * 移除数据\n * @param key 键名\n */\n remove(key: string): void {\n this.storage.removeItem(key);\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solar-angular-platform-browser.mjs","sources":["../../../packages/platform-browser/src/file-manager.ts","../../../packages/platform-browser/src/fullscreen.service.ts","../../../packages/platform-browser/src/image-compressor.ts","../../../packages/platform-browser/src/resource-loader.ts","../../../packages/platform-browser/src/spreadsheet.service.ts","../../../packages/platform-browser/src/storage/local-storage.ts","../../../packages/platform-browser/src/storage/session-storage.ts","../../../packages/platform-browser/src/solar-angular-platform-browser.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FileManager {\n private readonly document = inject(DOCUMENT);\n\n /**\n * Opens a file picker dialog to allow the user to select files.\n *\n * @param options - Configuration options for the file picker.\n * @param options.accept - A string or array of strings specifying the file types accepted by the file picker.\n * @param options.multiple - If `true`, allows multiple file selections.\n * @returns A promise that resolves with an array of selected `File` objects.\n */\n pick(options: { accept?: string | string[]; multiple?: boolean }) {\n const input = this.document.createElement('input');\n input.type = 'file';\n input.accept = Array.isArray(options.accept) ? options.accept.join(',') : options.accept || '';\n input.multiple = !!options.multiple;\n\n return new Promise<File[]>((resolve, reject) => {\n input.onchange = () => {\n resolve(Array.from(input.files || []));\n };\n input.onerror = reject;\n input.click();\n });\n }\n\n async download(url: string, filename?: string) {\n const response = await fetch(url);\n const blob = await response.blob();\n this.save(blob, filename ?? new URL(url).pathname.split('/').pop()!)\n return blob;\n }\n\n save(blob: Blob, filename: string) {\n const anchor = this.document.createElement('a');\n anchor.href = URL.createObjectURL(blob);\n anchor.download = filename;\n anchor.click();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FullscreenService {\n private readonly document: Document = inject(DOCUMENT);\n\n /**\n * 切换全屏\n * @param target\n * @param options\n */\n toggle(target: HTMLElement = this.document.documentElement, options?: FullscreenOptions): Promise<void> {\n if (this.isFullscreen(target)) {\n return this.document.exitFullscreen();\n }\n\n return target.requestFullscreen(options);\n }\n\n /**\n * 元素是否为全屏\n * @param target\n */\n isFullscreen(target: HTMLElement = this.document.documentElement): boolean {\n return target === this.document.fullscreenElement;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, from } from 'rxjs';\n\n/**\n * 目前 NG 库 中还不能包含 WebWorker,这里使用 DI 的方式,由 App 提供 WebWorker:\n * ```ts\n * {\n * provide: IMAGE_COMPRESSOR_WEBWORKER_FACTORY,\n * useValue: () => new Worker(new URL('xxx.worker', import.meta.url), { type: 'module' })\n * }\n * ```\n * https://github.com/angular/angular-cli/issues/15059\n */\nexport const SUN_IMAGE_COMPRESSOR_WORKER_FACTORY = new InjectionToken<() => Worker>(\n 'ImageCompressorWorkerFactory'\n);\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ImageCompressor {\n private _format?: 'webp' | 'jpeg' | 'png';\n private document = inject(DOCUMENT);\n private workerFactory = inject(SUN_IMAGE_COMPRESSOR_WORKER_FACTORY, { optional: true });\n private canvas = this.document.createElement('canvas');\n\n /** 最佳图片格式,优先级:webp -> jpeg -> png */\n get format() {\n return this._format || (this._format = this.isSupportWEBP ? 'webp' : this.isSupportJPEG ? 'jpeg' : 'png');\n }\n\n /**\n * 是否支持WebP格式\n */\n get isSupportWEBP(): boolean {\n try {\n return this.canvas.toDataURL('image/webp').startsWith('data:image/webp');\n } catch (e) {\n return false;\n }\n }\n\n /**\n * 是否支持JPEG格式\n */\n get isSupportJPEG(): boolean {\n try {\n return this.canvas.toDataURL('image/jpeg').startsWith('data:image/jpeg');\n } catch (e) {\n return false;\n }\n }\n\n /**\n * 压缩图片\n * @param src 图片URL\n * @param quality 质量\n */\n compress(src: string, quality = 0.85): Observable<Blob> {\n const format = this.format;\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n return new Observable<Blob>((observer) => {\n img.onload = () => {\n this.resize(img);\n\n (('OffscreenCanvas' in window && this.workerFactory) ? this.drawInWorker(img, quality, format) : this.draw(img, quality, format)).subscribe(blob => {\n observer.next(blob);\n observer.complete();\n });\n };\n\n img.onerror = (error: Event | string) => {\n observer.error(error);\n observer.complete();\n };\n\n img.src = src;\n });\n }\n\n /**\n * 调整图像尺寸\n * @param img\n */\n private resize(img: HTMLImageElement) {\n const maxWidth = 1280;\n const maxHeight = 720;\n\n if (img.width > maxWidth) {\n const divisor = img.width / maxWidth;\n img.width /= divisor;\n img.height /= divisor;\n }\n\n if (img.height > maxHeight) {\n const divisor = img.height / maxHeight;\n img.width /= divisor;\n img.height /= divisor;\n }\n }\n\n /**\n * 在主线程中绘制\n * @param img 图像\n * @param quality 质量\n * @param format 格式\n */\n draw(img: HTMLImageElement, quality: number, format: string) {\n return new Observable<Blob>(observer => {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n canvas.toBlob(blob => {\n observer.next(blob!);\n observer.complete();\n }, 'image/' + format, quality);\n });\n }\n\n /**\n * 在WebWorker线程中绘制\n * @param img 图像\n * @param quality 质量\n * @param format 格式\n */\n drawInWorker(img: HTMLImageElement, quality: number, format: string) {\n const worker = this.workerFactory!();\n\n return new Observable<Blob>(observer => {\n const complete = () => {\n worker.terminate();\n observer.complete();\n };\n\n this.createImageBitmap(img).subscribe({\n next: imageBitmap => {\n worker.onmessage = ({ data }) => {\n observer.next(data);\n complete();\n };\n\n worker.onerror = error => {\n observer.error(error);\n complete();\n };\n\n worker.postMessage({ quality, format, imageBitmap }, [imageBitmap]);\n },\n error: error => {\n observer.error(error);\n complete();\n }\n });\n });\n }\n\n /**\n * 创建图像位图\n * @param img 图像源\n */\n createImageBitmap(img: HTMLImageElement): Observable<ImageBitmap> {\n return from(window.createImageBitmap(img, {\n resizeWidth: img.width,\n resizeHeight: img.height\n }).then(bitmap => {\n // 某些情况下,图片宽度与高度会调换,因此这里要做一个判断\n if (bitmap.width !== img.width) {\n return window.createImageBitmap(img, {\n resizeWidth: img.height,\n resizeHeight: img.width\n });\n }\n\n return bitmap;\n }));\n }\n\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ResourceLoader {\n private readonly document = inject(DOCUMENT);\n\n loadScript(url: string) {\n return new Promise<void>((resolve, reject) => {\n const script: HTMLScriptElement = this.document.createElement('script');\n script.type = 'text/javascript';\n script.src = url;\n\n script.onload = () => resolve();\n script.onerror = () => {\n this.document.head.removeChild(script);\n reject();\n };\n\n this.document.head.appendChild(script);\n });\n }\n\n loadStylesheet(url: string) {\n return new Promise<void>((resolve, reject) => {\n const link: HTMLLinkElement = this.document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = url;\n\n link.onload = () => resolve();\n link.onerror = () => {\n this.document.head.removeChild(link);\n reject();\n };\n\n this.document.head.appendChild(link);\n });\n }\n}\n","import { DatePipe, DOCUMENT } from '@angular/common';\nimport { inject, Injectable, LOCALE_ID } from '@angular/core';\nimport { MediaType } from '@solar-kit/core';\nimport { defer, firstValueFrom, map, shareReplay } from 'rxjs';\nimport { FileManager } from './file-manager';\nimport { ResourceLoader } from './resource-loader';\n// 不默认集成exceljs了,需要的时候注入XlsxService动态加载,因为不是每个地方都需要导出excel\n// import {TableParser, Workbook} from 'aieyes-exceljs-o';\ndeclare let ExcelJS: any; // from exceljs\n\nconst EXCEL_COL_ALIAS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst NUMBER_PATTERN = /[0-9]/g;\nconst CHAR_PATTERN = /[a-zA-Z]/g;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SpreadsheetService {\n private readonly document: Document = inject(DOCUMENT);\n private readonly resourceLoader = inject(ResourceLoader);\n private readonly fileManager = inject(FileManager);\n private readonly datePipe = new DatePipe(inject(LOCALE_ID));\n\n // ExcelJS 对象,用时异步自动加载\n private readonly excel = defer(() => Promise.all([\n this.resourceLoader.loadScript('https://img.omofresh.com/js/aieyes-exceljs-o_1_8_10.min.js'), // 修改过的 https://www.npmjs.com/package/aieyes-exceljs-o\n this.resourceLoader.loadStylesheet('https://img.omofresh.com/css/exceljs.min.css'), // aieyes-exceljs-o 中定义的\n ])).pipe(\n map(() => ExcelJS),\n shareReplay(1)\n );\n\n private async parseElement(table: HTMLTableElement, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n return excel.TableParser.utils.parseDomTable(table, _opts);\n }\n\n /**\n * 只导出一个table, 内容放在第一个sheet上\n */\n async exportTable(idOrElement: string | HTMLTableElement, fileName: string, _opts?: any) {\n const table = typeof idOrElement === 'string' ? this.document.getElementById(idOrElement)! as HTMLTableElement : idOrElement;\n const excel = await firstValueFrom(this.excel);\n const wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n const re = await this.export(wb, ws, table, null, null, _opts);\n await this.saveAsFile(re.wb, fileName);\n }\n\n /**\n * 导出多个table, 内容放在多个sheet上\n */\n async exportTableSheets(tableIds: string[], sheetNames: string[], fileName: string, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n let wb = new excel.Workbook();\n\n for (let index = 0; index < tableIds.length; index++) {\n const table = this.document.getElementById(tableIds[index]) as HTMLTableElement;\n const sheetName = sheetNames[index];\n const ws = wb.addWorksheet(sheetName);\n const re = await this.export(wb, ws, table, null, null, _opts);\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 在一页中导出多个table, 每个table默认间隔1列\n */\n async exportTableParallel(tableIds: string[], fileName: string, gap = 1, _opts?: any) {\n const excel = await firstValueFrom(this.excel);\n\n let wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n let cursor = 'A'; // 从第一列开始导出,并列几个table\n\n for (const tableId of tableIds) {\n const table = this.document.getElementById(tableId) as HTMLTableElement;\n const re = await this.export(wb, ws, table, cursor, null, _opts);\n const lastCol = re.cols[re.cols.length - 1];\n cursor = nextColOfCell(lastCol);\n for (let k = 0; k < gap; k++) {\n cursor = nextColOfCell(cursor);\n }\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 在一页中垂直导出多个table\n */\n async exportTableVertical(tableIds: string[], fileName: string, gap = 0, _opts?: any) {\n let rowOffset = 0;\n const excel = await firstValueFrom(this.excel);\n let wb = new excel.Workbook();\n const ws = wb.addWorksheet(fileName);\n\n for (const tableId of tableIds) {\n const table = this.document.getElementById(tableId) as HTMLTableElement;\n const re = await this.export(wb, ws, table, null, rowOffset, _opts);\n rowOffset += re.rows.length + gap;\n wb = re.wb;\n }\n\n await this.saveAsFile(wb, fileName);\n }\n\n /**\n * 导出dom table\n * colCursor: 标记起始列\n * rowOffset: 偏移的行数\n * @return 返回最后一列的列名\n */\n private async export(wb: any, ws: any, table: HTMLTableElement, colCursor?: string | null, rowOffset?: number | null, _opts?: any) {\n if (!_opts) {\n _opts = { cellDates: true, dateNF: 'yyyy/M/d' }; // 默认的日期格式\n } else {\n _opts.cellDates = true;\n }\n\n const ref = await this.parseElement(table, _opts);\n let colOffset = 0; // colCursor偏移量,默认为0\n if (colCursor) {\n const c = ws.getColumn(colCursor);\n colOffset = c.number - 1;\n }\n rowOffset = rowOffset || 0; // rowOffset默认为0\n const cellMap: Record<string, any> = {};\n Object.keys(ref).sort().forEach(cellAlias => {\n if (!cellAlias.startsWith('!')) {\n let rowNum = rowOfCell(cellAlias);\n rowNum = String(parseInt(rowNum, 10) + rowOffset);\n const colNum = colNumberOfCell(cellAlias);\n const col = ws.getColumn(colOffset + colNum); // 根据偏移量找出所在的列\n const finalCell = col.letter + rowNum;\n cellMap[finalCell] = ref[cellAlias];\n }\n });\n const colSet = new Set<string>();\n Object.keys(cellMap).forEach(k => {\n colSet.add(colOfCell(k));\n });\n let cols = Array.from(colSet);\n // 因为excel的列都是连续的,如果导出table存在跨列的话这里面可能却少某一列,所以需要补充缺少的列名保证这一段是连续的\n let cursor = cols[0];\n for (let i = 0; i < ref['!cols'].length - 1; i++) {\n const next = nextColOfCell(cursor);\n colSet.add(next);\n cursor = next;\n }\n cols = Array.from(colSet).sort((a: string, b: string) => {\n if (a.length === b.length) {\n return a.localeCompare(b);\n } else if (a.length > b.length) {\n return 1;\n } else if (b.length > a.length) {\n return -1;\n }\n return -1;\n });\n // 赋值\n Object.keys(cellMap).forEach(alias => {\n const cell = ws.getCell(alias);\n const cellConfig = cellMap[alias];\n if (cellConfig.t === 'd') { // 日期格式需格式化后显示,换言之转为了字符串\n cell.value = this.datePipe.transform(cellConfig.v, cellConfig.z);\n } else {\n cell.value = cellConfig.v;\n }\n // 默认就有边框的\n if (cellConfig.style.bordered) { // 表示需要加边框\n cell.style.border = {\n top: { style: 'thin' },\n left: { style: 'thin' },\n bottom: { style: 'thin' },\n right: { style: 'thin' }\n };\n }\n // 默认内容垂直居中,左右居中不一定\n cell.style.alignment = {\n horizontal: cellConfig.style.align,\n vertical: 'middle',\n wrapText: true\n };\n // 字体默认为宋体\n cell.style.font = {\n bold: cellConfig.style.bold,\n name: '宋体',\n size: cellConfig.style.pound // 字号\n };\n // 背景色/前景色\n if (cellConfig.style.background) {\n cell.fill = {\n type: 'pattern',\n pattern: 'solid',\n fgColor: { argb: cellConfig.style.background }, // 实际上fgColor是理解上的背景色,而不是前景色,不知道excel怎么定义的\n // bgColor: {argb: 'ffd8e6de'}\n } as any;\n }\n });\n // 设置每行的高度\n (ref['!rows'] as any[]).forEach((rowConfig, rowIndex) => {\n const row = ws.getRow(rowIndex + rowOffset + 1);\n row.height = rowConfig.height;\n });\n // 设置列宽\n (ref['!cols'] as any[]).forEach((colConfig, colIndex) => {\n const colAlias = cols[colIndex];\n const col = ws.getColumn(colAlias);\n if (colConfig.width) {\n col.width = colConfig.width;\n }\n });\n // 合并单元格, 由于不一定有,所以要判断一下\n (ref['!merges'] as any[] | null)?.forEach(mergeParam => {\n const s = mergeParam['s'];\n const e = mergeParam['e'];\n const startCell = ws.getCell(rowOffset + s.r + 1, colOffset + s.c + 1);\n const endCell = ws.getCell(rowOffset + e.r + 1, colOffset + e.c + 1);\n ws.mergeCells([startCell.address, endCell.address]);\n });\n return { wb, cols, rows: ref['!rows'] };\n }\n\n /**\n * 保存Workbook到磁盘上\n */\n private async saveAsFile(wb: any, fileName: string) {\n const excelData = await wb.xlsx.writeBuffer();\n const blob = new Blob([excelData], { type: MediaType.Xlsx });\n this.fileManager.save(blob, fileName + '.xlsx')\n }\n}\n\n/**\n * 根据当前的单元格找到下一列的地址\n * 采用倒序进位法,这样就不需要递归了\n */\nfunction nextColOfCell(cell: string) {\n // 先把字母和数字分开,字母是列,数字是行,倒序排列\n const args = cell.match(CHAR_PATTERN)!.reverse();\n let needAppend = false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg !== 'Z') {\n const idx = EXCEL_COL_ALIAS.indexOf(arg);\n args[i] = EXCEL_COL_ALIAS[idx + 1];\n break;\n } else {\n args[i] = 'A';\n if (i === args.length - 1) { // 说明是最后一个了,需要补A\n needAppend = true;\n }\n }\n }\n if (needAppend) {\n args.push('A');\n }\n return args.reverse().join(''); // 最终的结果,反转再合并\n}\n\n/**\n * 获取单元格的行\n */\nfunction rowOfCell(cell: string) {\n return cell.match(NUMBER_PATTERN)!.join('');\n}\n\n/**\n * 获取单元格的列\n */\nfunction colOfCell(cell: string) {\n return cell.match(CHAR_PATTERN)!.join('');\n}\n\n/**\n * 单元格的列号\n * 当作26进制计算列的编号\n */\nfunction colNumberOfCell(cell: string) {\n let col = 0;\n cell.match(CHAR_PATTERN)!.reverse().forEach((c, i) => {\n if (i == 0) {\n // 个位\n col += EXCEL_COL_ALIAS.indexOf(c) + 1;\n } else {\n // 十位以上\n col += (EXCEL_COL_ALIAS.indexOf(c) + 1) * i * 26;\n }\n });\n return col;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocalStorage {\n private readonly storage = inject(DOCUMENT).defaultView!.localStorage;\n\n /**\n * 保存数据\n * @param key 键名\n * @param value 数据\n */\n set<T = any>(key: string, value: T): void {\n this.storage.setItem(key, JSON.stringify(value));\n }\n\n /**\n * 获取数据\n * @param key 键名\n */\n get<T>(key: string): T | null {\n const data = this.storage.getItem(key);\n return data ? JSON.parse(data) : null;\n }\n\n /**\n * 移除数据\n * @param key 键名\n */\n remove(key: string): void {\n this.storage.removeItem(key);\n }\n\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SessionStorage {\n private readonly storage = inject(DOCUMENT).defaultView!.sessionStorage;\n\n /**\n * 保存数据\n * @param key 键名\n * @param value 数据\n */\n set<T = any>(key: string, value: T): void {\n this.storage.setItem(key, JSON.stringify(value));\n }\n\n /**\n * 获取数据\n * @param key 键名\n * @param defaults 默认值\n */\n get<T = any>(key: string): T | null {\n const data = this.storage.getItem(key);\n return data ? JSON.parse(data) : null;\n }\n\n /**\n * 移除数据\n * @param key 键名\n */\n remove(key: string): void {\n this.storage.removeItem(key);\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solar-angular/platform-browser",
3
- "version": "18.1.1",
3
+ "version": "18.2.0",
4
4
  "sideEffects": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -2,50 +2,33 @@ import * as i0 from "@angular/core";
2
2
  export declare class SpreadsheetService {
3
3
  private readonly document;
4
4
  private readonly resourceLoader;
5
+ private readonly fileManager;
5
6
  private readonly datePipe;
6
7
  private readonly excel;
7
- /**
8
- * 根据当前的单元格找到下一列的地址
9
- * 采用倒序进位法,这样就不需要递归了
10
- */
11
- private nextColOfCell;
12
- /**
13
- * 获取单元格的行
14
- */
15
- private rowOfCell;
16
- /**
17
- * 获取单元格的列
18
- */
19
- private colOfCell;
20
- /**
21
- * 单元格的列号
22
- * 当作26进制计算列的编号
23
- */
24
- private colNumberOfCell;
25
- private parseDomTable;
8
+ private parseElement;
26
9
  /**
27
10
  * 只导出一个table, 内容放在第一个sheet上
28
11
  */
29
- exportDomTableById(tableId: string, fileName: string, _opts?: any): Promise<void>;
12
+ exportTable(idOrElement: string | HTMLTableElement, fileName: string, _opts?: any): Promise<void>;
30
13
  /**
31
14
  * 导出多个table, 内容放在多个sheet上
32
15
  */
33
- exportDomTableSheets(tableIds: string[], sheetNames: string[], fileName: string, _opts?: any): Promise<void>;
16
+ exportTableSheets(tableIds: string[], sheetNames: string[], fileName: string, _opts?: any): Promise<void>;
34
17
  /**
35
18
  * 在一页中导出多个table, 每个table默认间隔1列
36
19
  */
37
- exportDomTableParallel(tableIds: string[], fileName: string, gap?: number, _opts?: any): Promise<void>;
20
+ exportTableParallel(tableIds: string[], fileName: string, gap?: number, _opts?: any): Promise<void>;
38
21
  /**
39
22
  * 在一页中垂直导出多个table
40
23
  */
41
- exportDomTableVertical(tableIds: string[], fileName: string, gap?: number, _opts?: any): Promise<void>;
24
+ exportTableVertical(tableIds: string[], fileName: string, gap?: number, _opts?: any): Promise<void>;
42
25
  /**
43
26
  * 导出dom table
44
27
  * colCursor: 标记起始列
45
28
  * rowOffset: 偏移的行数
46
29
  * @return 返回最后一列的列名
47
30
  */
48
- private exportDomTable;
31
+ private export;
49
32
  /**
50
33
  * 保存Workbook到磁盘上
51
34
  */