@a3s-lab/office 0.10.0 → 0.12.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.
Files changed (47) hide show
  1. package/COLLABORATION_ROADMAP.md +22 -12
  2. package/README.md +40 -15
  3. package/dist/{0~4705.js → 0~5093.js} +959 -10
  4. package/dist/0~document-editor.js +1 -0
  5. package/dist/0~spreadsheet-editor.js +189 -104
  6. package/dist/0~work-docx-export.js +225 -6
  7. package/dist/0~work-docx-import.js +26 -755
  8. package/dist/0~work-office-diagnostics.js +12 -8
  9. package/dist/0~work-pptx-import.js +2 -2
  10. package/dist/4104.js +330 -122
  11. package/dist/4476.js +82 -65
  12. package/dist/8715.js +41 -3
  13. package/dist/8928.js +448 -137
  14. package/dist/9356.js +126 -8
  15. package/dist/core.d.ts +1 -0
  16. package/dist/internal/features/work/editors/spreadsheet-editor-support.d.ts +1 -0
  17. package/dist/internal/features/work/editors/use-spreadsheet-collaboration.d.ts +2 -1
  18. package/dist/internal/features/work/spreadsheet-sparse.d.ts +5 -0
  19. package/dist/internal/features/work/work-document-file-io.d.ts +2 -1
  20. package/dist/internal/features/work/work-document-format-change-tracking.d.ts +1 -1
  21. package/dist/internal/features/work/work-document-paragraph-format-change-tracking.d.ts +7 -0
  22. package/dist/internal/features/work/work-document-paragraph-format-changes.d.ts +8 -0
  23. package/dist/internal/features/work/work-docx-import.d.ts +5 -2
  24. package/dist/internal/features/work/work-docx-paragraph-alignment-import.d.ts +1 -0
  25. package/dist/internal/features/work/work-docx-paragraph-borders-import.d.ts +1 -0
  26. package/dist/internal/features/work/work-docx-paragraph-direction-import.d.ts +1 -0
  27. package/dist/internal/features/work/work-docx-paragraph-format-change-export.d.ts +13 -0
  28. package/dist/internal/features/work/work-docx-paragraph-format-change-import.d.ts +17 -0
  29. package/dist/internal/features/work/work-docx-paragraph-indent-import.d.ts +1 -0
  30. package/dist/internal/features/work/work-docx-paragraph-pagination-import.d.ts +1 -0
  31. package/dist/internal/features/work/work-docx-paragraph-shading-import.d.ts +1 -0
  32. package/dist/internal/features/work/work-docx-paragraph-spacing-import.d.ts +1 -0
  33. package/dist/internal/features/work/work-docx-tab-stop-import.d.ts +1 -0
  34. package/dist/internal/features/work/work-file-data.d.ts +7 -1
  35. package/dist/internal/features/work/work-file-import.d.ts +28 -0
  36. package/dist/internal/features/work/work-file-io.d.ts +2 -1
  37. package/dist/internal/features/work/work-markdown-file-io.d.ts +2 -1
  38. package/dist/internal/features/work/work-office-diagnostics.d.ts +3 -2
  39. package/dist/internal/features/work/work-pptx-import.d.ts +1 -1
  40. package/dist/internal/features/work/work-presentation-file-io.d.ts +2 -1
  41. package/dist/internal/features/work/work-spreadsheet-protection.d.ts +2 -0
  42. package/dist/internal/features/work/work-types.d.ts +23 -1
  43. package/dist/internal/features/work/work-xlsx-interop.d.ts +4 -14
  44. package/dist/office-kernel.wasm +0 -0
  45. package/dist/styles.css +8 -0
  46. package/docs/latest/en/browser-editor-architecture.md +18 -0
  47. package/package.json +10 -4
package/dist/4476.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { initializeWorkOfficeCollaborationMetadata, assertWorkOfficeCollaborationEditable, OfficeCollaborationError as WorkOfficeCollaborationError, readOfficeCollaborationMetadata as readWorkOfficeCollaborationMetadata, registerWorkOfficeCollaborationInitializer, markWorkOfficeCollaborationInitialized, assertWorkOfficeCollaborationOrigin } from "./9787.js";
2
2
  import { OFFICE_KERNEL_SPREADSHEET_MAX_ROWS } from "./5184.js";
3
3
  import { workOfficeCollaborationJsonEqual, canonicalWorkOfficeCollaborationJson, isWorkOfficeCollaborationRecord, cloneWorkOfficeCollaborationJson } from "./4650.js";
