@extend-ai/react-xlsx 0.16.2 → 0.16.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.
package/dist/index.js CHANGED
@@ -3064,6 +3064,17 @@ function applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, archive
3064
3064
  });
3065
3065
  }
3066
3066
  }
3067
+ function hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets) {
3068
+ const chartOriginsById = /* @__PURE__ */ new Map();
3069
+ applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);
3070
+ for (const charts of chartsByWorkbookSheetIndex) {
3071
+ for (const chart of charts) {
3072
+ applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);
3073
+ applyBuiltinChartDefaults(chart, imageAssets.themePalette);
3074
+ }
3075
+ }
3076
+ return chartOriginsById;
3077
+ }
3067
3078
  function loadWorkbookChartAssets(workbook, imageAssets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets = false) {
3068
3079
  const excludedChartIds = /* @__PURE__ */ new Set();
3069
3080
  const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {
@@ -3164,21 +3175,14 @@ function loadWorkbookChartAssets(workbook, imageAssets, visibleSheetIndexByWorkb
3164
3175
  });
3165
3176
  const chartsheets = Array.isArray(workbook.chartsheets) ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index)) : [];
3166
3177
  const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);
3167
- const chartOriginsById = /* @__PURE__ */ new Map();
3178
+ const chartOriginsById = imageAssets ? hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets) : /* @__PURE__ */ new Map();
3168
3179
  if (imageAssets) {
3169
- applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);
3170
3180
  for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {
3171
3181
  chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? []).filter((chart) => !excludedChartIds.has(chart.id));
3172
3182
  }
3173
3183
  for (const id of excludedChartIds) {
3174
3184
  chartOriginsById.delete(id);
3175
3185
  }
