@extend-ai/react-xlsx 0.8.3 → 0.8.4

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.
@@ -4120,6 +4120,10 @@ function parseSheetState(archive, path, options) {
4120
4120
  let hasVerticalMerges = false;
4121
4121
  let maxHorizontalMergeEndCol = -1;
4122
4122
  let maxVerticalMergeEndRow = -1;
4123
+ let minContentCol = Number.POSITIVE_INFINITY;
4124
+ let minContentRow = Number.POSITIVE_INFINITY;
4125
+ let maxContentCol = -1;
4126
+ let maxContentRow = -1;
4123
4127
  const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(
4124
4128
  options?.defaultFont?.family,
4125
4129
  options?.defaultFont?.sizePt
@@ -4132,6 +4136,26 @@ function parseSheetState(archive, path, options) {
4132
4136
  sheetViewNode?.getAttribute("zoomScale") ?? sheetViewNode?.getAttribute("zoomScaleNormal") ?? Number.NaN
4133
4137
  );
4134
4138
  const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0 ? rawZoomScale : 100;
4139
+ const trackContentCell = (cellRef) => {
4140
+ if (!cellRef) {
4141
+ return;
4142
+ }
4143
+ const cell = parseA1CellReference(cellRef);
4144
+ if (!cell) {
4145
+ return;
4146
+ }
4147
+ minContentCol = Math.min(minContentCol, cell.col);
4148
+ minContentRow = Math.min(minContentRow, cell.row);
4149
+ maxContentCol = Math.max(maxContentCol, cell.col);
4150
+ maxContentRow = Math.max(maxContentRow, cell.row);
4151
+ };
4152
+ const isMeaningfulCellNode = (cellNode) => {
4153
+ if (getFirstChild(cellNode, "f") || getFirstChild(cellNode, "is")) {
4154
+ return true;
4155
+ }
4156
+ const valueNode = getFirstChild(cellNode, "v");
4157
+ return Boolean(valueNode && (valueNode.textContent ?? "").length > 0);
4158
+ };
4135
4159
  getLocalElements(document2, "row").forEach((rowNode) => {
4136
4160
  const rowIndex = Number(rowNode.getAttribute("r") ?? 0) - 1;
4137
4161
  const height = Number(rowNode.getAttribute("ht") ?? Number.NaN);
@@ -4146,17 +4170,36 @@ function parseSheetState(archive, path, options) {
4146
4170
  if (rowIndex >= 0 && isHidden) {
4147
4171
  hiddenRows.add(rowIndex);
4148
4172
  }
4149
- if (includeCachedFormulaValues) {
4150
- getChildElements(rowNode, "c").forEach((cellNode) => {
4173
+ getChildElements(rowNode, "c").forEach((cellNode) => {
4174
+ const cellRef = cellNode.getAttribute("r");
4175
+ if (isMeaningfulCellNode(cellNode)) {
4176
+ trackContentCell(cellRef);
4177
+ }
4178
+ if (includeCachedFormulaValues) {
4151
4179
  const formulaNode = getFirstChild(cellNode, "f");
4152
4180
  const valueNode = getFirstChild(cellNode, "v");
4153
- const cellRef = cellNode.getAttribute("r");
4154
4181
  if (formulaNode && valueNode && cellRef) {
4155
4182
  cachedFormulaValues[cellRef] = valueNode.textContent ?? "";
4156
4183
  }
4157
- });
4184
+ }
4185
+ });
4186
+ });
4187
+ getLocalElements(document2, "mergeCell").forEach((mergeNode) => {
4188
+ const reference = mergeNode.getAttribute("ref");
4189
+ const range = reference ? parseA1RangeReference(reference) : null;
4190
+ if (!range) {
4191
+ return;
4192
+ }
4193
+ if (range.end.col > range.start.col) {
4194
+ hasHorizontalMerges = true;
4195
+ maxHorizontalMergeEndCol = Math.max(maxHorizontalMergeEndCol, range.end.col);
4196
+ }
4197
+ if (range.end.row > range.start.row) {
4198
+ hasVerticalMerges = true;
4199
+ maxVerticalMergeEndRow = Math.max(maxVerticalMergeEndRow, range.end.row);
4158
4200
  }
4159
4201
  });
4202
+ const maxMetadataCol = Math.max(maxContentCol, maxHorizontalMergeEndCol, 0) + 256;
4160
4203
  getLocalElements(document2, "col").forEach((colNode) => {
4161
4204
  const min = Number(colNode.getAttribute("min") ?? 0) - 1;
4162
4205
  const max = Number(colNode.getAttribute("max") ?? 0) - 1;
@@ -4168,7 +4211,7 @@ function parseSheetState(archive, path, options) {
4168
4211
  return;
4169
4212
  }
4170
4213
  }
4171
- for (let col = min; col <= max; col += 1) {
4214
+ for (let col = min; col <= Math.min(max, maxMetadataCol); col += 1) {
4172
4215
  if (col >= 0) {
4173
4216
  if (Number.isFinite(width)) {
4174
4217
  const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);
@@ -4183,21 +4226,6 @@ function parseSheetState(archive, path, options) {
4183
4226
  }
4184
4227
  }
4185
4228
  });
4186
- getLocalElements(document2, "mergeCell").forEach((mergeNode) => {
4187
- const reference = mergeNode.getAttribute("ref");
4188
- const range = reference ? parseA1RangeReference(reference) : null;
4189
- if (!range) {
4190
- return;
4191
- }
4192
- if (range.end.col > range.start.col) {
4193
- hasHorizontalMerges = true;
4194
- maxHorizontalMergeEndCol = Math.max(maxHorizontalMergeEndCol, range.end.col);
4195
- }
4196
- if (range.end.row > range.start.row) {
4197
- hasVerticalMerges = true;
4198
- maxVerticalMergeEndRow = Math.max(maxVerticalMergeEndRow, range.end.row);
4199
- }
4200
- });
4201
4229
  return {
4202
4230
  cachedFormulaValues,
4203
4231
  columnWidthCharacterWidthPx,
@@ -4210,6 +4238,10 @@ function parseSheetState(archive, path, options) {
4210
4238
  hasVerticalMerges,
4211
4239
  maxHorizontalMergeEndCol,
4212
4240
  maxVerticalMergeEndRow,
4241
+ maxContentCol,
4242
+ maxContentRow,
4243
+ minContentCol: Number.isFinite(minContentCol) ? minContentCol : -1,
4244
+ minContentRow: Number.isFinite(minContentRow) ? minContentRow : -1,
4213
4245
  hiddenCols: [...hiddenCols].sort((left, right) => left - right),
4214
4246
  hiddenRows: [...hiddenRows].sort((left, right) => left - right),
4215
4247
  rowHeightOverridesPx,
@@ -4517,6 +4549,20 @@ function resolveWorksheetZoomScale(worksheet, sheetState) {
4517
4549
  const value = candidates.find((entry) => typeof entry === "number" && Number.isFinite(entry) && entry > 0);
4518
4550
  return value ?? DEFAULT_ZOOM_SCALE;
4519
4551
  }
4552
+ function resolveSheetDisplayUsedRange(usedRange, sheetState) {
4553
+ const [minRow, minCol, maxRow, maxCol] = usedRange;
4554
+ const maxMeaningfulRow = Math.max(sheetState?.maxContentRow ?? -1, sheetState?.maxVerticalMergeEndRow ?? -1);
4555
+ const maxMeaningfulCol = Math.max(sheetState?.maxContentCol ?? -1, sheetState?.maxHorizontalMergeEndCol ?? -1);
4556
+ if (maxMeaningfulRow < 0 && maxMeaningfulCol < 0) {
4557
+ return usedRange;
4558
+ }
4559
+ return [
4560
+ sheetState?.minContentRow !== void 0 && sheetState.minContentRow >= 0 ? Math.min(minRow, sheetState.minContentRow) : minRow,
4561
+ sheetState?.minContentCol !== void 0 && sheetState.minContentCol >= 0 ? Math.min(minCol, sheetState.minContentCol) : minCol,
4562
+ maxMeaningfulRow >= 0 ? Math.min(maxRow, maxMeaningfulRow) : maxRow,
4563
+ maxMeaningfulCol >= 0 ? Math.min(maxCol, maxMeaningfulCol) : maxCol
4564
+ ];
4565
+ }
4520
4566
  function buildSheetList(nextWorkbook, structureAssets, showHiddenSheets = false) {
4521
4567
  const sheetsByWorkbookSheetIndex = [];
4522
4568
  for (let index = 0; index < nextWorkbook.sheetCount; index += 1) {
@@ -4583,7 +4629,7 @@ function buildSheetList(nextWorkbook, structureAssets, showHiddenSheets = false)
4583
4629
  });
4584
4630
  continue;
4585
4631
  }
4586
- const [minRow, minCol, maxRow, maxCol] = usedRange;
4632
+ const [minRow, minCol, maxRow, maxCol] = resolveSheetDisplayUsedRange(usedRange, sheetState);
4587
4633
  const hiddenRows = (sheetState?.hiddenRows ?? []).filter((row) => row >= 0 && row <= maxRow);
4588
4634
  const hiddenCols = (sheetState?.hiddenCols ?? []).filter((col) => col >= 0 && col <= maxCol);
4589
4635
  sheetsByWorkbookSheetIndex.push({