4
+ import { sparseMatrixColumnCount, sparseArrayEntries as spreadsheet_sparse_sparseArrayEntries, cloneSparseMatrix, formatSpreadsheetCellRanges, parseSpreadsheetCellRanges as work_spreadsheet_ranges_parseSpreadsheetCellRanges } from "./8715.js";
4
5
  import { patchWorkOfficeCollaborationFlatJsonMap, readWorkOfficeCollaborationFlatJsonMap } from "./7060.js";
5
- import { formatSpreadsheetCellRanges, parseSpreadsheetCellRanges } from "./8715.js";
6
6
  import * as __rspack_external_yjs from "yjs";
7
7
  const MAX_POPULATED_CELLS = 1000000;
8
8
  const MAX_DENSE_MATRIX_CELLS = 1000000;
@@ -421,7 +421,7 @@ function assertCompatibleValue(previous, next, shared, label) {
421
421
  function spreadsheetCells(sheet) {
422
422
  const result = new Map();
423
423
  if (void 0 !== sheet.data) {
424
- for (const [row, values] of sheet.data.entries())for (const [column, cell] of values.entries())if (null !== cell) result.set(`${row}:${column}`, cell);
424
+ for (const [row, values] of spreadsheet_sparse_sparseArrayEntries(sheet.data))for (const [column, cell] of spreadsheet_sparse_sparseArrayEntries(values))if (null !== cell) result.set(`${row}:${column}`, cell);
425
425
  return result;
426
426
  }
427
427
  for (const entry of sheet.celldata ?? [])if (null !== entry.v) result.set(`${entry.r}:${entry.c}`, entry.v);
@@ -531,7 +531,7 @@ function spreadsheetCellEntries(sheet) {
531
531
  if (!sheet) return [];
532
532
  const entries = [];
533
533
  if (void 0 !== sheet.data) {
534
- for (const [row, values] of sheet.data.entries())for (const [column, cell] of values.entries())if (null !== cell) entries.push({
534
+ for (const [row, values] of spreadsheet_sparse_sparseArrayEntries(sheet.data))for (const [column, cell] of spreadsheet_sparse_sparseArrayEntries(values))if (null !== cell) entries.push({
535
535
  cell,
536
536
  column,
537
537
  coordinate: encodedCoordinate(row, column),
@@ -1305,7 +1305,8 @@ function defaultSheetProtectionAuthority(enabled = false) {
1305
1305
  editScenarios: 0,
1306
1306
  hintText: '',
1307
1307
  defaultSheetHintText: DEFAULT_PROTECTION_HINT,
1308
- allowRangeList: []
1308
+ allowRangeList: [],
1309
+ cellProtectionRanges: []
1309
1310
  };
1310
1311
  }
1311
1312
  function sheetProtectionAuthority(sheet) {
@@ -1335,9 +1336,23 @@ function normalizeSheetProtectionAuthority(source) {
1335
1336
  hintText: stringValue(authority.hintText),
1336
1337
  defaultSheetHintText: stringValue(authority.defaultSheetHintText) || DEFAULT_PROTECTION_HINT,
1337
1338
  allowRangeList: editableRangeList(authority.allowRangeList),
1339
+ cellProtectionRanges: cellProtectionRangeList(authority.cellProtectionRanges),
1338
1340
  xlsxAttributes: stringRecord(authority.xlsxAttributes)
1339
1341
  };
1340
1342
  }
1343
+ function importedSheetProtectionAuthority(authority, cellProtectionRanges) {
1344
+ if (!authority && !cellProtectionRanges.length) return;
1345
+ const normalized = normalizeSheetProtectionAuthority(authority);
1346
+ normalized.cellProtectionRanges = [
1347
+ ...cellProtectionRanges,
1348
+ ...normalized.allowRangeList.filter((range)=>!editableRangeRequiresCredentials(range)).flatMap((range)=>work_spreadsheet_ranges_parseSpreadsheetCellRanges(range.sqref) ?? []).map((range)=>({
1349
+ range,
1350
+ locked: false,
1351
+ hidden: false
1352
+ }))
1353
+ ];
1354
+ return normalized;
1355
+ }
1341
1356
  function withSheetProtection(sheet, enabled) {
1342
1357
  const authority = sheetProtectionAuthority(sheet);
1343
1358
  authority.sheet = enabled ? 1 : 0;
@@ -1359,73 +1374,56 @@ function withEditableRange(sheet, index, editableRange) {
1359
1374
  };
1360
1375
  if (null !== index && authority.allowRangeList[index]) authority.allowRangeList[index] = nextRange;
1361
1376
  else authority.allowRangeList.push(nextRange);
1362
- const ranges = parseSpreadsheetCellRanges(nextRange.sqref) ?? [];
1363
- return withAuthority(withCellProtection(sheet, ranges, false), authority);
1377
+ const ranges = work_spreadsheet_ranges_parseSpreadsheetCellRanges(nextRange.sqref) ?? [];
1378
+ const next = withCellProtection(sheet, ranges, false);
1379
+ const nextAuthority = sheetProtectionAuthority(next);
1380
+ nextAuthority.allowRangeList = authority.allowRangeList;
1381
+ return withAuthority(next, nextAuthority);
1364
1382
  }
1365
1383
  function withoutEditableRange(sheet, index) {
1366
1384
  const authority = sheetProtectionAuthority(sheet);
1367
1385
  const removed = authority.allowRangeList[index];
1368
1386
  if (!removed) return sheet;
1369
1387
  authority.allowRangeList.splice(index, 1);
1370
- const removedRanges = parseSpreadsheetCellRanges(removed.sqref) ?? [];
1388
+ const removedRanges = work_spreadsheet_ranges_parseSpreadsheetCellRanges(removed.sqref) ?? [];
1371
1389
  let next = withCellProtection(sheet, removedRanges, true);
1372
- for (const editableRange of authority.allowRangeList)if (!editableRangeRequiresCredentials(editableRange)) next = withCellProtection(next, parseSpreadsheetCellRanges(editableRange.sqref) ?? [], false);
1373
- return withAuthority(next, authority);
1390
+ for (const editableRange of authority.allowRangeList)if (!editableRangeRequiresCredentials(editableRange)) next = withCellProtection(next, work_spreadsheet_ranges_parseSpreadsheetCellRanges(editableRange.sqref) ?? [], false);
1391
+ const nextAuthority = sheetProtectionAuthority(next);
1392
+ nextAuthority.allowRangeList = authority.allowRangeList;
1393
+ return withAuthority(next, nextAuthority);
1374
1394
  }
1375
1395
  function withCellProtection(sheet, ranges, locked, hidden = false) {
1376
1396
  if (!ranges.length) return sheet;
1377
- const data = cloneMatrix(sheet.data);
1397
+ const data = cloneSparseMatrix(sheet.data);
1378
1398
  let rowCount = Math.max(sheet.row ?? 0, data.length);
1379
- let columnCount = Math.max(sheet.column ?? 0, ...data.map((row)=>row.length));
1399
+ let columnCount = Math.max(sheet.column ?? 0, sparseMatrixColumnCount(data));
1380
1400
  for (const range of ranges){
1381
1401
  rowCount = Math.max(rowCount, range.row[1] + 1);
1382
1402
  columnCount = Math.max(columnCount, range.column[1] + 1);
1383
- for(let row = range.row[0]; row <= range.row[1]; row += 1){
1384
- data[row] ??= [];
1385
- for(let column = range.column[0]; column <= range.column[1]; column += 1){
1386
- const cell = {
1387
- ...data[row][column] ?? {}
1388
- };
1389
- cell.lo = locked ? 1 : 0;
1390
- if (hidden) cell.hi = 1;
1391
- else if (void 0 !== cell.hi) delete cell.hi;
1392
- data[row][column] = cell;
1393
- }
1403
+ for (const [row, values] of spreadsheet_sparse_sparseArrayEntries(data))if (!(row < range.row[0]) && !(row > range.row[1])) for (const [column, source] of spreadsheet_sparse_sparseArrayEntries(values)){
1404
+ if (column < range.column[0] || column > range.column[1]) continue;
1405
+ const cell = {
1406
+ ...source ?? {}
1407
+ };
1408
+ cell.lo = locked ? 1 : 0;
1409
+ if (hidden) cell.hi = 1;
1410
+ else if (void 0 !== cell.hi) delete cell.hi;
1411
+ data[row][column] = cell;
1394
1412
  }
1395
1413
  }
1396
1414
  normalizeMatrix(data, rowCount, columnCount);
1397
- return {
1415
+ const authority = sheetProtectionAuthority(sheet);
1416
+ authority.cellProtectionRanges.push(...ranges.map((range)=>({
1417
+ range,
1418
+ locked,
1419
+ hidden
1420
+ })));
1421
+ return withAuthority({
1398
1422
  ...sheet,
1399
1423
  row: rowCount,
1400
1424
  column: columnCount,
1401
1425
  data
1402
- };
1403
- }
1404
- function applySpreadsheetCellProtectionRanges(data, ranges, rowCount, columnCount) {
1405
- for (const item of ranges){
1406
- const lastRow = Math.min(item.range.row[1], rowCount - 1);
1407
- const lastColumn = Math.min(item.range.column[1], columnCount - 1);
1408
- for(let row = Math.max(0, item.range.row[0]); row <= lastRow; row += 1){
1409
- data[row] ??= [];
1410
- for(let column = Math.max(0, item.range.column[0]); column <= lastColumn; column += 1){
1411
- const cell = {
1412
- ...data[row][column] ?? {}
1413
- };
1414
- cell.lo = item.locked ? 1 : 0;
1415
- if (item.hidden) cell.hi = 1;
1416
- else if (void 0 !== cell.hi) delete cell.hi;
1417
- data[row][column] = cell;
1418
- }
1419
- }
1420
- }
1421
- }
1422
- function applyPasswordlessEditableRanges(data, ranges, rowCount, columnCount) {
1423
- const protectionRanges = ranges.filter((range)=>!editableRangeRequiresCredentials(range)).flatMap((range)=>parseSpreadsheetCellRanges(range.sqref) ?? []).map((range)=>({
1424
- range,
1425
- locked: false,
1426
- hidden: false
1427
- }));
1428
- applySpreadsheetCellProtectionRanges(data, protectionRanges, rowCount, columnCount);
1426
+ }, authority);
1429
1427
  }
1430
1428
  function editableRangeRequiresCredentials(range) {
1431
1429
  const attributes = range.xlsxAttributes ?? {};
@@ -1446,7 +1444,7 @@ function spreadsheetProtectionKey(sheets) {
1446
1444
  return sheets.map((sheet)=>{
1447
1445
  const authority = sheetProtectionAuthority(sheet);
1448
1446
  const cells = [];
1449
- for (const [row, values] of (sheet.data ?? []).entries())for (const [column, cell] of values.entries()){
1447
+ for (const [row, values] of spreadsheet_sparse_sparseArrayEntries(sheet.data))for (const [column, cell] of spreadsheet_sparse_sparseArrayEntries(values)){
1450
1448
  const hidden = cell?.hi;
1451
1449
  if (cell?.lo !== void 0 || void 0 !== hidden) cells.push(`${row}_${column}:${cell?.lo ?? ''}:${hidden ?? ''}`);
1452
1450
  }
@@ -1471,7 +1469,7 @@ function editableRangeList(value) {
1471
1469
  if (!item || 'object' != typeof item) return [];
1472
1470
  const range = item;
1473
1471
  const sqref = stringValue(range.sqref);
1474
- if (!sqref || !parseSpreadsheetCellRanges(sqref)) return [];
1472
+ if (!sqref || !work_spreadsheet_ranges_parseSpreadsheetCellRanges(sqref)) return [];
1475
1473
  return [
1476
1474
  {
1477
1475
  name: stringValue(range.name) || `Range ${index + 1}`,
@@ -1483,21 +1481,40 @@ function editableRangeList(value) {
1483
1481
  });
1484
1482
  }
1485
1483
  function canonicalRangeReference(value) {
1486
- const ranges = parseSpreadsheetCellRanges(value);
1484
+ const ranges = work_spreadsheet_ranges_parseSpreadsheetCellRanges(value);
1487
1485
  return ranges ? formatSpreadsheetCellRanges(ranges) : value.trim();
1488
1486
  }
1489
- function cloneMatrix(source) {
1490
- return (source ?? []).map((row)=>[
1491
- ...row
1492
- ]);
1493
- }
1494
1487
  function normalizeMatrix(data, rows, columns) {
1495
- while(data.length < rows)data.push([]);
1496
- for(let index = 0; index < data.length; index += 1){
1497
- const row = data[index] ?? [];
1498
- data[index] = row;
1499
- while(row.length < columns)row.push(null);
1500
- }
1488
+ data.length = Math.max(data.length, rows);
1489
+ for (const [, row] of spreadsheet_sparse_sparseArrayEntries(data))row.length = Math.max(row.length, columns);
1490
+ }
1491
+ function cellProtectionRangeList(value) {
1492
+ if (!Array.isArray(value)) return [];
1493
+ return value.flatMap((item)=>{
1494
+ if (!item || 'object' != typeof item) return [];
1495
+ const candidate = item;
1496
+ const range = candidate.range;
1497
+ if (!range || !Array.isArray(range.row) || !Array.isArray(range.column) || range.row.length < 2 || range.column.length < 2 || ![
1498
+ ...range.row,
1499
+ ...range.column
1500
+ ].every((index)=>Number.isSafeInteger(index) && index >= 0)) return [];
1501
+ return [
1502
+ {
1503
+ range: {
1504
+ row: [
1505
+ Math.min(range.row[0], range.row[1]),
1506
+ Math.max(range.row[0], range.row[1])
1507
+ ],
1508
+ column: [
1509
+ Math.min(range.column[0], range.column[1]),
1510
+ Math.max(range.column[0], range.column[1])
1511
+ ]
1512
+ },
1513
+ locked: false !== candidate.locked,
1514
+ hidden: true === candidate.hidden
1515
+ }
1516
+ ];
1517
+ });
1501
1518
  }
1502
1519
  function flag(value, fallback) {
1503
1520
  if (1 === value || true === value || '1' === value) return 1;
@@ -2005,4 +2022,4 @@ function boundedInteger(value, minimum, maximum, fallback) {
2005
2022
  function boundedNumber(value, minimum, maximum, fallback) {
2006
2023
  return 'number' == typeof value && Number.isFinite(value) && value >= minimum && value <= maximum ? value : fallback;
2007
2024
  }
2008
- export { DEFAULT_PROTECTION_HINT, SPREADSHEET_CONDITIONAL_COMPARISON_OPERATORS, SPREADSHEET_CONDITIONAL_ICON_SETS, applyPasswordlessEditableRanges, applySpreadsheetCellProtectionRanges, createWorkOfficeSpreadsheetCollaborationBinding as createOfficeSpreadsheetCollaborationBinding, defaultSpreadsheetColorScaleThresholds, defaultSpreadsheetConditionalIconThresholds, defaultSpreadsheetDataBarOptions, drawSpreadsheetConditionalIcon, editableRangeCellCount, editableRangeRequiresCredentials, effectiveSpreadsheetPageSetup, initializeWorkOfficeSpreadsheetCollaboration as initializeOfficeSpreadsheetCollaboration, isSpreadsheetConditionalComparisonOperator, isSpreadsheetConditionalIconSetName, normalizeSheetProtectionAuthority, normalizeSpreadsheetConditionalIconSetFormat, normalizeSpreadsheetConditionalVisualOptions, normalizeSpreadsheetPaperSize, protectedSheetCount, readWorkOfficeSpreadsheetCollaboration as readOfficeSpreadsheetCollaboration, replaceWorkOfficeSpreadsheetCollaboration as replaceOfficeSpreadsheetCollaboration, sheetHasProtectionState, sheetProtectionAuthority, spreadsheetConditionalComparisonNeedsUpperValue, spreadsheetConditionalIconForValue, spreadsheetConditionalIconSetCount, spreadsheetConditionalThresholdValue, spreadsheetConditionalThresholdsEqual, spreadsheetProtectionKey, unlockedCellCount, withEditableRange, withSheetProtection, withSheetSelectionPermissions, withoutEditableRange };
2025
+ export { DEFAULT_PROTECTION_HINT, SPREADSHEET_CONDITIONAL_COMPARISON_OPERATORS, SPREADSHEET_CONDITIONAL_ICON_SETS, createWorkOfficeSpreadsheetCollaborationBinding as createOfficeSpreadsheetCollaborationBinding, defaultSpreadsheetColorScaleThresholds, defaultSpreadsheetConditionalIconThresholds, defaultSpreadsheetDataBarOptions, drawSpreadsheetConditionalIcon, editableRangeCellCount, editableRangeRequiresCredentials, effectiveSpreadsheetPageSetup, importedSheetProtectionAuthority, initializeWorkOfficeSpreadsheetCollaboration as initializeOfficeSpreadsheetCollaboration, isSpreadsheetConditionalComparisonOperator, isSpreadsheetConditionalIconSetName, normalizeSheetProtectionAuthority, normalizeSpreadsheetConditionalIconSetFormat, normalizeSpreadsheetConditionalVisualOptions, normalizeSpreadsheetPaperSize, protectedSheetCount, readWorkOfficeSpreadsheetCollaboration as readOfficeSpreadsheetCollaboration, replaceWorkOfficeSpreadsheetCollaboration as replaceOfficeSpreadsheetCollaboration, sheetHasProtectionState, sheetProtectionAuthority, spreadsheetConditionalComparisonNeedsUpperValue, spreadsheetConditionalIconForValue, spreadsheetConditionalIconSetCount, spreadsheetConditionalThresholdValue, spreadsheetConditionalThresholdsEqual, spreadsheetProtectionKey, unlockedCellCount, withEditableRange, withSheetProtection, withSheetSelectionPermissions, withoutEditableRange };
package/dist/8715.js CHANGED
@@ -1,4 +1,42 @@
1
1
  import { createOfficeId as createWorkId, directChild, attribute } from "./5184.js";
2
+ function sparseArrayIndexes(values) {
3
+ if (!values) return [];
4
+ return Object.keys(values).flatMap((key)=>{
5
+ const index = Number(key);
6
+ return Number.isSafeInteger(index) && index >= 0 && index < values.length ? [
7
+ index
8
+ ] : [];
9
+ });
10
+ }
11
+ function sparseArrayEntries(values) {
12
+ if (!values) return [];
13
+ return sparseArrayIndexes(values).flatMap((index)=>{
14
+ const value = values[index];
15
+ return void 0 === value ? [] : [
16
+ [
17
+ index,
18
+ value
19
+ ]
20
+ ];
21
+ });
22
+ }
23
+ function sparseMatrixColumnCount(matrix) {
24
+ let maximum = 0;
25
+ for (const [, row] of sparseArrayEntries(matrix))maximum = Math.max(maximum, row.length);
26
+ return maximum;
27
+ }
28
+ function cloneSparseMatrix(source) {
29
+ const clone = [];
30
+ if (!source) return clone;
31
+ clone.length = source.length;
32
+ for (const [rowIndex, sourceRow] of sparseArrayEntries(source)){
33
+ const row = [];
34
+ row.length = sourceRow.length;
35
+ for (const columnIndex of sparseArrayIndexes(sourceRow))row[columnIndex] = sourceRow[columnIndex];
36
+ clone[rowIndex] = row;
37
+ }
38
+ return clone;
39
+ }
2
40
  function normalizeWorkSpreadsheetDoughnutHoleSize(value) {
3
41
  const size = Number(value);
4
42
  if (!Number.isFinite(size)) return 50;
@@ -3725,8 +3763,8 @@ function spreadsheetFormulaRangeConflict(sheet, range) {
3725
3763
  if (!anchorCell) return '锚点单元格不存在';
3726
3764
  const overlaps = (sheet.formulaMetadata?.ranges ?? []).filter((candidate)=>candidate !== range && work_spreadsheet_formulas_rangesOverlap(bounds, parseSpreadsheetFormulaRange(candidate.reference)));
3727
3765
  if (overlaps.length) return '与其他公式范围重叠';
3728
- for (const [row, cells] of (sheet.data ?? []).entries())if (!(row < bounds.startRow) && !(row > bounds.endRow)) {
3729
- for (const [column, cell] of cells.entries())if (!(column < bounds.startColumn) && !(column > bounds.endColumn)) {
3766
+ for (const [row, cells] of sparseArrayEntries(sheet.data))if (!(row < bounds.startRow) && !(row > bounds.endRow)) {
3767
+ for (const [column, cell] of sparseArrayEntries(cells))if (!(column < bounds.startColumn) && !(column > bounds.endColumn)) {
3730
3768
  if (row !== anchor.row || column !== anchor.column) {
3731
3769
  if (cell?.f) return `${spreadsheetCellAddress(row, column)} 包含独立公式`;
3732
3770
  }
@@ -3822,4 +3860,4 @@ function positiveNumber(value, fallback) {
3822
3860
  function transformFormulaOutsideStrings(formula, transform) {
3823
3861
  return formula.split(/("(?:[^"]|"")*")/).map((segment, index)=>index % 2 ? segment : transform(segment)).join('');
3824
3862
  }
3825
- export { createSpreadsheetChartFromSelection, createSpreadsheetPivotFromSelection, defaultPivotValueCaption, defaultWorkSpreadsheetChartSeriesStyle, deleteSpreadsheetPivotTable, editableSpreadsheetFormula, effectiveSpreadsheetCalculationSettings, errorBarSourceValues, fitSpreadsheetTrendline, formatSpreadsheetCellRanges, formatSpreadsheetChartAxisNumber, formulaHasExternalReference, formulaHasStructuredReference, isValidSpreadsheetDefinedName, normalizeSpreadsheetPrintArea, normalizeSpreadsheetPrintTitleColumns, normalizeSpreadsheetPrintTitleRows, normalizeWorkSpreadsheetBubbleScale, normalizeWorkSpreadsheetBubbleSizeRepresents, normalizeWorkSpreadsheetChartAxes, normalizeWorkSpreadsheetChartAxisGroup, normalizeWorkSpreadsheetChartColor, normalizeWorkSpreadsheetChartGapWidth, normalizeWorkSpreadsheetChartGrouping, normalizeWorkSpreadsheetChartLayout, normalizeWorkSpreadsheetChartLegendOverlay, normalizeWorkSpreadsheetChartLegendPosition, normalizeWorkSpreadsheetChartOverlap, normalizeWorkSpreadsheetChartSeriesStyle, normalizeWorkSpreadsheetChartSmoothLines, normalizeWorkSpreadsheetCombinationSeriesType, normalizeWorkSpreadsheetDataLabelPosition, normalizeWorkSpreadsheetDataLabels, normalizeWorkSpreadsheetDoughnutHoleSize, normalizeWorkSpreadsheetErrorBars, normalizeWorkSpreadsheetRadarStyle, normalizeWorkSpreadsheetScatterStyle, normalizeWorkSpreadsheetTrendline, normalizeWorkSpreadsheetTrendlineType, parseSpreadsheetCellRanges, parseSpreadsheetChartReference, parseSpreadsheetPrintTitles, qualifySpreadsheetRange, readXlsxDrawingAnchor, reconcileSpreadsheetChartPreviews, reconcileSpreadsheetPivots, refreshSpreadsheetPivotTables, resolveSpreadsheetChart, roundChartNumber, spreadsheetCellAddress, spreadsheetChartAxisGridlinesVisible, spreadsheetChartAxisLabelLayout, spreadsheetChartAxisScale, spreadsheetChartAxisValueRatio, spreadsheetChartBarGeometry, spreadsheetChartCategoryLabelVisible, spreadsheetChartCategoryVisualIndex, spreadsheetChartCount, spreadsheetChartSeriesFillStyle, spreadsheetChartSeriesLayout, spreadsheetChartSeriesLegendColor, spreadsheetChartSeriesLineStyle, spreadsheetChartSeriesStyleContext, spreadsheetErrorBarAmounts, spreadsheetFormulaForXlsx, spreadsheetFormulaFunctions, spreadsheetFormulaRangeConflict, spreadsheetFormulaRangeForCell, spreadsheetFormulaRangesForSelection, spreadsheetPivotAggregationLabel, spreadsheetPivotCount, spreadsheetPivotFields, spreadsheetPivotFilterItems, spreadsheetPivotFilterValueKey, spreadsheetPivotIntersects, spreadsheetPivotOutputContains, spreadsheetPivotValidation, spreadsheetSheetsWithChartPreviews, stripSpreadsheetSheetQualifier, volatileSpreadsheetFormulaFunctions, workSpreadsheetChartAxisDefaultLabelPosition, workSpreadsheetChartAxisIsCategoryAxis, workSpreadsheetChartAxisIsValueAxis, workSpreadsheetChartAxisLabelPositionLabel, workSpreadsheetChartAxisPositionLabel, workSpreadsheetChartAxisShowsMajorGridlinesByDefault, workSpreadsheetChartAxisTickMarkLabel, workSpreadsheetChartGroupingIsStacked, workSpreadsheetChartGroupingLabel, workSpreadsheetChartLegendPositionLabel, workSpreadsheetChartSupportsAxes, workSpreadsheetChartSupportsBarSpacing, workSpreadsheetChartSupportsErrorBars, workSpreadsheetChartSupportsGrouping, workSpreadsheetChartSupportsSeriesAnalysis, workSpreadsheetChartSupportsSmoothLines, workSpreadsheetChartSupportsTrendlines, workSpreadsheetChartTypeLabel, workSpreadsheetChartUsesNumericXAxis, workSpreadsheetCombinationSeriesTypeLabel, workSpreadsheetDataLabelPositionLabel, workSpreadsheetErrorBarTypeLabel, workSpreadsheetErrorBarValueTypeLabel, workSpreadsheetTrendlineTypeLabel, xlsxDrawingAnchorToBounds, xlsxTwoCellAnchorMarkers };
3863
+ export { cloneSparseMatrix, createSpreadsheetChartFromSelection, createSpreadsheetPivotFromSelection, defaultPivotValueCaption, defaultWorkSpreadsheetChartSeriesStyle, deleteSpreadsheetPivotTable, editableSpreadsheetFormula, effectiveSpreadsheetCalculationSettings, errorBarSourceValues, fitSpreadsheetTrendline, formatSpreadsheetCellRanges, formatSpreadsheetChartAxisNumber, formulaHasExternalReference, formulaHasStructuredReference, isValidSpreadsheetDefinedName, normalizeSpreadsheetPrintArea, normalizeSpreadsheetPrintTitleColumns, normalizeSpreadsheetPrintTitleRows, normalizeWorkSpreadsheetBubbleScale, normalizeWorkSpreadsheetBubbleSizeRepresents, normalizeWorkSpreadsheetChartAxes, normalizeWorkSpreadsheetChartAxisGroup, normalizeWorkSpreadsheetChartColor, normalizeWorkSpreadsheetChartGapWidth, normalizeWorkSpreadsheetChartGrouping, normalizeWorkSpreadsheetChartLayout, normalizeWorkSpreadsheetChartLegendOverlay, normalizeWorkSpreadsheetChartLegendPosition, normalizeWorkSpreadsheetChartOverlap, normalizeWorkSpreadsheetChartSeriesStyle, normalizeWorkSpreadsheetChartSmoothLines, normalizeWorkSpreadsheetCombinationSeriesType, normalizeWorkSpreadsheetDataLabelPosition, normalizeWorkSpreadsheetDataLabels, normalizeWorkSpreadsheetDoughnutHoleSize, normalizeWorkSpreadsheetErrorBars, normalizeWorkSpreadsheetRadarStyle, normalizeWorkSpreadsheetScatterStyle, normalizeWorkSpreadsheetTrendline, normalizeWorkSpreadsheetTrendlineType, parseSpreadsheetCellRanges, parseSpreadsheetChartReference, parseSpreadsheetPrintTitles, qualifySpreadsheetRange, readXlsxDrawingAnchor, reconcileSpreadsheetChartPreviews, reconcileSpreadsheetPivots, refreshSpreadsheetPivotTables, resolveSpreadsheetChart, roundChartNumber, sparseArrayEntries, sparseArrayIndexes, sparseMatrixColumnCount, spreadsheetCellAddress, spreadsheetChartAxisGridlinesVisible, spreadsheetChartAxisLabelLayout, spreadsheetChartAxisScale, spreadsheetChartAxisValueRatio, spreadsheetChartBarGeometry, spreadsheetChartCategoryLabelVisible, spreadsheetChartCategoryVisualIndex, spreadsheetChartCount, spreadsheetChartSeriesFillStyle, spreadsheetChartSeriesLayout, spreadsheetChartSeriesLegendColor, spreadsheetChartSeriesLineStyle, spreadsheetChartSeriesStyleContext, spreadsheetErrorBarAmounts, spreadsheetFormulaForXlsx, spreadsheetFormulaFunctions, spreadsheetFormulaRangeConflict, spreadsheetFormulaRangeForCell, spreadsheetFormulaRangesForSelection, spreadsheetPivotAggregationLabel, spreadsheetPivotCount, spreadsheetPivotFields, spreadsheetPivotFilterItems, spreadsheetPivotFilterValueKey, spreadsheetPivotIntersects, spreadsheetPivotOutputContains, spreadsheetPivotValidation, spreadsheetSheetsWithChartPreviews, stripSpreadsheetSheetQualifier, volatileSpreadsheetFormulaFunctions, workSpreadsheetChartAxisDefaultLabelPosition, workSpreadsheetChartAxisIsCategoryAxis, workSpreadsheetChartAxisIsValueAxis, workSpreadsheetChartAxisLabelPositionLabel, workSpreadsheetChartAxisPositionLabel, workSpreadsheetChartAxisShowsMajorGridlinesByDefault, workSpreadsheetChartAxisTickMarkLabel, workSpreadsheetChartGroupingIsStacked, workSpreadsheetChartGroupingLabel, workSpreadsheetChartLegendPositionLabel, workSpreadsheetChartSupportsAxes, workSpreadsheetChartSupportsBarSpacing, workSpreadsheetChartSupportsErrorBars, workSpreadsheetChartSupportsGrouping, workSpreadsheetChartSupportsSeriesAnalysis, workSpreadsheetChartSupportsSmoothLines, workSpreadsheetChartSupportsTrendlines, workSpreadsheetChartTypeLabel, workSpreadsheetChartUsesNumericXAxis, workSpreadsheetCombinationSeriesTypeLabel, workSpreadsheetDataLabelPositionLabel, workSpreadsheetErrorBarTypeLabel, workSpreadsheetErrorBarValueTypeLabel, workSpreadsheetTrendlineTypeLabel, xlsxDrawingAnchorToBounds, xlsxTwoCellAnchorMarkers };