3176
- for (const charts of chartsByWorkbookSheetIndex) {
3177
- for (const chart of charts) {
3178
- applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);
3179
- applyBuiltinChartDefaults(chart, imageAssets.themePalette);
3180
- }
3181
- }
3182
3186
  } else {
3183
3187
  for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {
3184
3188
  chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? []).filter((chart) => !excludedChartIds.has(chart.id));
@@ -4421,6 +4425,7 @@ function parseWorkbookStyles(archive) {
4421
4425
  const xml = readArchiveText2(archive, "xl/styles.xml");
4422
4426
  if (!xml) {
4423
4427
  return {
4428
+ differentialStyles: [],
4424
4429
  defaultFont: null,
4425
4430
  namedCellStyleByName: {},
4426
4431
  styleById: {},
@@ -4430,6 +4435,7 @@ function parseWorkbookStyles(archive) {
4430
4435
  const document2 = parseXml2(xml);
4431
4436
  if (!document2) {
4432
4437
  return {
4438
+ differentialStyles: [],
4433
4439
  defaultFont: null,
4434
4440
  namedCellStyleByName: {},
4435
4441
  styleById: {},
@@ -4446,6 +4452,7 @@ function parseWorkbookStyles(archive) {
4446
4452
  const tableStylesNode = getFirstDescendant(document2, "tableStyles");
4447
4453
  if (!cellXfsNode) {
4448
4454
  return {
4455
+ differentialStyles: [],
4449
4456
  defaultFont: null,
4450
4457
  namedCellStyleByName: {},
4451
4458
  styleById: {},
@@ -4502,6 +4509,7 @@ function parseWorkbookStyles(archive) {
4502
4509
  sizePt: typeof normalFont.size === "number" ? normalFont.size : void 0
4503
4510
  } : null;
4504
4511
  return {
4512
+ differentialStyles,
4505
4513
  defaultFont,
4506
4514
  namedCellStyleByName,
4507
4515
  styleById,
@@ -4542,10 +4550,11 @@ function parseSpreadsheetBooleanAttribute(node, name) {
4542
4550
  }
4543
4551
  return value !== "0" && value !== "false";
4544
4552
  }
4545
- function parseStandardConditionalFormatRule(cfRuleNode, ranges) {
4553
+ function parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles = []) {
4546
4554
  const type = cfRuleNode.getAttribute("type");
4547
4555
  const rawPriority = Number(cfRuleNode.getAttribute("priority") ?? Number.NaN);
4548
4556
  const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;
4557
+ const formulas = getChildElements(cfRuleNode, "formula").map((formulaNode) => (formulaNode.textContent ?? "").trim()).filter((formula) => formula.length > 0);
4549
4558
  if (type === "colorScale") {
4550
4559
  const colorScaleNode = getFirstChild(cfRuleNode, "colorScale");
4551
4560
  if (!colorScaleNode) {
@@ -4606,7 +4615,34 @@ function parseStandardConditionalFormatRule(cfRuleNode, ranges) {
4606
4615
  showValue: parseSpreadsheetBooleanAttribute(iconSetNode, "showValue")
4607
4616
  };
4608
4617
  }
4609
- return null;
4618
+ const rawDxfId = Number(cfRuleNode.getAttribute("dxfId") ?? Number.NaN);
4619
+ if (!type || !Number.isFinite(rawDxfId)) {
4620
+ return null;
4621
+ }
4622
+ const style = differentialStyles[rawDxfId];
4623
+ if (!style) {
4624
+ return null;
4625
+ }
4626
+ const rawRank = Number(cfRuleNode.getAttribute("rank") ?? Number.NaN);
4627
+ const rawStdDev = Number(cfRuleNode.getAttribute("stdDev") ?? Number.NaN);
4628
+ return {
4629
+ aboveAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, "aboveAverage"),
4630
+ bottom: parseSpreadsheetBooleanAttribute(cfRuleNode, "bottom"),
4631
+ equalAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, "equalAverage"),
4632
+ formulas,
4633
+ kind: "styled",
4634
+ operator: cfRuleNode.getAttribute("operator") ?? void 0,
4635
+ percent: parseSpreadsheetBooleanAttribute(cfRuleNode, "percent"),
4636
+ priority,
4637
+ rank: Number.isFinite(rawRank) ? rawRank : void 0,
4638
+ ranges,
4639
+ ruleType: type,
4640
+ stdDev: Number.isFinite(rawStdDev) ? rawStdDev : void 0,
4641
+ stopIfTrue: parseSpreadsheetBooleanAttribute(cfRuleNode, "stopIfTrue"),
4642
+ style,
4643
+ text: cfRuleNode.getAttribute("text") ?? void 0,
4644
+ timePeriod: cfRuleNode.getAttribute("timePeriod") ?? void 0
4645
+ };
4610
4646
  }
4611
4647
  function parseExtendedConditionalFormatRule(cfRuleNode, ranges) {
4612
4648
  const type = cfRuleNode.getAttribute("type");
@@ -4717,14 +4753,14 @@ function mergeConditionalFormatRule(baseRule, extendedRule) {
4717
4753
  }
4718
4754
  return baseRule;
4719
4755
  }
4720
- function parseConditionalFormatRules(document2) {
4756
+ function parseConditionalFormatRules(document2, differentialStyles = []) {
4721
4757
  const standardRules = [];
4722
4758
  const extendedRules = [];
4723
4759
  getLocalElements(document2, "conditionalFormatting").forEach((conditionalFormattingNode) => {
4724
4760
  const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;
4725
4761
  const ranges = isExtended ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, "sqref")?.textContent ?? "") : parseSqrefRanges(conditionalFormattingNode.getAttribute("sqref"));
4726
4762
  getChildElements(conditionalFormattingNode, "cfRule").forEach((cfRuleNode) => {
4727
- const parsedRule = isExtended ? parseExtendedConditionalFormatRule(cfRuleNode, ranges) : parseStandardConditionalFormatRule(cfRuleNode, ranges);
4763
+ const parsedRule = isExtended ? parseExtendedConditionalFormatRule(cfRuleNode, ranges) : parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles);
4728
4764
  if (parsedRule) {
4729
4765
  if (isExtended) {
4730
4766
  extendedRules.push(parsedRule);
@@ -4770,8 +4806,9 @@ function parseSheetState(archive, path, options) {
4770
4806
  return null;
4771
4807
  }
4772
4808
  const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;
4809
+ const autoFilterRanges = parseSqrefRanges(getLocalElements(document2, "autoFilter")[0]?.getAttribute("ref"));
4773
4810
  const cachedFormulaValues = {};
4774
- const conditionalFormatRules = parseConditionalFormatRules(document2);
4811
+ const conditionalFormatRules = parseConditionalFormatRules(document2, options?.differentialStyles ?? []);
4775
4812
  const sparklines = parseSheetSparklines(document2, options?.themePalette);
4776
4813
  const sheetFormatNode = getLocalElements(document2, "sheetFormatPr")[0] ?? null;
4777
4814
  const sheetViewNode = getLocalElements(document2, "sheetView")[0] ?? null;
@@ -4863,6 +4900,7 @@ function parseSheetState(archive, path, options) {
4863
4900
  }
4864
4901
  });
4865
4902
  return {
4903
+ autoFilterRanges,
4866
4904
  cachedFormulaValues,
4867
4905
  columnWidthCharacterWidthPx,
4868
4906
  colWidthOverridesPx,
@@ -5858,11 +5896,11 @@ function parseShapeNode(shapeNode, fallbackAnchor, drawingRelationships, theme,
5858
5896
  zIndex
5859
5897
  };
5860
5898
  }
5861
- function parseAnchorContents(anchorNode, fallbackAnchor, drawingRelationships, archive, contentTypes, objectUrls, workbookSheetIndex, theme, ids, imageOriginsById, anchorIndex, sheetState, parentGroup = null) {
5899
+ function parseAnchorContents(anchorNode, fallbackAnchor, drawingRelationships, archive, contentTypes, objectUrls, workbookSheetIndex, theme, ids, imageOriginsById, anchorIndex, sheetState, drawingPath, parentGroup = null, picturePath = []) {
5862
5900
  const images = [];
5863
5901
  const shapes = [];
5864
5902
  const mediaPaths = /* @__PURE__ */ new Set();
5865
- Array.from(anchorNode.childNodes).filter(isElementNode2).forEach((child) => {
5903
+ Array.from(anchorNode.childNodes).filter(isElementNode2).forEach((child, childIndex) => {
5866
5904
  if (child.localName === "pic") {
5867
5905
  const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;
5868
5906
  const parsed = parsePictureNode(
@@ -5883,6 +5921,8 @@ function parseAnchorContents(anchorNode, fallbackAnchor, drawingRelationships, a
5883
5921
  mediaPaths.add(parsed.mediaPath);
5884
5922
  imageOriginsById.set(imageId, {
5885
5923
  anchorIndex,
5924
+ drawingPath,
5925
+ picturePath: [...picturePath, childIndex],
5886
5926
  workbookSheetIndex
5887
5927
  });
5888
5928
  }
@@ -5942,7 +5982,9 @@ function parseAnchorContents(anchorNode, fallbackAnchor, drawingRelationships, a
5942
5982
  imageOriginsById,
5943
5983
  anchorIndex,
5944
5984
  sheetState,
5945
- nextGroup
5985
+ drawingPath,
5986
+ nextGroup,
5987
+ [...picturePath, childIndex]
5946
5988
  );
5947
5989
  parsedGroup.images.forEach((image) => images.push(image));
5948
5990
  parsedGroup.shapes.forEach((shape) => shapes.push(shape));
@@ -5998,7 +6040,8 @@ function parseDrawingObjects(archive, contentTypes, drawingPath, objectUrls, wor
5998
6040
  ids,
5999
6041
  imageOriginsById,
6000
6042
  anchorIndex,
6001
- sheetState
6043
+ sheetState,
6044
+ drawingPath
6002
6045
  );
6003
6046
  parsed.images.forEach((image) => images.push(image));
6004
6047
  parsed.shapes.forEach((shape) => shapes.push(shape));
@@ -6028,12 +6071,13 @@ function parseWorkbookStructureAssetsFromArchive(archive, options) {
6028
6071
  const workbookSheets = parseWorkbookSheets(archive);
6029
6072
  const theme = parseWorkbookTheme(archive);
6030
6073
  const themePalette = buildThemePalette(theme);
6031
- const { defaultFont, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);
6074
+ const { defaultFont, differentialStyles, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);
6032
6075
  return {
6033
6076
  contentTypes,
6034
6077
  namedCellStyleByName,
6035
6078
  sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {
6036
6079
  ...options,
6080
+ differentialStyles,
6037
6081
  defaultFont,
6038
6082
  themePalette
6039
6083
  })),
@@ -6156,6 +6200,9 @@ function updateWorkbookImageAnchor(assets, imageId, anchor) {
6156
6200
  }
6157
6201
  const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];
6158
6202
  for (const attachment of attachments) {
6203
+ if (attachment.drawingPath !== origin.drawingPath) {
6204
+ continue;
6205
+ }
6159
6206
  const drawingXml = readArchiveText2(assets.archive, attachment.drawingPath);
6160
6207
  if (!drawingXml) {
6161
6208
  continue;
@@ -6166,10 +6213,45 @@ function updateWorkbookImageAnchor(assets, imageId, anchor) {
6166
6213
  }
6167
6214
  const anchorNodes = createImageAnchorNodes(drawingDocument);
6168
6215
  const anchorNode = anchorNodes[origin.anchorIndex];
6169
- if (!anchorNode || !getFirstChild(anchorNode, "pic")) {
6216
+ if (!anchorNode) {
6170
6217
  continue;
6171
6218
  }
6172
- updateAnchorNode2(anchorNode, anchor);
6219
+ let pictureNode = anchorNode;
6220
+ let parentGroup = null;
6221
+ let groupAnchor = parseAnchor(anchorNode);
6222
+ for (const childIndex of origin.picturePath) {
6223
+ const child = Array.from(pictureNode.childNodes).filter(isElementNode2)[childIndex];
6224
+ if (!child || !groupAnchor) {
6225
+ break;
6226
+ }
6227
+ pictureNode = child;
6228
+ if (child.localName === "grpSp") {
6229
+ parentGroup = parseGroupTransform(
6230
+ child,
6231
+ parentGroup,
6232
+ groupAnchor,
6233
+ assets.sheetStatesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? null
6234
+ );
6235
+ groupAnchor = rectToAbsoluteAnchor(parentGroup);
6236
+ }
6237
+ }
6238
+ if (pictureNode.localName !== "pic") {
6239
+ continue;
6240
+ }
6241
+ if (parentGroup) {
6242
+ const transform = getFirstDescendant(pictureNode, "xfrm");
6243
+ const off = transform ? getFirstChild(transform, "off") : null;
6244
+ const ext = transform ? getFirstChild(transform, "ext") : null;
6245
+ if (anchor.kind !== "absolute" || !off || !ext || !parentGroup.scaleX || !parentGroup.scaleY) {
6246
+ continue;
6247
+ }
6248
+ off.setAttribute("x", String(Math.round(parentGroup.chX + (anchor.positionEmu.x - parentGroup.x) / parentGroup.scaleX)));
6249
+ off.setAttribute("y", String(Math.round(parentGroup.chY + (anchor.positionEmu.y - parentGroup.y) / parentGroup.scaleY)));
6250
+ ext.setAttribute("cx", String(Math.max(0, Math.round(anchor.sizeEmu.cx / parentGroup.scaleX))));
6251
+ ext.setAttribute("cy", String(Math.max(0, Math.round(anchor.sizeEmu.cy / parentGroup.scaleY))));
6252
+ } else {
6253
+ updateAnchorNode2(anchorNode, anchor);
6254
+ }
6173
6255
  assets.archive[attachment.drawingPath] = strToU82(serializeXml2(drawingDocument));
6174
6256
  assets.dirtyArchivePaths.add(normalizeArchivePath2(attachment.drawingPath));
6175
6257
  const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];
@@ -6280,15 +6362,21 @@ function appendSheetDrawingReference(sheetDocument, relationshipId) {
6280
6362
  }
6281
6363
  const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, "drawing");
6282
6364
  drawingNode.setAttributeNS(REL_NS, "r:id", relationshipId);
6283
- const extLst = getFirstChild(worksheet, "extLst");
6284
- if (extLst) {
6285
- worksheet.insertBefore(drawingNode, extLst);
6286
- return;
6287
- }
6288
- worksheet.appendChild(drawingNode);
6365
+ const successorNames = /* @__PURE__ */ new Set([
6366
+ "legacyDrawing",
6367
+ "legacyDrawingHF",
6368
+ "picture",
6369
+ "oleObjects",
6370
+ "controls",
6371
+ "webPublishItems",
6372
+ "tableParts",
6373
+ "extLst"
6374
+ ]);
6375
+ const successor = Array.from(worksheet.childNodes).find((node) => isElementNode2(node) && node.namespaceURI === SPREADSHEET_NS && successorNames.has(node.localName));
6376
+ worksheet.insertBefore(drawingNode, successor ?? null);
6289
6377
  }
6290
6378
  function mergeWorkbookImageAssets(savedBytes, sourceAssets, sheetOrigins) {
6291
- if (!sourceAssets || sourceAssets.dirtyArchivePaths.size === 0) {
6379
+ if (!sourceAssets) {
6292
6380
  return cloneBytes(savedBytes);
6293
6381
  }
6294
6382
  try {
@@ -6299,9 +6387,31 @@ function mergeWorkbookImageAssets(savedBytes, sourceAssets, sheetOrigins) {
6299
6387
  if (!targetContentTypesDocument) {
6300
6388
  return cloneBytes(savedBytes);
6301
6389
  }
6390
+ const copiedParts = /* @__PURE__ */ new Set();
6391
+ const copyDrawingPart = (path) => {
6392
+ const normalizedPath = normalizeArchivePath2(path);
6393
+ const bytes = sourceAssets.archive[normalizedPath];
6394
+ if (!bytes || copiedParts.has(normalizedPath)) {
6395
+ return;
6396
+ }
6397
+ copiedParts.add(normalizedPath);
6398
+ archive[normalizedPath] = cloneBytes(bytes);
6399
+ mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, normalizedPath);
6400
+ const relsPath = relsPathForDocument(normalizedPath);
6401
+ const relsBytes = sourceAssets.archive[relsPath];
6402
+ if (!relsBytes) {
6403
+ return;
6404
+ }
6405
+ archive[relsPath] = cloneBytes(relsBytes);
6406
+ mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);
6407
+ for (const relationship of parseRelationships(sourceAssets.archive, relsPath, normalizedPath).values()) {
6408
+ if (relationship.targetMode !== "External" && !relationship.type.endsWith("/hyperlink")) {
6409
+ copyDrawingPart(relationship.target);
6410
+ }
6411
+ }
6412
+ };
6302
6413
  sheetOrigins.forEach((origin, workbookSheetIndex) => {
6303
- const hasDirtyAttachment = origin?.attachments.some((attachment) => sourceAssets.dirtyArchivePaths.has(normalizeArchivePath2(attachment.drawingPath)) || attachment.drawingRelsPath && sourceAssets.dirtyArchivePaths.has(normalizeArchivePath2(attachment.drawingRelsPath)) || attachment.mediaPaths.some((path) => sourceAssets.dirtyArchivePaths.has(normalizeArchivePath2(path))));
6304
- if (!origin?.attachments.length || !hasDirtyAttachment) {
6414
+ if (!origin?.attachments.length) {
6305
6415
  return;
6306
6416
  }
6307
6417
  const currentSheet = workbookSheets[workbookSheetIndex];
@@ -6324,23 +6434,7 @@ function mergeWorkbookImageAssets(savedBytes, sourceAssets, sheetOrigins) {
6324
6434
  if (!drawingBytes) {
6325
6435
  return;
6326
6436
  }
6327
- archive[attachment.drawingPath] = cloneBytes(drawingBytes);
6328
- mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingPath);
6329
- if (attachment.drawingRelsPath) {
6330
- const drawingRelsBytes = sourceAssets.archive[attachment.drawingRelsPath];
6331
- if (drawingRelsBytes) {
6332
- archive[attachment.drawingRelsPath] = cloneBytes(drawingRelsBytes);
6333
- mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingRelsPath);
6334
- }
6335
- }
6336
- attachment.mediaPaths.forEach((mediaPath) => {
6337
- const mediaBytes = sourceAssets.archive[mediaPath];
6338
- if (!mediaBytes) {
6339
- return;
6340
- }
6341
- archive[mediaPath] = cloneBytes(mediaBytes);
6342
- mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, mediaPath);
6343
- });
6437
+ copyDrawingPart(attachment.drawingPath);
6344
6438
  const relationshipId = nextRelationshipId(relDocument);
6345
6439
  const relationshipNode = relDocument.createElementNS(PKG_REL_NS, "Relationship");
6346
6440
  relationshipNode.setAttribute("Id", relationshipId);
@@ -6402,7 +6496,7 @@ function markerFromOffset(offsetPx, getSizePx) {
6402
6496
  let remaining = Math.max(0, offsetPx);
6403
6497
  let index = 0;
6404
6498
  while (remaining > 0) {
6405
- const size = Math.max(1, getSizePx(index));
6499
+ const size = Math.max(0, getSizePx(index));
6406
6500
  if (remaining < size) {
6407
6501
  break;
6408
6502
  }
@@ -7186,6 +7280,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7186
7280
  const usedRange = worksheet.usedRange();
7187
7281
  if (!usedRange) {
7188
7282
  sheets.push({
7283
+ autoFilterRanges: sheetState?.autoFilterRanges ?? [],
7189
7284
  cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},
7190
7285
  columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,
7191
7286
  colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},
@@ -7272,6 +7367,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7272
7367
  return colWidthsCache;
7273
7368
  };
7274
7369
  const sheet = {
7370
+ autoFilterRanges: sheetState?.autoFilterRanges ?? [],
7275
7371
  cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},
7276
7372
  columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,
7277
7373
  colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},
@@ -7652,9 +7748,9 @@ function rangeContainsCell(range, cell) {
7652
7748
  const normalized = normalizeRange(range);
7653
7749
  return cell.row >= normalized.start.row && cell.row <= normalized.end.row && cell.col >= normalized.start.col && cell.col <= normalized.end.col;
7654
7750
  }
7655
- function mapWorksheetTables(worksheet) {
7751
+ function mapWorksheetTables(worksheet, autoFilterRanges = []) {
7656
7752
  const rawTables = worksheet?.tables ?? [];
7657
- return rawTables.flatMap((table, index) => {
7753
+ const mappedTables = rawTables.flatMap((table, index) => {
7658
7754
  const rawColumns = Array.isArray(table.columns) ? table.columns : [];
7659
7755
  const rawName = typeof table.name === "string" ? table.name : `Table${index + 1}`;
7660
7756
  const rawDisplayName = typeof table.displayName === "string" ? table.displayName : typeof table.name === "string" ? table.name : `Table ${index + 1}`;
@@ -7682,6 +7778,34 @@ function mapWorksheetTables(worksheet) {
7682
7778
  totalsRowShown: resolveWorkbookTableBoolean(table.totalsRowShown)
7683
7779
  }];
7684
7780
  });
7781
+ const existingReferences = new Set(mappedTables.map((table) => table.reference));
7782
+ const mappedAutoFilterTables = autoFilterRanges.flatMap((range, index) => {
7783
+ const reference = rangeToA1(range);
7784
+ if (existingReferences.has(reference)) {
7785
+ return [];
7786
+ }
7787
+ const columnCount = Math.max(0, range.end.col - range.start.col + 1);
7788
+ const columns = Array.from({ length: columnCount }, (_, columnIndex) => {
7789
+ const headerValue = worksheet ? decodeHtmlEntities(worksheet.getFormattedValueAt(range.start.row, range.start.col + columnIndex) ?? "") : "";
7790
+ return {
7791
+ id: columnIndex + 1,
7792
+ index: columnIndex,
7793
+ name: headerValue.trim().length > 0 ? headerValue : `Column ${columnIndex + 1}`
7794
+ };
7795
+ });
7796
+ return [{
7797
+ columns,
7798
+ displayName: `AutoFilter ${index + 1}`,
7799
+ end: range.end,
7800
+ headerRowCount: 1,
7801
+ name: `__autofilter_${index + 1}_${reference}`,
7802
+ reference,
7803
+ start: range.start,
7804
+ totalsRowCount: 0,
7805
+ totalsRowShown: false
7806
+ }];
7807
+ });
7808
+ return [...mappedTables, ...mappedAutoFilterTables];
7685
7809
  }
7686
7810
  function resolveWorkbookTableCount(value, fallback) {
7687
7811
  if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
@@ -8408,6 +8532,10 @@ function useXlsxViewerController(options) {
8408
8532
  if (requestToken !== chartLoadRequestTokenRef.current) {
8409
8533
  return;
8410
8534
  }
8535
+ if (imageAssetsRef.current && !effectiveSkipXmlParsing) {
8536
+ const chartOriginsById = hydrateWorkbookChartStyles(result.chartsByWorkbookSheetIndex, imageAssetsRef.current);
8537
+ chartAssetsRef.current = { ...result, chartOriginsById };
8538
+ }
8411
8539
  setChartsByWorkbookSheetIndex(result.chartsByWorkbookSheetIndex);
8412
8540
  setChartsheets(result.chartsheets);
8413
8541
  setTabs(result.tabs);
@@ -8623,13 +8751,14 @@ function useXlsxViewerController(options) {
8623
8751
  return;
8624
8752
  }
8625
8753
  setImageAssets(workerImageAssets);
8754
+ const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets) : /* @__PURE__ */ new Map();
8626
8755
  setFormControlsByWorkbookSheetIndex(snapshot.formControlsByWorkbookSheetIndex);
8627
8756
  setWorkbook(null);
8628
8757
  setSheets(snapshot.sheets);
8629
8758
  setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);
8630
8759
  setChartsheets(snapshot.chartsheets);
8631
8760
  setTabs(snapshot.tabs);
8632
- chartAssetsRef.current = null;
8761
+ chartAssetsRef.current = { ...snapshot, chartOriginsById };
8633
8762
  setWorkerTablesByWorkbookSheetIndex(snapshot.tablesByWorkbookSheetIndex);
8634
8763
  setShouldAutoCalculate(false);
8635
8764
  setIsWorkerBacked(true);
@@ -8841,6 +8970,9 @@ function useXlsxViewerController(options) {
8841
8970
  if (!effectiveSkipXmlParsing && hasIncompleteWorkerChartSnapshot(snapshot)) {
8842
8971
  throw new Error("Worker chart payload incomplete");
8843
8972
  }
8973
+ const workerImageAssets = effectiveSkipXmlParsing ? null : parseWorkbookImageAssets(new Uint8Array(deferredBuffer));
8974
+ setImageAssets(workerImageAssets);
8975
+ const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets) : /* @__PURE__ */ new Map();
8844
8976
  deferredBufferRef.current = null;
8845
8977
  setDeferredLoadFileSize(null);
8846
8978
  setWorkbook(null);
@@ -8848,7 +8980,7 @@ function useXlsxViewerController(options) {
8848
8980
  setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);
8849
8981
  setChartsheets(snapshot.chartsheets);
8850
8982
  setTabs(snapshot.tabs);
8851
- chartAssetsRef.current = null;
8983
+ chartAssetsRef.current = { ...snapshot, chartOriginsById };
8852
8984
  setFormControlsByWorkbookSheetIndex(snapshot.formControlsByWorkbookSheetIndex);
8853
8985
  setWorkerTablesByWorkbookSheetIndex(snapshot.tablesByWorkbookSheetIndex);
8854
8986
  setShouldAutoCalculate(false);
@@ -8986,8 +9118,8 @@ function useXlsxViewerController(options) {
8986
9118
  }
8987
9119
  }, [activeSheetIndex, sheets, workbook]);
8988
9120
  const tables = React.useMemo(
8989
- () => isWorkerBacked ? workerTablesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? [] : mapWorksheetTables(getActiveWorksheet()),
8990
- [activeSheet?.workbookSheetIndex, getActiveWorksheet, isWorkerBacked, revision, workerTablesByWorkbookSheetIndex]
9121
+ () => isWorkerBacked ? workerTablesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? [] : mapWorksheetTables(getActiveWorksheet(), activeSheet?.autoFilterRanges ?? []),
9122
+ [activeSheet?.autoFilterRanges, activeSheet?.workbookSheetIndex, getActiveWorksheet, isWorkerBacked, revision, workerTablesByWorkbookSheetIndex]
8991
9123
  );
8992
9124
  const getCellSnapshotAsync = React.useCallback((workbookSheetIndex, row, col) => {
8993
9125
  if (!isWorkerBacked) {
@@ -9939,7 +10071,7 @@ function useXlsxViewerController(options) {
9939
10071
  width: Math.max(1, right - left)
9940
10072
  };
9941
10073
  }, [getColumnWidthPx, getRowHeightPx]);
9942
- const setChartRect = React.useCallback((id, rect) => {
10074
+ const setChartRect = React.useCallback((id, rect, layout) => {
9943
10075
  const hydratedChartAssets = ensureChartAssetsHydrated(workbook, sheets);
9944
10076
  console.info("[react-xlsx debug] setChartRect", {
9945
10077
  hasActiveSheet: Boolean(activeSheet),
@@ -9968,8 +10100,8 @@ function useXlsxViewerController(options) {
9968
10100
  const nextAnchor = rectToImageAnchor(rect, currentChart.anchor, {
9969
10101
  contentOffsetLeft: GRID_ROW_HEADER_WIDTH,
9970
10102
  contentOffsetTop: GRID_HEADER_HEIGHT,
9971
- getColumnWidthPx: (col) => getColumnWidthPx(worksheet, col),
9972
- getRowHeightPx: (row) => getRowHeightPx(worksheet, row)
10103
+ getColumnWidthPx: (col) => layout?.columnWidths[col] ?? getColumnWidthPx(worksheet, col),
10104
+ getRowHeightPx: (row) => layout?.rowHeights[row] ?? getRowHeightPx(worksheet, row)
9973
10105
  });
9974
10106
  recordHistoryBeforeMutation();
9975
10107
  const didUpdateAnchor = updateWorkbookChartAnchor(imageAssetsRef.current, hydratedChartAssets, id, nextAnchor);
@@ -9988,7 +10120,7 @@ function useXlsxViewerController(options) {
9988
10120
  sheets,
9989
10121
  workbook
9990
10122
  ]);
9991
- const setImageRect = React.useCallback((id, rect) => {
10123
+ const setImageRect = React.useCallback((id, rect, layout) => {
9992
10124
  if (readOnly || !workbook || !activeSheet || !imageAssetsRef.current) {
9993
10125
  return;
9994
10126
  }
@@ -10000,8 +10132,8 @@ function useXlsxViewerController(options) {
10000
10132
  const nextAnchor = rectToImageAnchor(rect, currentImage.anchor, {
10001
10133
  contentOffsetLeft: GRID_ROW_HEADER_WIDTH,
10002
10134
  contentOffsetTop: GRID_HEADER_HEIGHT,
10003
- getColumnWidthPx: (col) => getColumnWidthPx(worksheet, col),
10004
- getRowHeightPx: (row) => getRowHeightPx(worksheet, row)
10135
+ getColumnWidthPx: (col) => layout?.columnWidths[col] ?? getColumnWidthPx(worksheet, col),
10136
+ getRowHeightPx: (row) => layout?.rowHeights[row] ?? getRowHeightPx(worksheet, row)
10005
10137
  });
10006
10138
  recordHistoryBeforeMutation();
10007
10139
  if (!updateWorkbookImageAnchor(imageAssetsRef.current, id, nextAnchor)) {
@@ -11040,6 +11172,570 @@ import {
11040
11172
  useVirtualizer
11041
11173
  } from "@tanstack/react-virtual";
11042
11174
 
11175
+ // src/builtin-table-styles.ts
11176
+ var BUILTIN_TABLE_STYLES = {
11177
+ TableStyleLight1: {
11178
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" } } },
11179
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 1 }, "style": "thin" } } },
11180
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11181
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11182
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11183
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11184
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11185
+ },
11186
+ TableStyleLight2: {
11187
+ wholeTable: { "font": { "color": { "theme": 4, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" }, "bottom": { "color": { "theme": 4 }, "style": "thin" } } },
11188
+ headerRow: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 4 }, "style": "thin" } } },
11189
+ totalRow: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11190
+ firstColumn: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } } },
11191
+ lastColumn: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } } },
11192
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11193
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11194
+ },
11195
+ TableStyleLight3: {
11196
+ wholeTable: { "font": { "color": { "theme": 5, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" }, "bottom": { "color": { "theme": 5 }, "style": "thin" } } },
11197
+ headerRow: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 5 }, "style": "thin" } } },
11198
+ totalRow: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11199
+ firstColumn: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } } },
11200
+ lastColumn: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } } },
11201
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11202
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11203
+ },
11204
+ TableStyleLight4: {
11205
+ wholeTable: { "font": { "color": { "theme": 6, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" }, "bottom": { "color": { "theme": 6 }, "style": "thin" } } },
11206
+ headerRow: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 6 }, "style": "thin" } } },
11207
+ totalRow: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11208
+ firstColumn: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } } },
11209
+ lastColumn: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } } },
11210
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11211
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11212
+ },
11213
+ TableStyleLight5: {
11214
+ wholeTable: { "font": { "color": { "theme": 7, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" }, "bottom": { "color": { "theme": 7 }, "style": "thin" } } },
11215
+ headerRow: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 7 }, "style": "thin" } } },
11216
+ totalRow: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11217
+ firstColumn: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } } },
11218
+ lastColumn: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } } },
11219
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11220
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11221
+ },
11222
+ TableStyleLight6: {
11223
+ wholeTable: { "font": { "color": { "theme": 8, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" }, "bottom": { "color": { "theme": 8 }, "style": "thin" } } },
11224
+ headerRow: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 8 }, "style": "thin" } } },
11225
+ totalRow: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11226
+ firstColumn: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } } },
11227
+ lastColumn: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } } },
11228
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11229
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11230
+ },
11231
+ TableStyleLight7: {
11232
+ wholeTable: { "font": { "color": { "theme": 9, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" }, "bottom": { "color": { "theme": 9 }, "style": "thin" } } },
11233
+ headerRow: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 9 }, "style": "thin" } } },
11234
+ totalRow: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11235
+ firstColumn: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } } },
11236
+ lastColumn: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } } },
11237
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11238
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11239
+ },
11240
+ TableStyleLight8: {
11241
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "right": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" }, "left": { "color": { "theme": 1 }, "style": "thin" } } },
11242
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11243
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11244
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11245
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11246
+ firstRowStripe: { "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11247
+ secondRowStripe: { "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11248
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 1 }, "style": "thin" } } },
11249
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 1 }, "style": "thin" } } }
11250
+ },
11251
+ TableStyleLight9: {
11252
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" }, "right": { "color": { "theme": 4 }, "style": "thin" }, "bottom": { "color": { "theme": 4 }, "style": "thin" }, "left": { "color": { "theme": 4 }, "style": "thin" } } },
11253
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11254
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11255
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11256
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11257
+ firstRowStripe: { "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11258
+ secondRowStripe: { "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11259
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 4 }, "style": "thin" } } },
11260
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 4 }, "style": "thin" } } }
11261
+ },
11262
+ TableStyleLight10: {
11263
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" }, "right": { "color": { "theme": 5 }, "style": "thin" }, "bottom": { "color": { "theme": 5 }, "style": "thin" }, "left": { "color": { "theme": 5 }, "style": "thin" } } },
11264
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11265
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11266
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11267
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11268
+ firstRowStripe: { "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11269
+ secondRowStripe: { "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11270
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 5 }, "style": "thin" } } },
11271
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 5 }, "style": "thin" } } }
11272
+ },
11273
+ TableStyleLight11: {
11274
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" }, "right": { "color": { "theme": 6 }, "style": "thin" }, "bottom": { "color": { "theme": 6 }, "style": "thin" }, "left": { "color": { "theme": 6 }, "style": "thin" } } },
11275
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11276
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11277
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11278
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11279
+ firstRowStripe: { "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11280
+ secondRowStripe: { "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11281
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 6 }, "style": "thin" } } },
11282
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 6 }, "style": "thin" } } }
11283
+ },
11284
+ TableStyleLight12: {
11285
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" }, "right": { "color": { "theme": 7 }, "style": "thin" }, "bottom": { "color": { "theme": 7 }, "style": "thin" }, "left": { "color": { "theme": 7 }, "style": "thin" } } },
11286
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11287
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11288
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11289
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11290
+ firstRowStripe: { "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11291
+ secondRowStripe: { "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11292
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 7 }, "style": "thin" } } },
11293
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 7 }, "style": "thin" } } }
11294
+ },
11295
+ TableStyleLight13: {
11296
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" }, "right": { "color": { "theme": 8 }, "style": "thin" }, "bottom": { "color": { "theme": 8 }, "style": "thin" }, "left": { "color": { "theme": 8 }, "style": "thin" } } },
11297
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11298
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "double" } } },
11299
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11300
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11301
+ firstRowStripe: { "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11302
+ secondRowStripe: { "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11303
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 8 }, "style": "thin" } } },
11304
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 8 }, "style": "thin" } } }
11305
+ },
11306
+ TableStyleLight14: {
11307
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" }, "right": { "color": { "theme": 9 }, "style": "thin" }, "bottom": { "color": { "theme": 9 }, "style": "thin" }, "left": { "color": { "theme": 9 }, "style": "thin" } } },
11308
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11309
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11310
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11311
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11312
+ firstRowStripe: { "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11313
+ secondRowStripe: { "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11314
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 9 }, "style": "thin" } } },
11315
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 9 }, "style": "thin" } } }
11316
+ },
11317
+ TableStyleLight15: {
11318
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "right": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" }, "left": { "color": { "theme": 1 }, "style": "thin" }, "horizontal": { "color": { "theme": 1 }, "style": "thin" }, "vertical": { "color": { "theme": 1 }, "style": "thin" } } },
11319
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11320
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11321
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11322
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11323
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11324
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11325
+ },
11326
+ TableStyleLight16: {
11327
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" }, "right": { "color": { "theme": 4 }, "style": "thin" }, "bottom": { "color": { "theme": 4 }, "style": "thin" }, "left": { "color": { "theme": 4 }, "style": "thin" }, "horizontal": { "color": { "theme": 4 }, "style": "thin" }, "vertical": { "color": { "theme": 4 }, "style": "thin" } } },
11328
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 4 }, "style": "medium" } } },
11329
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11330
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11331
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11332
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11333
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11334
+ },
11335
+ TableStyleLight17: {
11336
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" }, "right": { "color": { "theme": 5 }, "style": "thin" }, "bottom": { "color": { "theme": 5 }, "style": "thin" }, "left": { "color": { "theme": 5 }, "style": "thin" }, "horizontal": { "color": { "theme": 5 }, "style": "thin" }, "vertical": { "color": { "theme": 5 }, "style": "thin" } } },
11337
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 5 }, "style": "medium" } } },
11338
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11339
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11340
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11341
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11342
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11343
+ },
11344
+ TableStyleLight18: {
11345
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" }, "right": { "color": { "theme": 6 }, "style": "thin" }, "bottom": { "color": { "theme": 6 }, "style": "thin" }, "left": { "color": { "theme": 6 }, "style": "thin" }, "horizontal": { "color": { "theme": 6 }, "style": "thin" }, "vertical": { "color": { "theme": 6 }, "style": "thin" } } },
11346
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 6 }, "style": "medium" } } },
11347
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11348
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11349
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11350
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11351
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11352
+ },
11353
+ TableStyleLight19: {
11354
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" }, "right": { "color": { "theme": 7 }, "style": "thin" }, "bottom": { "color": { "theme": 7 }, "style": "thin" }, "left": { "color": { "theme": 7 }, "style": "thin" }, "horizontal": { "color": { "theme": 7 }, "style": "thin" }, "vertical": { "color": { "theme": 7 }, "style": "thin" } } },
11355
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 7 }, "style": "medium" } } },
11356
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11357
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11358
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11359
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11360
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11361
+ },
11362
+ TableStyleLight20: {
11363
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" }, "right": { "color": { "theme": 8 }, "style": "thin" }, "bottom": { "color": { "theme": 8 }, "style": "thin" }, "left": { "color": { "theme": 8 }, "style": "thin" }, "horizontal": { "color": { "theme": 8 }, "style": "thin" }, "vertical": { "color": { "theme": 8 }, "style": "thin" } } },
11364
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 8 }, "style": "medium" } } },
11365
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "double" } } },
11366
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11367
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11368
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11369
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11370
+ },
11371
+ TableStyleLight21: {
11372
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" }, "right": { "color": { "theme": 9 }, "style": "thin" }, "bottom": { "color": { "theme": 9 }, "style": "thin" }, "left": { "color": { "theme": 9 }, "style": "thin" }, "horizontal": { "color": { "theme": 9 }, "style": "thin" }, "vertical": { "color": { "theme": 9 }, "style": "thin" } } },
11373
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 9 }, "style": "medium" } } },
11374
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11375
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11376
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11377
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11378
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11379
+ },
11380
+ TableStyleMedium1: {
11381
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "right": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" }, "left": { "color": { "theme": 1 }, "style": "thin" }, "horizontal": { "color": { "theme": 1 }, "style": "thin" } } },
11382
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11383
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11384
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11385
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11386
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11387
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11388
+ },
11389
+ TableStyleMedium2: {
11390
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" } } },
11391
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11392
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11393
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11394
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11395
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11396
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11397
+ },
11398
+ TableStyleMedium3: {
11399
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" } } },
11400
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11401
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11402
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11403
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11404
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11405
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11406
+ },
11407
+ TableStyleMedium4: {
11408
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" } } },
11409
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11410
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11411
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11412
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11413
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11414
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11415
+ },
11416
+ TableStyleMedium5: {
11417
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" } } },
11418
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11419
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11420
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11421
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11422
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11423
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11424
+ },
11425
+ TableStyleMedium6: {
11426
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" } } },
11427
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11428
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "double" } } },
11429
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11430
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11431
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11432
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11433
+ },
11434
+ TableStyleMedium7: {
11435
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" } } },
11436
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11437
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11438
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11439
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11440
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11441
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11442
+ },
11443
+ TableStyleMedium8: {
11444
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11445
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11446
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11447
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11448
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11449
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11450
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11451
+ },
11452
+ TableStyleMedium9: {
11453
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11454
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11455
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11456
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11457
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11458
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11459
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11460
+ },
11461
+ TableStyleMedium10: {
11462
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11463
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11464
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11465
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11466
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11467
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } },
11468
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } }
11469
+ },
11470
+ TableStyleMedium11: {
11471
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11472
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11473
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11474
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11475
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11476
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11477
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11478
+ },
11479
+ TableStyleMedium12: {
11480
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11481
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11482
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11483
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11484
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11485
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } },
11486
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } }
11487
+ },
11488
+ TableStyleMedium13: {
11489
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11490
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11491
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11492
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11493
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11494
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11495
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11496
+ },
11497
+ TableStyleMedium14: {
11498
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" }, "border": { "horizontal": { "color": { "theme": 0 }, "style": "thin" }, "vertical": { "color": { "theme": 0 }, "style": "thin" } } },
11499
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11500
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11501
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11502
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11503
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } },
11504
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } }
11505
+ },
11506
+ TableStyleMedium15: {
11507
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "right": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "medium" }, "left": { "color": { "theme": 1 }, "style": "thin" }, "horizontal": { "color": { "theme": 1 }, "style": "thin" }, "vertical": { "color": { "theme": 1 }, "style": "thin" } } },
11508
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11509
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11510
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11511
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11512
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11513
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11514
+ },
11515
+ TableStyleMedium16: {
11516
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11517
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11518
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11519
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11520
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11521
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11522
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11523
+ },
11524
+ TableStyleMedium17: {
11525
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11526
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11527
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11528
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11529
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11530
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11531
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11532
+ },
11533
+ TableStyleMedium18: {
11534
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11535
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11536
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11537
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11538
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11539
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11540
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11541
+ },
11542
+ TableStyleMedium19: {
11543
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11544
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11545
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11546
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11547
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11548
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11549
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11550
+ },
11551
+ TableStyleMedium20: {
11552
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11553
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11554
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11555
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11556
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11557
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11558
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11559
+ },
11560
+ TableStyleMedium21: {
11561
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11562
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11563
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11564
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11565
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11566
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11567
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11568
+ },
11569
+ TableStyleMedium22: {
11570
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "right": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" }, "left": { "color": { "theme": 1 }, "style": "thin" }, "horizontal": { "color": { "theme": 1 }, "style": "thin" }, "vertical": { "color": { "theme": 1 }, "style": "thin" } } },
11571
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11572
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" } } },
11573
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11574
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11575
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11576
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11577
+ },
11578
+ TableStyleMedium23: {
11579
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 4, "tint": 0.4 }, "style": "thin" } } },
11580
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11581
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "medium" } } },
11582
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11583
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11584
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11585
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11586
+ },
11587
+ TableStyleMedium24: {
11588
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 5, "tint": 0.4 }, "style": "thin" } } },
11589
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11590
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "medium" } } },
11591
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11592
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11593
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } },
11594
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } }
11595
+ },
11596
+ TableStyleMedium25: {
11597
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 6, "tint": 0.4 }, "style": "thin" } } },
11598
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11599
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "medium" } } },
11600
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11601
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11602
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11603
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11604
+ },
11605
+ TableStyleMedium26: {
11606
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 7, "tint": 0.4 }, "style": "thin" } } },
11607
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11608
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "medium" } } },
11609
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11610
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11611
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } },
11612
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } }
11613
+ },
11614
+ TableStyleMedium27: {
11615
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 8, "tint": 0.4 }, "style": "thin" } } },
11616
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11617
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "medium" } } },
11618
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11619
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11620
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11621
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11622
+ },
11623
+ TableStyleMedium28: {
11624
+ wholeTable: { "font": { "color": { "theme": 1 } }, "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "right": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "bottom": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "left": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "horizontal": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" }, "vertical": { "color": { "theme": 9, "tint": 0.4 }, "style": "thin" } } },
11625
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11626
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "medium" } } },
11627
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11628
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11629
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } },
11630
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } }
11631
+ },
11632
+ TableStyleDark1: {
11633
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.45 }, "fillType": "solid" } },
11634
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11635
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.15 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11636
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11637
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11638
+ firstRowStripe: { "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" } },
11639
+ firstColumnStripe: { "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" } }
11640
+ },
11641
+ TableStyleDark2: {
11642
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11643
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11644
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11645
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11646
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11647
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" } },
11648
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" } }
11649
+ },
11650
+ TableStyleDark3: {
11651
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11652
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11653
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11654
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11655
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11656
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" } },
11657
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" } }
11658
+ },
11659
+ TableStyleDark4: {
11660
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11661
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11662
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11663
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11664
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11665
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" } },
11666
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" } }
11667
+ },
11668
+ TableStyleDark5: {
11669
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11670
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11671
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11672
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11673
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11674
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" } },
11675
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" } }
11676
+ },
11677
+ TableStyleDark6: {
11678
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11679
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11680
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11681
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11682
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11683
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" } },
11684
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" } }
11685
+ },
11686
+ TableStyleDark7: {
11687
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11688
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11689
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11690
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11691
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11692
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" } },
11693
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" } }
11694
+ },
11695
+ TableStyleDark8: {
11696
+ wholeTable: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11697
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11698
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11699
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11700
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11701
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11702
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11703
+ },
11704
+ TableStyleDark9: {
11705
+ wholeTable: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11706
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11707
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11708
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11709
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11710
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11711
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11712
+ },
11713
+ TableStyleDark10: {
11714
+ wholeTable: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11715
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11716
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11717
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11718
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11719
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11720
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11721
+ },
11722
+ TableStyleDark11: {
11723
+ wholeTable: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11724
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11725
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11726
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11727
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11728
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11729
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11730
+ }
11731
+ };
11732
+ function resolveBuiltinTableStyle(name) {
11733
+ if (!name || !Object.prototype.hasOwnProperty.call(BUILTIN_TABLE_STYLES, name)) {
11734
+ return null;
11735
+ }
11736
+ return BUILTIN_TABLE_STYLES[name] ?? null;
11737
+ }
11738
+
11043
11739
  // src/cell-text-clip.ts
