@bilig/excel-import 0.14.14
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/LICENSE +1 -0
- package/README.md +165 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +748 -0
- package/dist/index.js.map +1 -0
- package/dist/workbook-import-content-types.d.ts +10 -0
- package/dist/workbook-import-content-types.js +30 -0
- package/dist/workbook-import-content-types.js.map +1 -0
- package/dist/workbook-import-helpers.d.ts +21 -0
- package/dist/workbook-import-helpers.js +77 -0
- package/dist/workbook-import-helpers.js.map +1 -0
- package/dist/workbook-import-preview.d.ts +19 -0
- package/dist/workbook-import-preview.js +12 -0
- package/dist/workbook-import-preview.js.map +1 -0
- package/dist/xlsx-array-formulas.d.ts +6 -0
- package/dist/xlsx-array-formulas.js +186 -0
- package/dist/xlsx-array-formulas.js.map +1 -0
- package/dist/xlsx-axis-entries.d.ts +3 -0
- package/dist/xlsx-axis-entries.js +90 -0
- package/dist/xlsx-axis-entries.js.map +1 -0
- package/dist/xlsx-calculation-settings.d.ts +9 -0
- package/dist/xlsx-calculation-settings.js +198 -0
- package/dist/xlsx-calculation-settings.js.map +1 -0
- package/dist/xlsx-cell-insertion.d.ts +11 -0
- package/dist/xlsx-cell-insertion.js +164 -0
- package/dist/xlsx-cell-insertion.js.map +1 -0
- package/dist/xlsx-cell-metadata.d.ts +15 -0
- package/dist/xlsx-cell-metadata.js +380 -0
- package/dist/xlsx-cell-metadata.js.map +1 -0
- package/dist/xlsx-chart-artifacts.d.ts +7 -0
- package/dist/xlsx-chart-artifacts.js +327 -0
- package/dist/xlsx-chart-artifacts.js.map +1 -0
- package/dist/xlsx-charts.d.ts +4 -0
- package/dist/xlsx-charts.js +671 -0
- package/dist/xlsx-charts.js.map +1 -0
- package/dist/xlsx-comment-vml.d.ts +11 -0
- package/dist/xlsx-comment-vml.js +292 -0
- package/dist/xlsx-comment-vml.js.map +1 -0
- package/dist/xlsx-comments.d.ts +7 -0
- package/dist/xlsx-comments.js +120 -0
- package/dist/xlsx-comments.js.map +1 -0
- package/dist/xlsx-conditional-formats.d.ts +5 -0
- package/dist/xlsx-conditional-formats.js +513 -0
- package/dist/xlsx-conditional-formats.js.map +1 -0
- package/dist/xlsx-control-artifacts.d.ts +7 -0
- package/dist/xlsx-control-artifacts.js +404 -0
- package/dist/xlsx-control-artifacts.js.map +1 -0
- package/dist/xlsx-data-model-artifacts.d.ts +4 -0
- package/dist/xlsx-data-model-artifacts.js +240 -0
- package/dist/xlsx-data-model-artifacts.js.map +1 -0
- package/dist/xlsx-data-table-formulas.d.ts +4 -0
- package/dist/xlsx-data-table-formulas.js +138 -0
- package/dist/xlsx-data-table-formulas.js.map +1 -0
- package/dist/xlsx-defined-names.d.ts +7 -0
- package/dist/xlsx-defined-names.js +292 -0
- package/dist/xlsx-defined-names.js.map +1 -0
- package/dist/xlsx-dimensions.d.ts +4 -0
- package/dist/xlsx-dimensions.js +495 -0
- package/dist/xlsx-dimensions.js.map +1 -0
- package/dist/xlsx-drawing-artifacts.d.ts +7 -0
- package/dist/xlsx-drawing-artifacts.js +477 -0
- package/dist/xlsx-drawing-artifacts.js.map +1 -0
- package/dist/xlsx-escaped-text.d.ts +2 -0
- package/dist/xlsx-escaped-text.js +22 -0
- package/dist/xlsx-escaped-text.js.map +1 -0
- package/dist/xlsx-export-xml.d.ts +8 -0
- package/dist/xlsx-export-xml.js +99 -0
- package/dist/xlsx-export-xml.js.map +1 -0
- package/dist/xlsx-export.d.ts +2 -0
- package/dist/xlsx-export.js +800 -0
- package/dist/xlsx-export.js.map +1 -0
- package/dist/xlsx-external-link-artifacts.d.ts +4 -0
- package/dist/xlsx-external-link-artifacts.js +317 -0
- package/dist/xlsx-external-link-artifacts.js.map +1 -0
- package/dist/xlsx-external-references.d.ts +29 -0
- package/dist/xlsx-external-references.js +356 -0
- package/dist/xlsx-external-references.js.map +1 -0
- package/dist/xlsx-filters.d.ts +4 -0
- package/dist/xlsx-filters.js +273 -0
- package/dist/xlsx-filters.js.map +1 -0
- package/dist/xlsx-formula-translation.d.ts +10 -0
- package/dist/xlsx-formula-translation.js +391 -0
- package/dist/xlsx-formula-translation.js.map +1 -0
- package/dist/xlsx-formulas.d.ts +2 -0
- package/dist/xlsx-formulas.js +136 -0
- package/dist/xlsx-formulas.js.map +1 -0
- package/dist/xlsx-freeze-panes.d.ts +4 -0
- package/dist/xlsx-freeze-panes.js +206 -0
- package/dist/xlsx-freeze-panes.js.map +1 -0
- package/dist/xlsx-hyperlinks.d.ts +5 -0
- package/dist/xlsx-hyperlinks.js +64 -0
- package/dist/xlsx-hyperlinks.js.map +1 -0
- package/dist/xlsx-ignored-errors.d.ts +4 -0
- package/dist/xlsx-ignored-errors.js +106 -0
- package/dist/xlsx-ignored-errors.js.map +1 -0
- package/dist/xlsx-import-cell-styles.d.ts +8 -0
- package/dist/xlsx-import-cell-styles.js +255 -0
- package/dist/xlsx-import-cell-styles.js.map +1 -0
- package/dist/xlsx-import-sheet-metadata.d.ts +40 -0
- package/dist/xlsx-import-sheet-metadata.js +41 -0
- package/dist/xlsx-import-sheet-metadata.js.map +1 -0
- package/dist/xlsx-import-warnings.d.ts +8 -0
- package/dist/xlsx-import-warnings.js +44 -0
- package/dist/xlsx-import-warnings.js.map +1 -0
- package/dist/xlsx-import-workbook-metadata.d.ts +28 -0
- package/dist/xlsx-import-workbook-metadata.js +29 -0
- package/dist/xlsx-import-workbook-metadata.js.map +1 -0
- package/dist/xlsx-macros.d.ts +10 -0
- package/dist/xlsx-macros.js +63 -0
- package/dist/xlsx-macros.js.map +1 -0
- package/dist/xlsx-merge-entries.d.ts +3 -0
- package/dist/xlsx-merge-entries.js +17 -0
- package/dist/xlsx-merge-entries.js.map +1 -0
- package/dist/xlsx-number-formats.d.ts +7 -0
- package/dist/xlsx-number-formats.js +222 -0
- package/dist/xlsx-number-formats.js.map +1 -0
- package/dist/xlsx-pivot-artifacts.d.ts +29 -0
- package/dist/xlsx-pivot-artifacts.js +292 -0
- package/dist/xlsx-pivot-artifacts.js.map +1 -0
- package/dist/xlsx-pivots.d.ts +10 -0
- package/dist/xlsx-pivots.js +589 -0
- package/dist/xlsx-pivots.js.map +1 -0
- package/dist/xlsx-print-page-setup.d.ts +6 -0
- package/dist/xlsx-print-page-setup.js +224 -0
- package/dist/xlsx-print-page-setup.js.map +1 -0
- package/dist/xlsx-printer-settings.d.ts +4 -0
- package/dist/xlsx-printer-settings.js +279 -0
- package/dist/xlsx-printer-settings.js.map +1 -0
- package/dist/xlsx-protected-ranges.d.ts +4 -0
- package/dist/xlsx-protected-ranges.js +183 -0
- package/dist/xlsx-protected-ranges.js.map +1 -0
- package/dist/xlsx-rich-text-artifacts.d.ts +4 -0
- package/dist/xlsx-rich-text-artifacts.js +303 -0
- package/dist/xlsx-rich-text-artifacts.js.map +1 -0
- package/dist/xlsx-sheet-properties.d.ts +4 -0
- package/dist/xlsx-sheet-properties.js +89 -0
- package/dist/xlsx-sheet-properties.js.map +1 -0
- package/dist/xlsx-sheet-protection.d.ts +4 -0
- package/dist/xlsx-sheet-protection.js +153 -0
- package/dist/xlsx-sheet-protection.js.map +1 -0
- package/dist/xlsx-sheet-visibility.d.ts +4 -0
- package/dist/xlsx-sheet-visibility.js +53 -0
- package/dist/xlsx-sheet-visibility.js.map +1 -0
- package/dist/xlsx-slicer-connection-artifacts.d.ts +4 -0
- package/dist/xlsx-slicer-connection-artifacts.js +426 -0
- package/dist/xlsx-slicer-connection-artifacts.js.map +1 -0
- package/dist/xlsx-sorts.d.ts +5 -0
- package/dist/xlsx-sorts.js +216 -0
- package/dist/xlsx-sorts.js.map +1 -0
- package/dist/xlsx-sparklines.d.ts +4 -0
- package/dist/xlsx-sparklines.js +115 -0
- package/dist/xlsx-sparklines.js.map +1 -0
- package/dist/xlsx-style-only-blank-cells.d.ts +3 -0
- package/dist/xlsx-style-only-blank-cells.js +96 -0
- package/dist/xlsx-style-only-blank-cells.js.map +1 -0
- package/dist/xlsx-style-runs.d.ts +12 -0
- package/dist/xlsx-style-runs.js +35 -0
- package/dist/xlsx-style-runs.js.map +1 -0
- package/dist/xlsx-styles.d.ts +25 -0
- package/dist/xlsx-styles.js +857 -0
- package/dist/xlsx-styles.js.map +1 -0
- package/dist/xlsx-tab-colors.d.ts +4 -0
- package/dist/xlsx-tab-colors.js +166 -0
- package/dist/xlsx-tab-colors.js.map +1 -0
- package/dist/xlsx-tables.d.ts +4 -0
- package/dist/xlsx-tables.js +371 -0
- package/dist/xlsx-tables.js.map +1 -0
- package/dist/xlsx-theme-artifacts.d.ts +6 -0
- package/dist/xlsx-theme-artifacts.js +126 -0
- package/dist/xlsx-theme-artifacts.js.map +1 -0
- package/dist/xlsx-threaded-comment-artifacts.d.ts +8 -0
- package/dist/xlsx-threaded-comment-artifacts.js +329 -0
- package/dist/xlsx-threaded-comment-artifacts.js.map +1 -0
- package/dist/xlsx-validations.d.ts +4 -0
- package/dist/xlsx-validations.js +542 -0
- package/dist/xlsx-validations.js.map +1 -0
- package/dist/xlsx-view-state.d.ts +8 -0
- package/dist/xlsx-view-state.js +144 -0
- package/dist/xlsx-view-state.js.map +1 -0
- package/dist/xlsx-workbook-properties.d.ts +5 -0
- package/dist/xlsx-workbook-properties.js +388 -0
- package/dist/xlsx-workbook-properties.js.map +1 -0
- package/dist/xlsx-workbook-protection.d.ts +4 -0
- package/dist/xlsx-workbook-protection.js +147 -0
- package/dist/xlsx-workbook-protection.js.map +1 -0
- package/dist/xlsx-workbook-sheet-paths.d.ts +4 -0
- package/dist/xlsx-workbook-sheet-paths.js +96 -0
- package/dist/xlsx-workbook-sheet-paths.js.map +1 -0
- package/dist/xlsx-worksheet-cells.d.ts +16 -0
- package/dist/xlsx-worksheet-cells.js +104 -0
- package/dist/xlsx-worksheet-cells.js.map +1 -0
- package/dist/xlsx-worksheet-text-values.d.ts +2 -0
- package/dist/xlsx-worksheet-text-values.js +136 -0
- package/dist/xlsx-worksheet-text-values.js.map +1 -0
- package/dist/xlsx-zip.d.ts +6 -0
- package/dist/xlsx-zip.js +12 -0
- package/dist/xlsx-zip.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate';
|
|
2
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import { readXlsxZipEntries } from './xlsx-zip.js';
|
|
5
|
+
const xmlParser = new XMLParser({
|
|
6
|
+
ignoreAttributes: false,
|
|
7
|
+
attributeNamePrefix: '',
|
|
8
|
+
parseAttributeValue: false,
|
|
9
|
+
removeNSPrefix: true,
|
|
10
|
+
});
|
|
11
|
+
const worksheetProtectedRangesTailElements = [
|
|
12
|
+
'scenarios',
|
|
13
|
+
'autoFilter',
|
|
14
|
+
'sortState',
|
|
15
|
+
'dataConsolidate',
|
|
16
|
+
'customSheetViews',
|
|
17
|
+
'mergeCells',
|
|
18
|
+
'phoneticPr',
|
|
19
|
+
'conditionalFormatting',
|
|
20
|
+
'dataValidations',
|
|
21
|
+
'hyperlinks',
|
|
22
|
+
'printOptions',
|
|
23
|
+
'pageMargins',
|
|
24
|
+
'pageSetup',
|
|
25
|
+
'headerFooter',
|
|
26
|
+
'drawing',
|
|
27
|
+
'legacyDrawing',
|
|
28
|
+
'tableParts',
|
|
29
|
+
'pivotTableDefinition',
|
|
30
|
+
];
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return typeof value === 'object' && value !== null;
|
|
33
|
+
}
|
|
34
|
+
function asArray(value) {
|
|
35
|
+
if (value === undefined || value === null) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
return Array.isArray(value) ? value : [value];
|
|
39
|
+
}
|
|
40
|
+
function recordChild(value, key) {
|
|
41
|
+
if (!isRecord(value)) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const child = value[key];
|
|
45
|
+
return isRecord(child) ? child : null;
|
|
46
|
+
}
|
|
47
|
+
function escapeXml(value) {
|
|
48
|
+
return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", ''');
|
|
49
|
+
}
|
|
50
|
+
function normalizeZipPath(path) {
|
|
51
|
+
return path.replace(/^\/+/, '');
|
|
52
|
+
}
|
|
53
|
+
function getZipText(zip, path) {
|
|
54
|
+
const file = zip[normalizeZipPath(path)];
|
|
55
|
+
return file ? strFromU8(file) : null;
|
|
56
|
+
}
|
|
57
|
+
function setZipText(zip, path, text) {
|
|
58
|
+
zip[normalizeZipPath(path)] = strToU8(text);
|
|
59
|
+
}
|
|
60
|
+
function rangeRefA1(range) {
|
|
61
|
+
try {
|
|
62
|
+
const decoded = XLSX.utils.decode_range(`${range.startAddress}:${range.endAddress}`.replaceAll('$', ''));
|
|
63
|
+
return XLSX.utils.encode_range(decoded);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function parseRangeRef(sheetName, ref) {
|
|
70
|
+
try {
|
|
71
|
+
const decoded = XLSX.utils.decode_range(ref.replaceAll('$', ''));
|
|
72
|
+
return {
|
|
73
|
+
sheetName,
|
|
74
|
+
startAddress: XLSX.utils.encode_cell(decoded.s),
|
|
75
|
+
endAddress: XLSX.utils.encode_cell(decoded.e),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function insertWorksheetProtectedRanges(sheetXml, rangeXml) {
|
|
83
|
+
const protectedRanges = `<protectedRanges>${rangeXml.join('')}</protectedRanges>`;
|
|
84
|
+
if (/<protectedRanges\b/u.test(sheetXml)) {
|
|
85
|
+
return sheetXml.replace(/<protectedRanges\b[^>]*(?:\/>|>[\s\S]*?<\/protectedRanges>)/u, protectedRanges);
|
|
86
|
+
}
|
|
87
|
+
let insertIndex = sheetXml.indexOf('</worksheet>');
|
|
88
|
+
for (const elementName of worksheetProtectedRangesTailElements) {
|
|
89
|
+
const elementIndex = sheetXml.search(new RegExp(`<${elementName}\\b`, 'u'));
|
|
90
|
+
if (elementIndex >= 0 && (insertIndex < 0 || elementIndex < insertIndex)) {
|
|
91
|
+
insertIndex = elementIndex;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (insertIndex < 0) {
|
|
95
|
+
return sheetXml;
|
|
96
|
+
}
|
|
97
|
+
return `${sheetXml.slice(0, insertIndex)}${protectedRanges}${sheetXml.slice(insertIndex)}`;
|
|
98
|
+
}
|
|
99
|
+
function exportProtectedRangeXml(sheetName, protection) {
|
|
100
|
+
const name = protection.id.trim();
|
|
101
|
+
const ref = protection.range.sheetName === sheetName ? rangeRefA1(protection.range) : null;
|
|
102
|
+
if (!name || !ref) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return `<protectedRange name="${escapeXml(name)}" sqref="${escapeXml(ref)}"/>`;
|
|
106
|
+
}
|
|
107
|
+
export function addExportProtectedRangesToXlsxBytes(bytes, snapshot) {
|
|
108
|
+
if (!snapshot.sheets.some((sheet) => (sheet.metadata?.protectedRanges ?? []).length > 0)) {
|
|
109
|
+
return bytes;
|
|
110
|
+
}
|
|
111
|
+
const zip = unzipSync(bytes);
|
|
112
|
+
let changed = false;
|
|
113
|
+
snapshot.sheets
|
|
114
|
+
.toSorted((left, right) => left.order - right.order)
|
|
115
|
+
.forEach((sheet, sheetIndex) => {
|
|
116
|
+
const rangeXml = (sheet.metadata?.protectedRanges ?? []).flatMap((protection) => {
|
|
117
|
+
const xml = exportProtectedRangeXml(sheet.name, protection);
|
|
118
|
+
return xml ? [xml] : [];
|
|
119
|
+
});
|
|
120
|
+
if (rangeXml.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
|
|
124
|
+
const sheetXml = getZipText(zip, sheetPath);
|
|
125
|
+
if (!sheetXml) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
setZipText(zip, sheetPath, insertWorksheetProtectedRanges(sheetXml, rangeXml));
|
|
129
|
+
changed = true;
|
|
130
|
+
});
|
|
131
|
+
return changed ? zipSync(zip) : bytes;
|
|
132
|
+
}
|
|
133
|
+
function uniqueProtectionId(input) {
|
|
134
|
+
const name = typeof input.name === 'string' ? input.name.trim() : '';
|
|
135
|
+
const base = name || `protected-range:${input.sheetName}:${input.range.startAddress}:${input.range.endAddress}`;
|
|
136
|
+
let candidate = base;
|
|
137
|
+
let suffix = 2;
|
|
138
|
+
while (input.usedIds.has(candidate)) {
|
|
139
|
+
candidate = `${base}:${String(suffix)}`;
|
|
140
|
+
suffix += 1;
|
|
141
|
+
}
|
|
142
|
+
input.usedIds.add(candidate);
|
|
143
|
+
return candidate;
|
|
144
|
+
}
|
|
145
|
+
function parseProtectedRangeEntry(sheetName, entry, usedIds) {
|
|
146
|
+
if (!isRecord(entry) || typeof entry['sqref'] !== 'string') {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
return entry['sqref'].split(/\s+/u).flatMap((rawRef) => {
|
|
150
|
+
const ref = rawRef.trim();
|
|
151
|
+
if (!ref) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
const range = parseRangeRef(sheetName, ref);
|
|
155
|
+
if (!range) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
return [
|
|
159
|
+
{
|
|
160
|
+
id: uniqueProtectionId({ sheetName, name: entry['name'], range, usedIds }),
|
|
161
|
+
range,
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export function readImportedWorkbookProtectedRanges(source, sheetNames) {
|
|
167
|
+
const zip = readXlsxZipEntries(source);
|
|
168
|
+
const protectedRangesBySheet = new Map();
|
|
169
|
+
sheetNames.forEach((sheetName, sheetIndex) => {
|
|
170
|
+
const sheetXml = getZipText(zip, `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`);
|
|
171
|
+
if (!sheetXml || !/<protectedRanges\b/u.test(sheetXml)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const parsed = xmlParser.parse(sheetXml);
|
|
175
|
+
const usedIds = new Set();
|
|
176
|
+
const protectedRanges = asArray(recordChild(recordChild(recordChild(parsed, 'worksheet'), 'protectedRanges'), 'protectedRange')).flatMap((entry) => parseProtectedRangeEntry(sheetName, entry, usedIds));
|
|
177
|
+
if (protectedRanges.length > 0) {
|
|
178
|
+
protectedRangesBySheet.set(sheetName, protectedRanges);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return protectedRangesBySheet;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=xlsx-protected-ranges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-protected-ranges.js","sourceRoot":"","sources":["../src/xlsx-protected-ranges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkbookSheetRichTextArtifactsSnapshot, WorkbookSnapshot } from '@bilig/protocol';
|
|
2
|
+
import { type XlsxZipSource } from './xlsx-zip.js';
|
|
3
|
+
export declare function readImportedWorkbookRichTextArtifacts(source: XlsxZipSource, sheetNames: readonly string[]): Map<string, WorkbookSheetRichTextArtifactsSnapshot>;
|
|
4
|
+
export declare function addExportRichTextArtifactsToXlsxBytes(bytes: Uint8Array, snapshot: WorkbookSnapshot): Uint8Array;
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { unzipSync, zipSync } from 'fflate';
|
|
2
|
+
import { getZipText, normalizeZipPath, readXlsxZipEntries } from './xlsx-zip.js';
|
|
3
|
+
import { addContentTypeOverride, buildRelationshipsXml, nextRelationshipId, parseRelationships, resolveTargetPath, setZipText, } from './xlsx-pivot-artifacts.js';
|
|
4
|
+
import { setXmlAttribute } from './xlsx-export-xml.js';
|
|
5
|
+
const worksheetRelationshipType = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';
|
|
6
|
+
const sharedStringsRelationshipType = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings';
|
|
7
|
+
const sharedStringsContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml';
|
|
8
|
+
const stringCellElementPattern = /<((?:[A-Za-z_][\w.-]*:)?c)\b(?=[^>]*\bt=(["'])(?:s|inlineStr)\2)[^>]*(?:\/>|>[\s\S]*?<\/\1>)/gu;
|
|
9
|
+
function readXmlAttribute(xml, attributeName) {
|
|
10
|
+
return new RegExp(`\\s${attributeName}=("|')([\\s\\S]*?)\\1`, 'u').exec(xml)?.[2] ?? null;
|
|
11
|
+
}
|
|
12
|
+
function decodeXmlText(value) {
|
|
13
|
+
return value.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/gu, (_match, entity) => {
|
|
14
|
+
if (entity.startsWith('#x')) {
|
|
15
|
+
const codePoint = Number.parseInt(entity.slice(2), 16);
|
|
16
|
+
return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : '';
|
|
17
|
+
}
|
|
18
|
+
if (entity.startsWith('#')) {
|
|
19
|
+
const codePoint = Number.parseInt(entity.slice(1), 10);
|
|
20
|
+
return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : '';
|
|
21
|
+
}
|
|
22
|
+
switch (entity) {
|
|
23
|
+
case 'amp':
|
|
24
|
+
return '&';
|
|
25
|
+
case 'lt':
|
|
26
|
+
return '<';
|
|
27
|
+
case 'gt':
|
|
28
|
+
return '>';
|
|
29
|
+
case 'quot':
|
|
30
|
+
return '"';
|
|
31
|
+
case 'apos':
|
|
32
|
+
return "'";
|
|
33
|
+
default:
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function decodeXmlAttribute(value) {
|
|
39
|
+
return decodeXmlText(value);
|
|
40
|
+
}
|
|
41
|
+
function readWorkbookSheetEntries(workbookXml) {
|
|
42
|
+
if (!workbookXml) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
return [...workbookXml.matchAll(/<(?:[A-Za-z_][\w.-]*:)?sheet\b([^>]*)\/?>/gu)].flatMap((match) => {
|
|
46
|
+
const attributes = match[1] ?? '';
|
|
47
|
+
const rawName = readXmlAttribute(attributes, 'name');
|
|
48
|
+
const relationshipId = readXmlAttribute(attributes, 'r:id') ?? readXmlAttribute(attributes, 'id');
|
|
49
|
+
return rawName && relationshipId ? [{ name: decodeXmlAttribute(rawName), relationshipId }] : [];
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function worksheetPathsBySheetName(zip, sheetNames) {
|
|
53
|
+
const paths = new Map();
|
|
54
|
+
const relationships = parseRelationships(getZipText(zip, 'xl/_rels/workbook.xml.rels'));
|
|
55
|
+
const worksheetRelationshipsById = new Map(relationships
|
|
56
|
+
.filter((relationship) => relationship.type === worksheetRelationshipType || relationship.target.includes('worksheets/'))
|
|
57
|
+
.map((relationship) => [relationship.id, normalizeZipPath(resolveTargetPath('xl/workbook.xml', relationship.target))]));
|
|
58
|
+
readWorkbookSheetEntries(getZipText(zip, 'xl/workbook.xml')).forEach((entry) => {
|
|
59
|
+
const path = worksheetRelationshipsById.get(entry.relationshipId);
|
|
60
|
+
if (path) {
|
|
61
|
+
paths.set(entry.name, path);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
sheetNames.forEach((sheetName, index) => {
|
|
65
|
+
if (!paths.has(sheetName)) {
|
|
66
|
+
paths.set(sheetName, `xl/worksheets/sheet${String(index + 1)}.xml`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return paths;
|
|
70
|
+
}
|
|
71
|
+
function hasRichTextRuns(xml) {
|
|
72
|
+
return /<(?:[A-Za-z_][\w.-]*:)?r\b[^>]*>/u.test(xml);
|
|
73
|
+
}
|
|
74
|
+
function stringItemText(xml) {
|
|
75
|
+
return [...xml.matchAll(/<(?:[A-Za-z_][\w.-]*:)?t\b[^>]*>([\s\S]*?)<\/(?:[A-Za-z_][\w.-]*:)?t>/gu)]
|
|
76
|
+
.map((match) => decodeXmlText(match[1] ?? ''))
|
|
77
|
+
.join('');
|
|
78
|
+
}
|
|
79
|
+
function readElementText(xml, elementName) {
|
|
80
|
+
return (new RegExp(`<(?:[A-Za-z_][\\w.-]*:)?${elementName}\\b[^>]*>([\\s\\S]*?)</(?:[A-Za-z_][\\w.-]*:)?${elementName}>`, 'u').exec(xml)?.[1] ??
|
|
81
|
+
null);
|
|
82
|
+
}
|
|
83
|
+
function readStringElement(xml, elementName) {
|
|
84
|
+
return new RegExp(`<((?:[A-Za-z_][\\w.-]*:)?${elementName})\\b[^>]*(?:/>|>[\\s\\S]*?</\\1>)`, 'u').exec(xml)?.[0] ?? null;
|
|
85
|
+
}
|
|
86
|
+
function readSharedStringEntries(zip) {
|
|
87
|
+
const sharedStringsXml = getZipText(zip, 'xl/sharedStrings.xml');
|
|
88
|
+
if (!sharedStringsXml) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
return [...sharedStringsXml.matchAll(/<((?:[A-Za-z_][\w.-]*:)?si)\b[^>]*(?:\/>|>[\s\S]*?<\/\1>)/gu)].map((match) => {
|
|
92
|
+
const xml = match[0];
|
|
93
|
+
return {
|
|
94
|
+
text: stringItemText(xml),
|
|
95
|
+
xml,
|
|
96
|
+
rich: hasRichTextRuns(xml),
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function readSharedStringIndex(cellXml) {
|
|
101
|
+
const rawValue = readElementText(cellXml, 'v')?.trim();
|
|
102
|
+
if (!rawValue) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const index = Number(decodeXmlText(rawValue));
|
|
106
|
+
return Number.isSafeInteger(index) && index >= 0 ? index : null;
|
|
107
|
+
}
|
|
108
|
+
function richTextArtifactsForWorksheet(sheetXml, sharedStrings) {
|
|
109
|
+
if (!sheetXml) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const hasRichSharedStrings = sharedStrings.some((entry) => entry.rich);
|
|
113
|
+
if (!hasRichSharedStrings && !/\bt=(["'])inlineStr\1/u.test(sheetXml)) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const cells = [];
|
|
117
|
+
stringCellElementPattern.lastIndex = 0;
|
|
118
|
+
for (const match of sheetXml.matchAll(stringCellElementPattern)) {
|
|
119
|
+
const cellXml = match[0];
|
|
120
|
+
const openingTag = /<((?:[A-Za-z_][\w.-]*:)?c)\b[^>]*(?:\/>|>)/u.exec(cellXml)?.[0];
|
|
121
|
+
const address = openingTag ? readXmlAttribute(openingTag, 'r') : null;
|
|
122
|
+
if (!address) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const cellType = openingTag ? readXmlAttribute(openingTag, 't') : null;
|
|
126
|
+
if (cellType === 's') {
|
|
127
|
+
const sharedString = sharedStrings[readSharedStringIndex(cellXml) ?? -1];
|
|
128
|
+
if (sharedString?.rich) {
|
|
129
|
+
cells.push({
|
|
130
|
+
address,
|
|
131
|
+
text: sharedString.text,
|
|
132
|
+
storage: 'sharedString',
|
|
133
|
+
xml: sharedString.xml,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (cellType === 'inlineStr') {
|
|
139
|
+
const inlineStringXml = readStringElement(cellXml, 'is');
|
|
140
|
+
if (inlineStringXml && hasRichTextRuns(inlineStringXml)) {
|
|
141
|
+
cells.push({
|
|
142
|
+
address,
|
|
143
|
+
text: stringItemText(inlineStringXml),
|
|
144
|
+
storage: 'inlineString',
|
|
145
|
+
xml: inlineStringXml,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return cells.length > 0 ? { cells } : undefined;
|
|
151
|
+
}
|
|
152
|
+
export function readImportedWorkbookRichTextArtifacts(source, sheetNames) {
|
|
153
|
+
const zip = readXlsxZipEntries(source);
|
|
154
|
+
const sharedStrings = readSharedStringEntries(zip);
|
|
155
|
+
const worksheetPaths = worksheetPathsBySheetName(zip, sheetNames);
|
|
156
|
+
const artifactsBySheet = new Map();
|
|
157
|
+
sheetNames.forEach((sheetName) => {
|
|
158
|
+
const worksheetPath = worksheetPaths.get(sheetName);
|
|
159
|
+
const artifacts = worksheetPath ? richTextArtifactsForWorksheet(getZipText(zip, worksheetPath), sharedStrings) : undefined;
|
|
160
|
+
if (artifacts) {
|
|
161
|
+
artifactsBySheet.set(sheetName, artifacts);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return artifactsBySheet;
|
|
165
|
+
}
|
|
166
|
+
function snapshotStringCellsByAddress(sheet) {
|
|
167
|
+
const cells = new Map();
|
|
168
|
+
sheet.cells.forEach((cell) => {
|
|
169
|
+
if (typeof cell.value === 'string' && !cell.formula) {
|
|
170
|
+
cells.set(cell.address, cell);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return cells;
|
|
174
|
+
}
|
|
175
|
+
function exportRichTextCells(sheet) {
|
|
176
|
+
const textCells = snapshotStringCellsByAddress(sheet);
|
|
177
|
+
return (sheet.metadata?.richTextArtifacts?.cells ?? []).flatMap((artifact) => {
|
|
178
|
+
const cell = textCells.get(artifact.address);
|
|
179
|
+
return cell?.value === artifact.text
|
|
180
|
+
? [
|
|
181
|
+
{
|
|
182
|
+
address: artifact.address,
|
|
183
|
+
storage: artifact.storage,
|
|
184
|
+
xml: artifact.xml,
|
|
185
|
+
},
|
|
186
|
+
]
|
|
187
|
+
: [];
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
function sharedStringItemCount(sharedStringsXml) {
|
|
191
|
+
return sharedStringsXml ? [...sharedStringsXml.matchAll(/<(?:[A-Za-z_][\w.-]*:)?si\b/gu)].length : 0;
|
|
192
|
+
}
|
|
193
|
+
function updateSharedStringCounts(sharedStringsXml) {
|
|
194
|
+
const count = sharedStringItemCount(sharedStringsXml);
|
|
195
|
+
return sharedStringsXml.replace(/<sst\b[^>]*>/u, (openingTag) => setXmlAttribute(setXmlAttribute(openingTag, 'count', String(count)), 'uniqueCount', String(count)));
|
|
196
|
+
}
|
|
197
|
+
function appendSharedStringItems(sharedStringsXml, items) {
|
|
198
|
+
const baseXml = sharedStringsXml ??
|
|
199
|
+
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="0" uniqueCount="0"></sst>';
|
|
200
|
+
const withItems = baseXml.includes('</sst>') ? baseXml.replace('</sst>', () => `${items.join('')}</sst>`) : baseXml;
|
|
201
|
+
return updateSharedStringCounts(withItems);
|
|
202
|
+
}
|
|
203
|
+
function ensureSharedStringsPackageLinks(zip) {
|
|
204
|
+
const relationships = parseRelationships(getZipText(zip, 'xl/_rels/workbook.xml.rels'));
|
|
205
|
+
if (!relationships.some((relationship) => relationship.type === sharedStringsRelationshipType)) {
|
|
206
|
+
relationships.push({
|
|
207
|
+
id: nextRelationshipId(relationships),
|
|
208
|
+
type: sharedStringsRelationshipType,
|
|
209
|
+
target: 'sharedStrings.xml',
|
|
210
|
+
});
|
|
211
|
+
setZipText(zip, 'xl/_rels/workbook.xml.rels', buildRelationshipsXml(relationships));
|
|
212
|
+
}
|
|
213
|
+
const contentTypesXml = getZipText(zip, '[Content_Types].xml');
|
|
214
|
+
if (contentTypesXml) {
|
|
215
|
+
setZipText(zip, '[Content_Types].xml', addContentTypeOverride(contentTypesXml, '/xl/sharedStrings.xml', sharedStringsContentType));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function cellOpeningTag(cellXml) {
|
|
219
|
+
return /<((?:[A-Za-z_][\w.-]*:)?c)\b[^>]*(?:\/>|>)/u.exec(cellXml)?.[0] ?? null;
|
|
220
|
+
}
|
|
221
|
+
function cellTagName(openingTag) {
|
|
222
|
+
return /^<([^\s>/]+)/u.exec(openingTag)?.[1] ?? 'c';
|
|
223
|
+
}
|
|
224
|
+
function cellWithBody(cellXml, type, bodyXml) {
|
|
225
|
+
const openingTag = cellOpeningTag(cellXml);
|
|
226
|
+
if (!openingTag) {
|
|
227
|
+
return cellXml;
|
|
228
|
+
}
|
|
229
|
+
const tagName = cellTagName(openingTag);
|
|
230
|
+
const expandedOpeningTag = openingTag.replace(/\s+t=(["'])[\s\S]*?\1/u, '').replace(/\/>$/u, '>');
|
|
231
|
+
return `${setXmlAttribute(expandedOpeningTag, 't', type)}${bodyXml}</${tagName}>`;
|
|
232
|
+
}
|
|
233
|
+
function applyRichTextCellsToWorksheetXml(sheetXml, cells, sharedStringIndexes) {
|
|
234
|
+
if (cells.length === 0) {
|
|
235
|
+
return { xml: sheetXml, changed: false };
|
|
236
|
+
}
|
|
237
|
+
const cellsByAddress = new Map(cells.map((cell) => [cell.address, cell]));
|
|
238
|
+
let changed = false;
|
|
239
|
+
const xml = sheetXml.replace(/<((?:[A-Za-z_][\w.-]*:)?c)\b[^>]*(?:\/>|>[\s\S]*?<\/\1>)/gu, (cellXml) => {
|
|
240
|
+
const openingTag = cellOpeningTag(cellXml);
|
|
241
|
+
const address = openingTag ? readXmlAttribute(openingTag, 'r') : null;
|
|
242
|
+
const richTextCell = address ? cellsByAddress.get(address) : undefined;
|
|
243
|
+
if (!address || !richTextCell) {
|
|
244
|
+
return cellXml;
|
|
245
|
+
}
|
|
246
|
+
changed = true;
|
|
247
|
+
if (richTextCell.storage === 'sharedString') {
|
|
248
|
+
const sharedStringIndex = sharedStringIndexes.get(address);
|
|
249
|
+
return sharedStringIndex === undefined ? cellXml : cellWithBody(cellXml, 's', `<v>${String(sharedStringIndex)}</v>`);
|
|
250
|
+
}
|
|
251
|
+
return cellWithBody(cellXml, 'inlineStr', richTextCell.xml);
|
|
252
|
+
});
|
|
253
|
+
return { xml, changed };
|
|
254
|
+
}
|
|
255
|
+
export function addExportRichTextArtifactsToXlsxBytes(bytes, snapshot) {
|
|
256
|
+
const sheetsWithRichText = snapshot.sheets
|
|
257
|
+
.toSorted((left, right) => left.order - right.order)
|
|
258
|
+
.map((sheet, sheetIndex) => ({
|
|
259
|
+
sheet,
|
|
260
|
+
sheetIndex,
|
|
261
|
+
cells: exportRichTextCells(sheet),
|
|
262
|
+
}))
|
|
263
|
+
.filter((entry) => entry.cells.length > 0);
|
|
264
|
+
if (sheetsWithRichText.length === 0) {
|
|
265
|
+
return bytes;
|
|
266
|
+
}
|
|
267
|
+
const zip = unzipSync(bytes);
|
|
268
|
+
const sharedStringIndexesBySheetAddress = new Map();
|
|
269
|
+
const sharedStringItems = [];
|
|
270
|
+
let nextSharedStringIndex = sharedStringItemCount(getZipText(zip, 'xl/sharedStrings.xml'));
|
|
271
|
+
sheetsWithRichText.forEach(({ sheetIndex, cells }) => {
|
|
272
|
+
cells.forEach((cell) => {
|
|
273
|
+
if (cell.storage !== 'sharedString') {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
sharedStringIndexesBySheetAddress.set(`${String(sheetIndex)}\u0000${cell.address}`, nextSharedStringIndex);
|
|
277
|
+
nextSharedStringIndex += 1;
|
|
278
|
+
sharedStringItems.push(cell.xml);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
if (sharedStringItems.length > 0) {
|
|
282
|
+
setZipText(zip, 'xl/sharedStrings.xml', appendSharedStringItems(getZipText(zip, 'xl/sharedStrings.xml'), sharedStringItems));
|
|
283
|
+
ensureSharedStringsPackageLinks(zip);
|
|
284
|
+
}
|
|
285
|
+
let changed = sharedStringItems.length > 0;
|
|
286
|
+
sheetsWithRichText.forEach(({ sheetIndex, cells }) => {
|
|
287
|
+
const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
|
|
288
|
+
const sheetXml = getZipText(zip, sheetPath);
|
|
289
|
+
if (!sheetXml) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const sharedStringIndexes = new Map([...sharedStringIndexesBySheetAddress.entries()]
|
|
293
|
+
.filter(([key]) => key.startsWith(`${String(sheetIndex)}\u0000`))
|
|
294
|
+
.map(([key, index]) => [key.slice(String(sheetIndex).length + 1), index]));
|
|
295
|
+
const result = applyRichTextCellsToWorksheetXml(sheetXml, cells, sharedStringIndexes);
|
|
296
|
+
if (result.changed) {
|
|
297
|
+
setZipText(zip, sheetPath, result.xml);
|
|
298
|
+
changed = true;
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
return changed ? zipSync(zip) : bytes;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=xlsx-rich-text-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-rich-text-artifacts.js","sourceRoot":"","sources":["../src/xlsx-rich-text-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkbookSheetPrSnapshot, WorkbookSnapshot } from '@bilig/protocol';
|
|
2
|
+
import { type XlsxZipSource } from './xlsx-zip.js';
|
|
3
|
+
export declare function readImportedWorkbookSheetProperties(source: XlsxZipSource, sheetNames: readonly string[]): Map<string, WorkbookSheetPrSnapshot>;
|
|
4
|
+
export declare function addExportWorksheetPropertiesToXlsxBytes(bytes: Uint8Array, snapshot: WorkbookSnapshot): Uint8Array;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { strToU8, unzipSync, zipSync } from 'fflate';
|
|
2
|
+
import { getZipText, normalizeZipPath, readXlsxZipEntries } from './xlsx-zip.js';
|
|
3
|
+
function setZipText(zip, path, text) {
|
|
4
|
+
zip[normalizeZipPath(path)] = strToU8(text);
|
|
5
|
+
}
|
|
6
|
+
function readSheetPrXml(sheetXml) {
|
|
7
|
+
return /<sheetPr\b[^>]*(?:\/>|>[\s\S]*?<\/sheetPr>)/u.exec(sheetXml)?.[0] ?? null;
|
|
8
|
+
}
|
|
9
|
+
function removeTabColor(sheetPrXml) {
|
|
10
|
+
return sheetPrXml.replace(/<tabColor\b[^>]*(?:\/>|>[\s\S]*?<\/tabColor>)/gu, '');
|
|
11
|
+
}
|
|
12
|
+
function hasPreservedSheetPrPayload(sheetPrXml) {
|
|
13
|
+
const withoutOpeningAndClosing = sheetPrXml
|
|
14
|
+
.replace(/^<sheetPr\b[^>]*>/u, '')
|
|
15
|
+
.replace(/^<sheetPr\b[^>]*\/>$/u, '')
|
|
16
|
+
.replace(/<\/sheetPr>$/u, '')
|
|
17
|
+
.trim();
|
|
18
|
+
const openingAttributes = /^<sheetPr\b([^>]*)/u.exec(sheetPrXml)?.[1]?.trim() ?? '';
|
|
19
|
+
return openingAttributes.length > 0 || withoutOpeningAndClosing.length > 0;
|
|
20
|
+
}
|
|
21
|
+
export function readImportedWorkbookSheetProperties(source, sheetNames) {
|
|
22
|
+
const zip = readXlsxZipEntries(source);
|
|
23
|
+
const propertiesBySheet = new Map();
|
|
24
|
+
sheetNames.forEach((sheetName, sheetIndex) => {
|
|
25
|
+
const sheetXml = getZipText(zip, `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`);
|
|
26
|
+
if (!sheetXml) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const sheetPrXml = readSheetPrXml(sheetXml);
|
|
30
|
+
if (!sheetPrXml) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const preserved = removeTabColor(sheetPrXml);
|
|
34
|
+
if (hasPreservedSheetPrPayload(preserved)) {
|
|
35
|
+
propertiesBySheet.set(sheetName, { xml: preserved });
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return propertiesBySheet;
|
|
39
|
+
}
|
|
40
|
+
function tabColorXml(sheetPrXml) {
|
|
41
|
+
return sheetPrXml ? (/<tabColor\b[^>]*(?:\/>|>[\s\S]*?<\/tabColor>)/u.exec(sheetPrXml)?.[0] ?? null) : null;
|
|
42
|
+
}
|
|
43
|
+
function mergeTabColor(sheetPrXml, tabColor) {
|
|
44
|
+
if (!tabColor) {
|
|
45
|
+
return sheetPrXml;
|
|
46
|
+
}
|
|
47
|
+
const withoutTabColor = removeTabColor(sheetPrXml);
|
|
48
|
+
const selfClosingMatch = /^<sheetPr\b([^>]*)\/>$/u.exec(withoutTabColor);
|
|
49
|
+
if (selfClosingMatch) {
|
|
50
|
+
return `<sheetPr${selfClosingMatch[1] ?? ''}>${tabColor}</sheetPr>`;
|
|
51
|
+
}
|
|
52
|
+
const expandedMatch = /^<sheetPr\b([^>]*)>([\s\S]*?)<\/sheetPr>$/u.exec(withoutTabColor);
|
|
53
|
+
if (!expandedMatch) {
|
|
54
|
+
return withoutTabColor;
|
|
55
|
+
}
|
|
56
|
+
return `<sheetPr${expandedMatch[1] ?? ''}>${tabColor}${expandedMatch[2] ?? ''}</sheetPr>`;
|
|
57
|
+
}
|
|
58
|
+
function insertSheetPr(sheetXml, sheetPrXml) {
|
|
59
|
+
const existing = readSheetPrXml(sheetXml);
|
|
60
|
+
if (existing) {
|
|
61
|
+
return sheetXml.replace(existing, sheetPrXml);
|
|
62
|
+
}
|
|
63
|
+
return sheetXml.replace(/<worksheet\b([^>]*)>/u, `<worksheet$1>${sheetPrXml}`);
|
|
64
|
+
}
|
|
65
|
+
export function addExportWorksheetPropertiesToXlsxBytes(bytes, snapshot) {
|
|
66
|
+
if (!snapshot.sheets.some((sheet) => sheet.metadata?.sheetPr)) {
|
|
67
|
+
return bytes;
|
|
68
|
+
}
|
|
69
|
+
const zip = unzipSync(bytes);
|
|
70
|
+
let changed = false;
|
|
71
|
+
snapshot.sheets
|
|
72
|
+
.toSorted((left, right) => left.order - right.order)
|
|
73
|
+
.forEach((sheet, sheetIndex) => {
|
|
74
|
+
const sheetPr = sheet.metadata?.sheetPr;
|
|
75
|
+
if (!sheetPr) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const sheetPath = `xl/worksheets/sheet${String(sheetIndex + 1)}.xml`;
|
|
79
|
+
const sheetXml = getZipText(zip, sheetPath);
|
|
80
|
+
if (!sheetXml) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const nextSheetPr = mergeTabColor(sheetPr.xml, tabColorXml(readSheetPrXml(sheetXml)));
|
|
84
|
+
setZipText(zip, sheetPath, insertSheetPr(sheetXml, nextSheetPr));
|
|
85
|
+
changed = true;
|
|
86
|
+
});
|
|
87
|
+
return changed ? zipSync(zip) : bytes;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=xlsx-sheet-properties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx-sheet-properties.js","sourceRoot":"","sources":["../src/xlsx-sheet-properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkbookSheetProtectionSnapshot, WorkbookSnapshot } from '@bilig/protocol';
|
|
2
|
+
import { type XlsxZipSource } from './xlsx-zip.js';
|
|
3
|
+
export declare function addExportSheetProtectionsToXlsxBytes(bytes: Uint8Array, snapshot: WorkbookSnapshot): Uint8Array;
|
|
4
|
+
export declare function readImportedWorkbookSheetProtections(source: XlsxZipSource, sheetNames: readonly string[]): Map<string, WorkbookSheetProtectionSnapshot>;
|