11044
11740
  function resolveCellTextClipOverscan(overscan, usesWrappedText) {
11045
11741
  return {
@@ -20687,7 +21383,7 @@ function canCellTextOverflow(data) {
20687
21383
  return false;
20688
21384
  }
20689
21385
  const textAlign = data.style.textAlign;
20690
- if (textAlign && textAlign !== "left" && textAlign !== "start" && textAlign !== "center") {
21386
+ if (textAlign && textAlign !== "left" && textAlign !== "start" && textAlign !== "center" && textAlign !== "right" && textAlign !== "end") {
20691
21387
  return false;
20692
21388
  }
20693
21389
  return true;
@@ -21163,7 +21859,87 @@ function mergeResolvedCellStyle(base, overlay, options) {
21163
21859
  }
21164
21860
  return nextStyle;
21165
21861
  }
21166
- function normalizeTableStyleEdges(style, table, row, col) {
21862
+ function resolveBorderEdgePriority(edge) {
21863
+ const style = typeof edge?.style === "string" ? edge.style : "none";
21864
+ const stylePriority = {
21865
+ dashed: 2,
21866
+ dashDot: 3,
21867
+ dashDotDot: 3,
21868
+ dotted: 1,
21869
+ double: 8,
21870
+ hair: 0,
21871
+ medium: 6,
21872
+ mediumDashDot: 5,
21873
+ mediumDashDotDot: 5,
21874
+ mediumDashed: 5,
21875
+ none: -1,
21876
+ slantDashDot: 4,
21877
+ thick: 7,
21878
+ thin: 4
21879
+ };
21880
+ return stylePriority[style] ?? -1;
21881
+ }
21882
+ function resolvePreferredBorderEdge(current, candidate) {
21883
+ if (!candidate || typeof candidate.style !== "string" || candidate.style === "none") {
21884
+ return current ?? null;
21885
+ }
21886
+ if (!current) {
21887
+ return candidate;
21888
+ }
21889
+ const currentPriority = resolveBorderEdgePriority(current);
21890
+ const candidatePriority = resolveBorderEdgePriority(candidate);
21891
+ if (candidatePriority > currentPriority) {
21892
+ return candidate;
21893
+ }
21894
+ return current;
21895
+ }
21896
+ function resolveMergedRegionBorderOverlay(row, col, merge, resolveBaseCellStyle) {
21897
+ const rowSpan = Math.max(1, merge?.rowSpan ?? 1);
21898
+ const colSpan = Math.max(1, merge?.colSpan ?? 1);
21899
+ if (rowSpan === 1 && colSpan === 1) {
21900
+ return null;
21901
+ }
21902
+ const endRow = row + rowSpan - 1;
21903
+ const endCol = col + colSpan - 1;
21904
+ let top = null;
21905
+ let right = null;
21906
+ let bottom = null;
21907
+ let left = null;
21908
+ for (let targetCol = col; targetCol <= endCol; targetCol += 1) {
21909
+ const topStyle = resolveBaseCellStyle(row, targetCol);
21910
+ const topBorder = topStyle?.border;
21911
+ top = resolvePreferredBorderEdge(top, topBorder?.top ?? null);
21912
+ const bottomStyle = resolveBaseCellStyle(endRow, targetCol);
21913
+ const bottomBorder = bottomStyle?.border;
21914
+ bottom = resolvePreferredBorderEdge(bottom, bottomBorder?.bottom ?? null);
21915
+ }
21916
+ for (let targetRow = row; targetRow <= endRow; targetRow += 1) {
21917
+ const leftStyle = resolveBaseCellStyle(targetRow, col);
21918
+ const leftBorder = leftStyle?.border;
21919
+ left = resolvePreferredBorderEdge(left, leftBorder?.left ?? null);
21920
+ const rightStyle = resolveBaseCellStyle(targetRow, endCol);
21921
+ const rightBorder = rightStyle?.border;
21922
+ right = resolvePreferredBorderEdge(right, rightBorder?.right ?? null);
21923
+ }
21924
+ const border = {};
21925
+ if (top) {
21926
+ border.top = top;
21927
+ }
21928
+ if (right) {
21929
+ border.right = right;
21930
+ }
21931
+ if (bottom) {
21932
+ border.bottom = bottom;
21933
+ }
21934
+ if (left) {
21935
+ border.left = left;
21936
+ }
21937
+ if (Object.keys(border).length === 0) {
21938
+ return null;
21939
+ }
21940
+ return { border };
21941
+ }
21942
+ function normalizeTableStyleEdges(style, region, row, col) {
21167
21943
  if (!style) {
21168
21944
  return null;
21169
21945
  }
@@ -21171,23 +21947,32 @@ function normalizeTableStyleEdges(style, table, row, col) {
21171
21947
  if (!border) {
21172
21948
  return style;
21173
21949
  }
21174
- const nextBorder = { ...border };
21175
- if (nextBorder.horizontal) {
21176
- if (row < table.end.row) {
21177
- nextBorder.bottom = nextBorder.bottom ?? nextBorder.horizontal;
21178
- }
21179
- delete nextBorder.horizontal;
21950
+ const nextBorder = {};
21951
+ if (border.top && row === region.startRow) {
21952
+ nextBorder.top = border.top;
21180
21953
  }
21181
- if (nextBorder.vertical) {
21182
- if (col < table.end.col) {
21183
- nextBorder.right = nextBorder.right ?? nextBorder.vertical;
21184
- }
21185
- delete nextBorder.vertical;
21954
+ if (border.bottom && row === region.endRow) {
21955
+ nextBorder.bottom = border.bottom;
21186
21956
  }
21187
- return {
21188
- ...style,
21189
- border: nextBorder
21190
- };
21957
+ if (border.left && col === region.startCol) {
21958
+ nextBorder.left = border.left;
21959
+ }
21960
+ if (border.right && col === region.endCol) {
21961
+ nextBorder.right = border.right;
21962
+ }
21963
+ if (border.horizontal && row < region.endRow) {
21964
+ nextBorder.bottom = nextBorder.bottom ?? border.horizontal;
21965
+ }
21966
+ if (border.vertical && col < region.endCol) {
21967
+ nextBorder.right = nextBorder.right ?? border.vertical;
21968
+ }
21969
+ const nextStyle = { ...style };
21970
+ if (Object.keys(nextBorder).length === 0) {
21971
+ delete nextStyle.border;
21972
+ } else {
21973
+ nextStyle.border = nextBorder;
21974
+ }
21975
+ return nextStyle;
21191
21976
  }
21192
21977
  function resolveTableCellStyle(table, row, col, activeSheet) {
21193
21978
  if (!table || !activeSheet) {
@@ -21197,37 +21982,72 @@ function resolveTableCellStyle(table, row, col, activeSheet) {
21197
21982
  if (!styleName) {
21198
21983
  return null;
21199
21984
  }
21200
- const tableStyle = activeSheet.tableStyleByName[styleName];
21985
+ const tableStyle = activeSheet.tableStyleByName[styleName] ?? resolveBuiltinTableStyle(styleName);
21201
21986
  if (!tableStyle) {
21202
21987
  return null;
21203
21988
  }
21989
+ const headerRowCount = Math.max(table.headerRowCount, 1);
21990
+ const totalsRowCount = table.totalsRowShown ? Math.max(table.totalsRowCount, 1) : 0;
21991
+ const headerEndRow = table.start.row + headerRowCount - 1;
21992
+ const totalsStartRow = table.end.row - totalsRowCount + 1;
21993
+ const bodyStartRow = headerEndRow + 1;
21994
+ const bodyEndRow = totalsStartRow - 1;
21995
+ const isHeaderRow = row >= table.start.row && row <= headerEndRow;
21996
+ const isTotalsRow = totalsRowCount > 0 && row >= totalsStartRow && row <= table.end.row;
21997
+ const isBodyRow = row >= bodyStartRow && row <= bodyEndRow;
21998
+ const isFirstColumn = col === table.start.col;
21999
+ const isLastColumn = col === table.end.col;
22000
+ const tableRegion = {
22001
+ endCol: table.end.col,
22002
+ endRow: table.end.row,
22003
+ startCol: table.start.col,
22004
+ startRow: table.start.row
22005
+ };
22006
+ const headerRegion = { ...tableRegion, endRow: headerEndRow };
22007
+ const totalsRegion = { ...tableRegion, startRow: totalsStartRow };
21204
22008
  let resolved = null;
21205
- const applyElement = (elementType, enabled = true) => {
22009
+ const applyElement = (elementType, region, enabled = true) => {
21206
22010
  if (!enabled) {
21207
22011
  return;
21208
22012
  }
21209
- const nextStyle = normalizeTableStyleEdges(tableStyle[elementType] ?? null, table, row, col);
22013
+ const nextStyle = normalizeTableStyleEdges(tableStyle[elementType] ?? null, region, row, col);
21210
22014
  if (!nextStyle) {
21211
22015
  return;
21212
22016
  }
21213
22017
  resolved = mergeResolvedCellStyle(resolved, nextStyle);
21214
22018
  };
21215
- applyElement("wholeTable");
21216
- applyElement("firstColumn", Boolean(table.styleInfo?.showFirstColumn) && col === table.start.col);
21217
- applyElement("lastColumn", Boolean(table.styleInfo?.showLastColumn) && col === table.end.col);
21218
- const headerRowCount = Math.max(table.headerRowCount, 1);
21219
- const isHeaderRow = row >= table.start.row && row < table.start.row + headerRowCount;
21220
- applyElement("headerRow", isHeaderRow);
22019
+ applyElement("wholeTable", tableRegion);
22020
+ if (isBodyRow && table.styleInfo?.showColumnStripes) {
22021
+ const isFirstStripe = (col - table.start.col) % 2 === 0;
22022
+ applyElement(isFirstStripe ? "firstColumnStripe" : "secondColumnStripe", {
22023
+ endCol: col,
22024
+ endRow: bodyEndRow,
22025
+ startCol: col,
22026
+ startRow: bodyStartRow
22027
+ });
22028
+ }
22029
+ if (isBodyRow && table.styleInfo?.showRowStripes) {
22030
+ const isFirstStripe = (row - bodyStartRow) % 2 === 0;
22031
+ applyElement(isFirstStripe ? "firstRowStripe" : "secondRowStripe", {
22032
+ ...tableRegion,
22033
+ endRow: row,
22034
+ startRow: row
22035
+ });
22036
+ }
22037
+ applyElement("lastColumn", { ...tableRegion, startCol: table.end.col }, Boolean(table.styleInfo?.showLastColumn) && isLastColumn);
22038
+ applyElement("firstColumn", { ...tableRegion, endCol: table.start.col }, Boolean(table.styleInfo?.showFirstColumn) && isFirstColumn);
22039
+ applyElement("headerRow", headerRegion, isHeaderRow);
21221
22040
  if (isHeaderRow && table.headerRowCellStyle) {
21222
22041
  const namedHeaderStyle = activeSheet.namedCellStyleByName[table.headerRowCellStyle];
21223
22042
  if (namedHeaderStyle) {
21224
22043
  resolved = mergeResolvedCellStyle(resolved, namedHeaderStyle);
21225
22044
  }
21226
22045
  }
21227
- if (table.totalsRowShown) {
21228
- const totalsRowCount = Math.max(table.totalsRowCount, 1);
21229
- applyElement("totalRow", row > table.end.row - totalsRowCount);
21230
- }
22046
+ applyElement("totalRow", totalsRegion, isTotalsRow);
22047
+ applyElement("firstHeaderCell", { ...headerRegion, endCol: table.start.col }, isHeaderRow && isFirstColumn);
22048
+ applyElement("lastHeaderCell", { ...headerRegion, startCol: table.end.col }, isHeaderRow && isLastColumn);
22049
+ applyElement("firstTotalCell", { ...totalsRegion, endCol: table.start.col }, isTotalsRow && isFirstColumn);
22050
+ applyElement("lastTotalCell", { ...totalsRegion, startCol: table.end.col }, isTotalsRow && isLastColumn);
21231
22051
  return resolved;
21232
22052
  }
21233
22053
  function getTableHeaderColumn(table, row, col) {
@@ -21934,7 +22754,8 @@ function resolveConditionalRuleThreshold(threshold, numericValues) {
21934
22754
  return null;
21935
22755
  }
21936
22756
  const fallbackValue = typeof threshold.value === "number" ? threshold.value : null;
21937
- if (threshold.type === "num" || threshold.type === "formula") {
22757
+ const thresholdType = threshold.type.trim().toLowerCase();
22758
+ if (thresholdType === "num" || thresholdType === "formula") {
21938
22759
  return fallbackValue;
21939
22760
  }
21940
22761
  if (numericValues.length === 0) {
@@ -21942,17 +22763,216 @@ function resolveConditionalRuleThreshold(threshold, numericValues) {
21942
22763
  }
21943
22764
  const minValue = Math.min(...numericValues);
21944
22765
  const maxValue = Math.max(...numericValues);
21945
- if (threshold.type === "min") {
22766
+ if (thresholdType === "min") {
21946
22767
  return minValue;
21947
22768
  }
21948
- if (threshold.type === "max") {
22769
+ if (thresholdType === "max") {
21949
22770
  return maxValue;
21950
22771
  }
21951
- if ((threshold.type === "percent" || threshold.type === "percentile") && fallbackValue !== null) {
22772
+ if (thresholdType === "automin" || thresholdType === "automaticmin") {
22773
+ return Math.min(0, minValue);
22774
+ }
22775
+ if (thresholdType === "automax" || thresholdType === "automaticmax") {
22776
+ return Math.max(0, maxValue);
22777
+ }
22778
+ if ((thresholdType === "percent" || thresholdType === "percentile") && fallbackValue !== null) {
21952
22779
  return minValue + (maxValue - minValue) * (fallbackValue / 100);
21953
22780
  }
21954
22781
  return fallbackValue;
21955
22782
  }
22783
+ function parseConditionalFormulaLiteral(formula) {
22784
+ const trimmed = formula.trim();
22785
+ if (trimmed.length === 0) {
22786
+ return null;
22787
+ }
22788
+ const withoutEquals = trimmed.startsWith("=") ? trimmed.slice(1).trim() : trimmed;
22789
+ if (withoutEquals.startsWith('"') && withoutEquals.endsWith('"') && withoutEquals.length >= 2) {
22790
+ return withoutEquals.slice(1, -1).replace(/\"\"/g, '"');
22791
+ }
22792
+ const numeric = Number(withoutEquals.replace(/,/g, ""));
22793
+ if (Number.isFinite(numeric)) {
22794
+ return numeric;
22795
+ }
22796
+ return withoutEquals;
22797
+ }
22798
+ function resolveConditionalCellIsMatch(operator, left, right, numericValue, textValue) {
22799
+ const normalizedOperator = operator.trim();
22800
+ const normalizedText = textValue.trim();
22801
+ const parsedNumericText = Number(normalizedText.replace(/,/g, ""));
22802
+ const effectiveNumericValue = numericValue ?? (Number.isFinite(parsedNumericText) ? parsedNumericText : null);
22803
+ const cellIsTextComparable = effectiveNumericValue === null && normalizedText.length > 0;
22804
+ const compareComparable = (literal, predicate) => {
22805
+ if (typeof literal !== "number") {
22806
+ return false;
22807
+ }
22808
+ if (effectiveNumericValue !== null) {
22809
+ return predicate(effectiveNumericValue, literal);
22810
+ }
22811
+ if (cellIsTextComparable) {
22812
+ return predicate(1, 0);
22813
+ }
22814
+ return false;
22815
+ };
22816
+ switch (normalizedOperator) {
22817
+ case "greaterThan":
22818
+ return compareComparable(left, (cell, value) => cell > value);
22819
+ case "greaterThanOrEqual":
22820
+ return compareComparable(left, (cell, value) => cell >= value);
22821
+ case "lessThan":
22822
+ return compareComparable(left, (cell, value) => cell < value);
22823
+ case "lessThanOrEqual":
22824
+ return compareComparable(left, (cell, value) => cell <= value);
22825
+ case "between":
22826
+ if (typeof left !== "number" || typeof right !== "number") {
22827
+ return false;
22828
+ }
22829
+ if (effectiveNumericValue === null) {
22830
+ return false;
22831
+ }
22832
+ return effectiveNumericValue >= left && effectiveNumericValue <= right;
22833
+ case "notBetween":
22834
+ if (typeof left !== "number" || typeof right !== "number") {
22835
+ return false;
22836
+ }
22837
+ if (effectiveNumericValue === null) {
22838
+ return cellIsTextComparable;
22839
+ }
22840
+ return effectiveNumericValue < left || effectiveNumericValue > right;
22841
+ case "notEqual":
22842
+ if (typeof left === "number") {
22843
+ if (effectiveNumericValue !== null) {
22844
+ return effectiveNumericValue !== left;
22845
+ }
22846
+ return cellIsTextComparable;
22847
+ }
22848
+ return left !== null && normalizedText.toLowerCase() !== String(left).toLowerCase();
22849
+ case "equal":
22850
+ default:
22851
+ if (typeof left === "number") {
22852
+ if (effectiveNumericValue !== null) {
22853
+ return effectiveNumericValue === left;
22854
+ }
22855
+ return false;
22856
+ }
22857
+ return left !== null && normalizedText.toLowerCase() === String(left).toLowerCase();
22858
+ }
22859
+ }
22860
+ function resolveConditionalFormulaComparable(formula, worksheet, sheet, batchedCells) {
22861
+ const literal = parseConditionalFormulaLiteral(formula);
22862
+ if (typeof literal === "number") {
22863
+ return literal;
22864
+ }
22865
+ const normalized = formula.trim().replace(/^=/, "").trim();
22866
+ if (normalized.length === 0) {
22867
+ return literal;
22868
+ }
22869
+ const splitReference = splitSheetFormulaReference(normalized);
22870
+ const targetSheetName = splitReference?.sheetName ?? null;
22871
+ if (targetSheetName && sheet?.name && targetSheetName !== sheet.name) {
22872
+ return literal;
22873
+ }
22874
+ const cellRef = splitReference?.range ?? normalized;
22875
+ const cell = parseA1CellReference3(cellRef.replace(/\$/g, ""));
22876
+ if (!cell) {
22877
+ return literal;
22878
+ }
22879
+ if (worksheet) {
22880
+ const numeric = getCellNumericValue(worksheet, cell.row, cell.col);
22881
+ if (numeric !== null) {
22882
+ return numeric;
22883
+ }
22884
+ return getCellDisplayValue(worksheet, cell.row, cell.col, sheet);
22885
+ }
22886
+ if (batchedCells) {
22887
+ const batched = batchedCells.get(`${cell.row}:${cell.col}`);
22888
+ if (batched) {
22889
+ const numeric = getBatchedCellNumericValue(batched);
22890
+ if (numeric !== null) {
22891
+ return numeric;
22892
+ }
22893
+ return batched.value;
22894
+ }
22895
+ }
22896
+ return literal;
22897
+ }
22898
+ function normalizeConditionalTextOperand(value) {
22899
+ if (value === null || value === void 0) {
22900
+ return "";
22901
+ }
22902
+ return String(value).trim().toLowerCase();
22903
+ }
22904
+ function resolveConditionalStyledRuleMatch(rule, numericValue, textValue, worksheet, sheet, batchedCells) {
22905
+ const normalizedRuleType = rule.ruleType.trim().toLowerCase();
22906
+ const left = resolveConditionalFormulaComparable(rule.formulas?.[0] ?? "", worksheet, sheet, batchedCells);
22907
+ const right = resolveConditionalFormulaComparable(rule.formulas?.[1] ?? "", worksheet, sheet, batchedCells);
22908
+ if (normalizedRuleType === "cellis") {
22909
+ return resolveConditionalCellIsMatch(rule.operator ?? "equal", left, right, numericValue, textValue);
22910
+ }
22911
+ const normalizedCellText = textValue.trim().toLowerCase();
22912
+ const normalizedOperand = normalizeConditionalTextOperand(rule.text) || normalizeConditionalTextOperand(left);
22913
+ switch (normalizedRuleType) {
22914
+ case "beginwith":
22915
+ case "beginswith":
22916
+ return normalizedOperand.length > 0 && normalizedCellText.startsWith(normalizedOperand);
22917
+ case "endwith":
22918
+ case "endswith":
22919
+ return normalizedOperand.length > 0 && normalizedCellText.endsWith(normalizedOperand);
22920
+ case "containstext":
22921
+ return normalizedOperand.length > 0 && normalizedCellText.includes(normalizedOperand);
22922
+ case "notcontainstext":
22923
+ return normalizedOperand.length > 0 && !normalizedCellText.includes(normalizedOperand);
22924
+ default:
22925
+ return false;
22926
+ }
22927
+ }
22928
+ var styledConditionalRulesByRuleList = /* @__PURE__ */ new WeakMap();
22929
+ function getStyledConditionalRules(rules) {
22930
+ let styledRules = styledConditionalRulesByRuleList.get(rules);
22931
+ if (!styledRules) {
22932
+ styledRules = rules.filter((rule) => rule.kind === "styled");
22933
+ styledConditionalRulesByRuleList.set(rules, styledRules);
22934
+ }
22935
+ return styledRules;
22936
+ }
22937
+ function resolveConditionalCellStyleForCell(row, col, sheet, readNumericValue, readTextValue, worksheet, batchedCells) {
22938
+ const rules = sheet?.conditionalFormatRules;
22939
+ if (!sheet || !rules || rules.length === 0) {
22940
+ return null;
22941
+ }
22942
+ const styledRules = getStyledConditionalRules(rules);
22943
+ if (styledRules.length === 0) {
22944
+ return null;
22945
+ }
22946
+ const matchedStyles = [];
22947
+ let numericValue;
22948
+ let textValue;
22949
+ for (const rule of styledRules) {
22950
+ if (!rule.ranges.some((range) => isCellInRange({ row, col }, range))) {
22951
+ continue;
22952
+ }
22953
+ if (numericValue === void 0) {
22954
+ numericValue = readNumericValue();
22955
+ }
22956
+ if (textValue === void 0) {
22957
+ textValue = readTextValue();
22958
+ }
22959
+ if (!resolveConditionalStyledRuleMatch(rule, numericValue, textValue, worksheet, sheet, batchedCells)) {
22960
+ continue;
22961
+ }
22962
+ matchedStyles.push(rule.style);
22963
+ if (rule.stopIfTrue) {
22964
+ break;
22965
+ }
22966
+ }
22967
+ if (matchedStyles.length === 0) {
22968
+ return null;
22969
+ }
22970
+ let resolved = null;
22971
+ for (let index = matchedStyles.length - 1; index >= 0; index -= 1) {
22972
+ resolved = mergeResolvedCellStyle(resolved, matchedStyles[index]);
22973
+ }
22974
+ return resolved;
22975
+ }
21956
22976
  function buildConditionalIcon(iconSet, iconId) {
21957
22977
  switch (iconSet) {
21958
22978
  case "NoIcons":
@@ -22960,6 +23980,7 @@ function GridRow({
22960
23980
  "div",
22961
23981
  {
22962
23982
  style: {
23983
+ left: cellData.spillOffsetX ?? 0,
22963
23984
  maxWidth: cellData.spillWidth,
22964
23985
  overflow: "visible",
22965
23986
  pointerEvents: "none",
@@ -23196,6 +24217,8 @@ function XlsxGrid({
23196
24217
  const firstVisibleRowRef = React4.useRef(void 0);
23197
24218
  const lastVisibleRowRef = React4.useRef(void 0);
23198
24219
  const cellRenderCacheRef = React4.useRef(/* @__PURE__ */ new Map());
24220
+ const cellBaseRawStyleCacheRef = React4.useRef(/* @__PURE__ */ new Map());
24221
+ const mergedBorderOverlayCacheRef = React4.useRef(/* @__PURE__ */ new Map());
23199
24222
  const conditionalFormatMetricsCacheRef = React4.useRef(/* @__PURE__ */ new Map());
23200
24223
  const resizeStateRef = React4.useRef(null);
23201
24224
  const resizeFrameRef = React4.useRef(null);
@@ -23207,6 +24230,8 @@ function XlsxGrid({
23207
24230
  const pendingSelectionDragCleanupRef = React4.useRef(null);
23208
24231
  const fillDragCleanupRef = React4.useRef(null);
23209
24232
  const cachedScrollerRectRef = React4.useRef(null);
24233
+ const installImageInteractionListenersRef = React4.useRef(installImageInteractionListeners);
24234
+ const installChartInteractionListenersRef = React4.useRef(installChartInteractionListeners);
23210
24235
  const imageInteractionCleanupRef = React4.useRef(null);
23211
24236
  const imageInteractionRef = React4.useRef(null);
23212
24237
  const chartInteractionCleanupRef = React4.useRef(null);
@@ -24194,6 +25219,10 @@ function XlsxGrid({
24194
25219
  React4.useEffect(() => {
24195
25220
  readOnlyRef.current = readOnly;
24196
25221
  }, [readOnly]);
25222
+ React4.useLayoutEffect(() => {
25223
+ installImageInteractionListenersRef.current = installImageInteractionListeners;
25224
+ installChartInteractionListenersRef.current = installChartInteractionListeners;
25225
+ });
24197
25226
  React4.useEffect(() => {
24198
25227
  chartPreviewRectRef.current = chartPreviewRect;
24199
25228
  }, [chartPreviewRect]);
@@ -25221,6 +26250,8 @@ function XlsxGrid({
25221
26250
  const cellRenderCacheInvalidationRef = React4.useRef(null);
25222
26251
  if (cellRenderCacheInvalidationRef.current !== cellRenderCacheInvalidationKey) {
25223
26252
  cellRenderCacheRef.current.clear();
26253
+ cellBaseRawStyleCacheRef.current.clear();
26254
+ mergedBorderOverlayCacheRef.current.clear();
25224
26255
  cellRenderCacheInvalidationRef.current = cellRenderCacheInvalidationKey;
25225
26256
  }
25226
26257
  const getCellData = React4.useCallback((row, col) => {
@@ -25259,13 +26290,64 @@ function XlsxGrid({
25259
26290
  return mergedSecondaryData;
25260
26291
  }
25261
26292
  const merge = worksheet ? worksheet.getMergeSpan(row, col) : batchCoversRow ? batchedCell?.mergeSpan : null;
25262
- const inheritedStyle = resolveInheritedCellStyle2(activeSheet, row, col);
25263
- const worksheetStyle = batchCoversRow ? batchedCell?.style ?? null : worksheet?.getCellStyleAt(row, col) ?? null;
25264
- const rawStyle = mergeResolvedCellStyle(inheritedStyle, worksheetStyle, { replaceXfSubtrees: true });
26293
+ const resolveBaseResolvedStyle = (targetRow, targetCol) => {
26294
+ const targetCacheKey = `${targetRow}:${targetCol}`;
26295
+ const cachedBaseStyle = cellBaseRawStyleCacheRef.current.get(targetCacheKey);
26296
+ if (cachedBaseStyle !== void 0) {
26297
+ return cachedBaseStyle;
26298
+ }
26299
+ const targetBatchCoversRow = viewportRowBatch ? targetRow >= viewportRowBatch.startRow && targetRow <= viewportRowBatch.endRow : false;
26300
+ const targetBatchedCell = targetBatchCoversRow ? viewportRowBatch?.cells.get(targetCacheKey) : void 0;
26301
+ const targetInheritedStyle = resolveInheritedCellStyle2(activeSheet, targetRow, targetCol);
26302
+ const targetWorksheetStyle = targetBatchCoversRow ? targetBatchedCell?.style ?? null : worksheet?.getCellStyleAt(targetRow, targetCol) ?? null;
26303
+ const targetRawStyle = mergeResolvedCellStyle(targetInheritedStyle, targetWorksheetStyle, {
26304
+ replaceXfSubtrees: true
26305
+ });
26306
+ const targetTable = getTableAtCell(effectiveTables, targetRow, targetCol);
26307
+ const targetTableStyle = resolveTableCellStyle(targetTable, targetRow, targetCol, activeSheet);
26308
+ const resolvedStyle = mergeResolvedCellStyle(targetRawStyle, targetTableStyle);
26309
+ cellBaseRawStyleCacheRef.current.set(targetCacheKey, resolvedStyle);
26310
+ return resolvedStyle;
26311
+ };
25265
26312
  const table = getTableAtCell(effectiveTables, row, col);
25266
- const tableStyle = resolveTableCellStyle(table, row, col, activeSheet);
25267
- const mergedStyle = mergeResolvedCellStyle(rawStyle, tableStyle);
25268
- const alignment = mergedStyle?.alignment;
26313
+ const mergeRowSpan = Math.max(1, merge?.rowSpan ?? 1);
26314
+ const mergeColSpan = Math.max(1, merge?.colSpan ?? 1);
26315
+ let mergedBorderOverlay = null;
26316
+ if (mergeRowSpan > 1 || mergeColSpan > 1) {
26317
+ const mergedBorderOverlayCacheKey = `${row}:${col}:${mergeRowSpan}:${mergeColSpan}`;
26318
+ const cachedOverlay = mergedBorderOverlayCacheRef.current.get(mergedBorderOverlayCacheKey);
26319
+ if (cachedOverlay !== void 0) {
26320
+ mergedBorderOverlay = cachedOverlay;
26321
+ } else {
26322
+ mergedBorderOverlay = resolveMergedRegionBorderOverlay(
26323
+ row,
26324
+ col,
26325
+ merge,
26326
+ (targetRow, targetCol) => resolveBaseResolvedStyle(targetRow, targetCol)
26327
+ );
26328
+ mergedBorderOverlayCacheRef.current.set(mergedBorderOverlayCacheKey, mergedBorderOverlay);
26329
+ }
26330
+ }
26331
+ const baseResolvedStyle = resolveBaseResolvedStyle(row, col);
26332
+ const resolvedMergedStyle = mergeResolvedCellStyle(baseResolvedStyle, mergedBorderOverlay);
26333
+ let displayValue = null;
26334
+ const readDisplayValue = () => {
26335
+ if (displayValue === null) {
26336
+ displayValue = batchCoversRow || !worksheet ? batchedCell?.value ?? "" : getCellDisplayValue(worksheet, row, col, activeSheet);
26337
+ }
26338
+ return displayValue;
26339
+ };
26340
+ const conditionalCellStyle = resolveConditionalCellStyleForCell(
26341
+ row,
26342
+ col,
26343
+ activeSheet,
26344
+ () => worksheet ? getCellNumericValue(worksheet, row, col) : getBatchedCellNumericValue(batchedCell),
26345
+ readDisplayValue,
26346
+ worksheet,
26347
+ viewportRowBatch?.cells
26348
+ );
26349
+ const finalResolvedStyle = mergeResolvedCellStyle(resolvedMergedStyle, conditionalCellStyle);
26350
+ const alignment = finalResolvedStyle?.alignment;
25269
26351
  const textRotationDeg = resolveSpreadsheetTextRotation(alignment?.textRotation);
25270
26352
  const headerRowCount = table ? Math.max(table.headerRowCount, 1) : 0;
25271
26353
  const rawHyperlink = batchCoversRow ? batchedCell?.hyperlink : worksheet?.getHyperlinkAt(row, col);
@@ -25285,7 +26367,7 @@ function XlsxGrid({
25285
26367
  sparkline.range.start.col
25286
26368
  )
25287
26369
  ) : null;
25288
- const checkboxState = mergedStyle?.cellControl && worksheet ? getCellBooleanValue(worksheet, row, col) : null;
26370
+ const checkboxState = finalResolvedStyle?.cellControl && worksheet ? getCellBooleanValue(worksheet, row, col) : null;
25289
26371
  const chartHighlight = resolveCellChartHighlight({ row, col }, activeSheetChartHighlights);
25290
26372
  const nextData = {
25291
26373
  canvas: void 0,
@@ -25319,12 +26401,12 @@ function XlsxGrid({
25319
26401
  isTableHeader: Boolean(table && row >= table.start.row && row < table.start.row + headerRowCount),
25320
26402
  rowSpan: merge?.rowSpan,
25321
26403
  sparkline: sparkline && sparklineValues ? { config: sparkline, values: sparklineValues } : null,
25322
- style: scaleCssProperties(buildCellStyle(mergedStyle, palette, activeSheet?.themePalette, {
26404
+ style: scaleCssProperties(buildCellStyle(finalResolvedStyle, palette, activeSheet?.themePalette, {
25323
26405
  showGridLines: activeSheet?.showGridLines
25324
26406
  }), zoomFactor),
25325
26407
  textRotationDeg,
25326
26408
  validation: resolveCellDataValidation(row, col, activeSheet),
25327
- value: sparkline ? "" : checkboxState !== null ? "" : batchCoversRow || !worksheet ? batchedCell?.value ?? "" : getCellDisplayValue(worksheet, row, col, activeSheet)
26409
+ value: sparkline ? "" : checkboxState !== null ? "" : readDisplayValue()
25328
26410
  };
25329
26411
  if (getCellStyle) {
25330
26412
  const styleOverrides = getCellStyle({
@@ -25350,6 +26432,7 @@ function XlsxGrid({
25350
26432
  }
25351
26433
  }
25352
26434
  nextData.canvas = buildCanvasCellStyleCache(nextData.style);
26435
+ cellRenderCacheRef.current.set(cacheKey, nextData);
25353
26436
  if (canCellTextOverflow(nextData)) {
25354
26437
  const startColIndex = colIndexByActual.get(col);
25355
26438
  if (startColIndex !== void 0) {
@@ -25362,9 +26445,13 @@ function XlsxGrid({
25362
26445
  displayEffectiveColWidths[startColIndex] ?? displayDefaultColWidth,
25363
26446
  sumPrefixRange(colPrefixSums, startColIndex, endColIndex)
25364
26447
  );
26448
+ const align = nextData.style.textAlign;
26449
+ const spillSide = align === "right" || align === "end" ? "left" : "right";
25365
26450
  let availableWidth = baseWidth;
25366
26451
  if (requiredWidth > availableWidth) {
25367
- for (let nextColIndex = endColIndex + 1; nextColIndex < visibleCols.length; nextColIndex += 1) {
26452
+ const nextColStep = spillSide === "left" ? -1 : 1;
26453
+ let nextColIndex = spillSide === "left" ? startColIndex - 1 : endColIndex + 1;
26454
+ while (nextColIndex >= 0 && nextColIndex < visibleCols.length) {
25368
26455
  const nextActualCol = visibleCols[nextColIndex];
25369
26456
  if (nextActualCol === void 0) {
25370
26457
  break;
@@ -25377,9 +26464,12 @@ function XlsxGrid({
25377
26464
  if (requiredWidth <= availableWidth) {
25378
26465
  break;
25379
26466
  }
26467
+ nextColIndex += nextColStep;
25380
26468
  }
25381
26469
  if (availableWidth > baseWidth) {
25382
26470
  nextData.spillWidth = Math.max(0, availableWidth - horizontalPadding);
26471
+ nextData.spillSide = spillSide;
26472
+ nextData.spillOffsetX = spillSide === "left" ? Math.min(0, baseWidth - availableWidth) : 0;
25383
26473
  }
25384
26474
  }
25385
26475
  }
@@ -25424,7 +26514,6 @@ function XlsxGrid({
25424
26514
  }
25425
26515
  }
25426
26516
  }
25427
- cellRenderCacheRef.current.set(cacheKey, nextData);
25428
26517
  return nextData;
25429
26518
  }, [
25430
26519
  activeSheet,
@@ -27594,11 +28683,13 @@ function XlsxGrid({
27594
28683
  top: (useFrozenVerticalPosition ? stickyTopByRow.get(drawCell.row) ?? baseTop - drawingViewport.top : baseTop - drawingViewport.top) - paneBoundsForCell.top,
27595
28684
  width: displayRect?.width ?? (displayEffectiveColWidths[drawColIndex] ?? colItem.size)
27596
28685
  };
28686
+ const spillOffsetX = Math.min(0, cellData.spillOffsetX ?? 0);
28687
+ const drawableLeft = localRect.left + spillOffsetX;
27597
28688
  const drawableWidth = Math.max(localRect.width, cellData.spillWidth ?? 0);
27598
- if (localRect.left + drawableWidth < 0 || localRect.top + localRect.height < 0 || localRect.left > paneBoundsForCell.width || localRect.top > paneBoundsForCell.height) {
28689
+ if (drawableLeft + drawableWidth < 0 || localRect.top + localRect.height < 0 || drawableLeft > paneBoundsForCell.width || localRect.top > paneBoundsForCell.height) {
27599
28690
  continue;
27600
28691
  }
27601
- if (!intersectsCanvasDirtyRects(localRect.left, localRect.top, drawableWidth, localRect.height, paneDirtyRects)) {
28692
+ if (!intersectsCanvasDirtyRects(drawableLeft, localRect.top, drawableWidth, localRect.height, paneDirtyRects)) {
27602
28693
  canvasProfileCulledCells += 1;
27603
28694
  continue;
27604
28695
  }
@@ -27648,11 +28739,27 @@ function XlsxGrid({
27648
28739
  const bottomBorder = canvasCellStyle.bottomBorder;
27649
28740
  const leftBorder = canvasCellStyle.leftBorder;
27650
28741
  const rightNeighborCol = visibleCols[drawColIndex + Math.max(1, cellData.colSpan ?? 1)];
27651
- const rightNeighborData = rightNeighborCol === void 0 ? null : getCellData(drawCell.row, rightNeighborCol);
27652
- const rightNeighborLeftBorder = rightNeighborData?.isMergedSecondary ? null : rightNeighborData?.canvas?.leftBorder ?? parseCanvasBorderDeclaration(rightNeighborData?.style.borderLeft);
28742
+ const rightNeighborCell = rightNeighborCol === void 0 ? null : { row: drawCell.row, col: rightNeighborCol };
28743
+ const rightNeighborData = rightNeighborCell ? getCellData(rightNeighborCell.row, rightNeighborCell.col) : null;
28744
+ let rightNeighborLeftBorder = rightNeighborData?.isMergedSecondary ? null : rightNeighborData?.canvas?.leftBorder ?? parseCanvasBorderDeclaration(rightNeighborData?.style.borderLeft);
28745
+ if (rightNeighborLeftBorder == null && rightNeighborCell && rightNeighborData?.isMergedSecondary) {
28746
+ const rightNeighborAnchorCell = resolveMergeAnchorCell(rightNeighborCell);
28747
+ if (rightNeighborAnchorCell.col === rightNeighborCell.col) {
28748
+ const rightNeighborAnchorData = getCellData(rightNeighborAnchorCell.row, rightNeighborAnchorCell.col);
28749
+ rightNeighborLeftBorder = rightNeighborAnchorData.isMergedSecondary ? null : rightNeighborAnchorData.canvas?.leftBorder ?? parseCanvasBorderDeclaration(rightNeighborAnchorData.style.borderLeft);
28750
+ }
28751
+ }
27653
28752
  const bottomNeighborRow = visibleRows[drawRowIndex + Math.max(1, cellData.rowSpan ?? 1)];
27654
- const bottomNeighborData = bottomNeighborRow === void 0 ? null : getCellData(bottomNeighborRow, drawCell.col);
27655
- const bottomNeighborTopBorder = bottomNeighborData?.isMergedSecondary ? null : bottomNeighborData?.canvas?.topBorder ?? parseCanvasBorderDeclaration(bottomNeighborData?.style.borderTop);
28753
+ const bottomNeighborCell = bottomNeighborRow === void 0 ? null : { row: bottomNeighborRow, col: drawCell.col };
28754
+ const bottomNeighborData = bottomNeighborCell ? getCellData(bottomNeighborCell.row, bottomNeighborCell.col) : null;
28755
+ let bottomNeighborTopBorder = bottomNeighborData?.isMergedSecondary ? null : bottomNeighborData?.canvas?.topBorder ?? parseCanvasBorderDeclaration(bottomNeighborData?.style.borderTop);
28756
+ if (bottomNeighborTopBorder == null && bottomNeighborCell && bottomNeighborData?.isMergedSecondary) {
28757
+ const bottomNeighborAnchorCell = resolveMergeAnchorCell(bottomNeighborCell);
28758
+ if (bottomNeighborAnchorCell.row === bottomNeighborCell.row) {
28759
+ const bottomNeighborAnchorData = getCellData(bottomNeighborAnchorCell.row, bottomNeighborAnchorCell.col);
28760
+ bottomNeighborTopBorder = bottomNeighborAnchorData.isMergedSecondary ? null : bottomNeighborAnchorData.canvas?.topBorder ?? parseCanvasBorderDeclaration(bottomNeighborAnchorData.style.borderTop);
28761
+ }
28762
+ }
27656
28763
  const resolvedRightBorder = resolveCanvasBoundaryBorder(rightBorder, rightNeighborLeftBorder);
27657
28764
  const resolvedBottomBorder = resolveCanvasBoundaryBorder(bottomBorder, bottomNeighborTopBorder);
27658
28765
  if (showGridLines && (!resolvedRightBorder || !resolvedBottomBorder)) {
@@ -27901,10 +29008,11 @@ function XlsxGrid({
27901
29008
  } else if (spillMaxWidth != null) {
27902
29009
  const text = shouldEllipsizeText ? truncateCanvasText(paneContext, rawText, maxTextWidth) : rawText;
27903
29010
  const textY = resolveCanvasTextMiddleY(cellStyle.verticalAlign, contentTop, contentHeight, singleLineHeight);
29011
+ const spillClipLeft = cellData.spillSide === "left" ? contentLeft + contentWidth - spillMaxWidth - textClipOverscan : contentLeft - textClipOverscan;
27904
29012
  deferredSpillTextsByPane[pane].push({
27905
29013
  align,
27906
29014
  clipHeight: contentHeight + textClipOverscan * 2,
27907
- clipLeft: contentLeft - textClipOverscan,
29015
+ clipLeft: spillClipLeft,
27908
29016
  clipTop: contentTop - textClipOverscan,
27909
29017
  clipWidth: spillMaxWidth + textClipOverscan * 2,
27910
29018
  color: textColor,
@@ -28228,7 +29336,7 @@ function XlsxGrid({
28228
29336
  setInteractionMode("select");
28229
29337
  document.body.style.cursor = "move";
28230
29338
  document.body.style.userSelect = "none";
28231
- installChartInteractionListeners(event.pointerId);
29339
+ installChartInteractionListenersRef.current(event.pointerId);
28232
29340
  }, [focusGrid, selectChart]);
28233
29341
  const startChartResize = React4.useCallback((event, chart, rect, handle) => {
28234
29342
  if (readOnlyRef.current || chart.editable === false || event.button !== 0) {
@@ -28254,7 +29362,7 @@ function XlsxGrid({
28254
29362
  setInteractionMode("select");
28255
29363
  document.body.style.cursor = String(IMAGE_HANDLE_CURSOR[handle]);
28256
29364
  document.body.style.userSelect = "none";
28257
- installChartInteractionListeners(event.pointerId);
29365
+ installChartInteractionListenersRef.current(event.pointerId);
28258
29366
  }, [focusGrid, selectChart]);
28259
29367
  const startImageMove = React4.useCallback((event, image, rect) => {
28260
29368
  if (event.button !== 0) {
@@ -28282,7 +29390,7 @@ function XlsxGrid({
28282
29390
  setInteractionMode("select");
28283
29391
  document.body.style.cursor = "move";
28284
29392
  document.body.style.userSelect = "none";
28285
- installImageInteractionListeners(event.pointerId);
29393
+ installImageInteractionListenersRef.current(event.pointerId);
28286
29394
  }, [focusGrid, selectImage]);
28287
29395
  const startImageResize = React4.useCallback((event, image, rect, handle) => {
28288
29396
  if (readOnlyRef.current || image.editable === false || event.button !== 0) {
@@ -28308,7 +29416,7 @@ function XlsxGrid({
28308
29416
  setInteractionMode("select");
28309
29417
  document.body.style.cursor = String(IMAGE_HANDLE_CURSOR[handle]);
28310
29418
  document.body.style.userSelect = "none";
28311
- installImageInteractionListeners(event.pointerId);
29419
+ installImageInteractionListenersRef.current(event.pointerId);
28312
29420
  }, [focusGrid, selectImage]);
28313
29421
  const handleImageClick = React4.useCallback((image) => {
28314
29422
  if (skipNextImageClickRef.current === image.id) {
@@ -29676,7 +30784,10 @@ function XlsxGrid({
29676
30784
  skipNextImageClickRef.current = interaction.imageId;
29677
30785
  }
29678
30786
  if (interaction.didMove && finalRect) {
29679
- setImageRect(interaction.imageId, toLogicalRect(finalRect));
30787
+ setImageRect(interaction.imageId, toLogicalRect(finalRect), {
30788
+ columnWidths: actualColWidths,
30789
+ rowHeights: actualRowHeights
30790
+ });
29680
30791
  }
29681
30792
  }
29682
30793
  imagePreviewRectRef.current = null;
@@ -29753,7 +30864,10 @@ function XlsxGrid({
29753
30864
  skipNextChartClickRef.current = interaction.chartId;
29754
30865
  }
29755
30866
  if (interaction.didMove && finalRect) {
29756
- setChartRect(interaction.chartId, toLogicalRect(finalRect));
30867
+ setChartRect(interaction.chartId, toLogicalRect(finalRect), {
30868
+ columnWidths: actualColWidths,
30869
+ rowHeights: actualRowHeights
30870
+ });
29757
30871
  }
29758
30872
  }
29759
30873
  chartPreviewRectRef.current = null;
@@ -31592,7 +32706,17 @@ function useXlsxViewerThumbnails(options = {}) {
31592
32706
  const inheritedStyle = resolveInheritedCellStyle2(sheet, row, col);
31593
32707
  const worksheetStyle = worksheet ? worksheet.getCellStyleAt(row, col) ?? null : batchedCell?.style ?? null;
31594
32708
  const mergedStyle = mergeResolvedCellStyle(inheritedStyle, worksheetStyle, { replaceXfSubtrees: true });
31595
- const alignment = mergedStyle?.alignment;
32709
+ const conditionalCellStyle = resolveConditionalCellStyleForCell(
32710
+ row,
32711
+ col,
32712
+ sheet,
32713
+ () => worksheet ? getCellNumericValue(worksheet, row, col) : getBatchedCellNumericValue(batchedCell),
32714
+ () => worksheet ? getCellDisplayValue(worksheet, row, col, sheet) : batchedCell?.value ?? "",
32715
+ worksheet,
32716
+ workerRowBatch?.cells
32717
+ );
32718
+ const finalResolvedStyle = mergeResolvedCellStyle(mergedStyle, conditionalCellStyle);
32719
+ const alignment = finalResolvedStyle?.alignment;
31596
32720
  const sparkline = sparklineByCell.get(cacheKey) ?? null;
31597
32721
  const getNumericValue = (targetRow, targetCol) => worksheet ? getCellNumericValue(worksheet, targetRow, targetCol) : getBatchedCellNumericValue(workerRowBatch?.cells.get(`${targetRow}:${targetCol}`));
31598
32722
  const sparklineValues = sparkline ? sparkline.range.start.row === sparkline.range.end.row ? Array.from(
@@ -31608,7 +32732,7 @@ function useXlsxViewerThumbnails(options = {}) {
31608
32732
  sparkline.range.start.col
31609
32733
  )
31610
32734
  ) : null;
31611
- const checkboxState = mergedStyle?.cellControl ? worksheet ? getCellBooleanValue(worksheet, row, col) : getBatchedCellBooleanValue(batchedCell) : null;
32735
+ const checkboxState = finalResolvedStyle?.cellControl ? worksheet ? getCellBooleanValue(worksheet, row, col) : getBatchedCellBooleanValue(batchedCell) : null;
31612
32736
  const nextData = {
31613
32737
  canvas: void 0,
31614
32738
  checkboxState,
@@ -31619,7 +32743,7 @@ function useXlsxViewerThumbnails(options = {}) {
31619
32743
  isMergedSecondary: false,
31620
32744
  rowSpan: merge?.rowSpan,
31621
32745
  sparkline: sparkline && sparklineValues ? { config: sparkline, values: sparklineValues } : null,
31622
- style: buildCellStyle(mergedStyle, palette, sheet.themePalette, {
32746
+ style: buildCellStyle(finalResolvedStyle, palette, sheet.themePalette, {
31623
32747
  showGridLines
31624
32748
  }),
31625
32749
  textRotationDeg: resolveSpreadsheetTextRotation(alignment?.textRotation),