@extend-ai/react-xlsx 0.16.2 → 0.16.3

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
@@ -4421,6 +4421,7 @@ function parseWorkbookStyles(archive) {
4421
4421
  const xml = readArchiveText2(archive, "xl/styles.xml");
4422
4422
  if (!xml) {
4423
4423
  return {
4424
+ differentialStyles: [],
4424
4425
  defaultFont: null,
4425
4426
  namedCellStyleByName: {},
4426
4427
  styleById: {},
@@ -4430,6 +4431,7 @@ function parseWorkbookStyles(archive) {
4430
4431
  const document2 = parseXml2(xml);
4431
4432
  if (!document2) {
4432
4433
  return {
4434
+ differentialStyles: [],
4433
4435
  defaultFont: null,
4434
4436
  namedCellStyleByName: {},
4435
4437
  styleById: {},
@@ -4446,6 +4448,7 @@ function parseWorkbookStyles(archive) {
4446
4448
  const tableStylesNode = getFirstDescendant(document2, "tableStyles");
4447
4449
  if (!cellXfsNode) {
4448
4450
  return {
4451
+ differentialStyles: [],
4449
4452
  defaultFont: null,
4450
4453
  namedCellStyleByName: {},
4451
4454
  styleById: {},
@@ -4502,6 +4505,7 @@ function parseWorkbookStyles(archive) {
4502
4505
  sizePt: typeof normalFont.size === "number" ? normalFont.size : void 0
4503
4506
  } : null;
4504
4507
  return {
4508
+ differentialStyles,
4505
4509
  defaultFont,
4506
4510
  namedCellStyleByName,
4507
4511
  styleById,
@@ -4542,10 +4546,11 @@ function parseSpreadsheetBooleanAttribute(node, name) {
4542
4546
  }
4543
4547
  return value !== "0" && value !== "false";
4544
4548
  }
4545
- function parseStandardConditionalFormatRule(cfRuleNode, ranges) {
4549
+ function parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles = []) {
4546
4550
  const type = cfRuleNode.getAttribute("type");
4547
4551
  const rawPriority = Number(cfRuleNode.getAttribute("priority") ?? Number.NaN);
4548
4552
  const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;
4553
+ const formulas = getChildElements(cfRuleNode, "formula").map((formulaNode) => (formulaNode.textContent ?? "").trim()).filter((formula) => formula.length > 0);
4549
4554
  if (type === "colorScale") {
4550
4555
  const colorScaleNode = getFirstChild(cfRuleNode, "colorScale");
4551
4556
  if (!colorScaleNode) {
@@ -4606,7 +4611,34 @@ function parseStandardConditionalFormatRule(cfRuleNode, ranges) {
4606
4611
  showValue: parseSpreadsheetBooleanAttribute(iconSetNode, "showValue")
4607
4612
  };
4608
4613
  }
4609
- return null;
4614
+ const rawDxfId = Number(cfRuleNode.getAttribute("dxfId") ?? Number.NaN);
4615
+ if (!type || !Number.isFinite(rawDxfId)) {
4616
+ return null;
4617
+ }
4618
+ const style = differentialStyles[rawDxfId];
4619
+ if (!style) {
4620
+ return null;
4621
+ }
4622
+ const rawRank = Number(cfRuleNode.getAttribute("rank") ?? Number.NaN);
4623
+ const rawStdDev = Number(cfRuleNode.getAttribute("stdDev") ?? Number.NaN);
4624
+ return {
4625
+ aboveAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, "aboveAverage"),
4626
+ bottom: parseSpreadsheetBooleanAttribute(cfRuleNode, "bottom"),
4627
+ equalAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, "equalAverage"),
4628
+ formulas,
4629
+ kind: "styled",
4630
+ operator: cfRuleNode.getAttribute("operator") ?? void 0,
4631
+ percent: parseSpreadsheetBooleanAttribute(cfRuleNode, "percent"),
4632
+ priority,
4633
+ rank: Number.isFinite(rawRank) ? rawRank : void 0,
4634
+ ranges,
4635
+ ruleType: type,
4636
+ stdDev: Number.isFinite(rawStdDev) ? rawStdDev : void 0,
4637
+ stopIfTrue: parseSpreadsheetBooleanAttribute(cfRuleNode, "stopIfTrue"),
4638
+ style,
4639
+ text: cfRuleNode.getAttribute("text") ?? void 0,
4640
+ timePeriod: cfRuleNode.getAttribute("timePeriod") ?? void 0
4641
+ };
4610
4642
  }
4611
4643
  function parseExtendedConditionalFormatRule(cfRuleNode, ranges) {
4612
4644
  const type = cfRuleNode.getAttribute("type");
@@ -4717,14 +4749,14 @@ function mergeConditionalFormatRule(baseRule, extendedRule) {
4717
4749
  }
4718
4750
  return baseRule;
4719
4751
  }
4720
- function parseConditionalFormatRules(document2) {
4752
+ function parseConditionalFormatRules(document2, differentialStyles = []) {
4721
4753
  const standardRules = [];
4722
4754
  const extendedRules = [];
4723
4755
  getLocalElements(document2, "conditionalFormatting").forEach((conditionalFormattingNode) => {
4724
4756
  const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;
4725
4757
  const ranges = isExtended ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, "sqref")?.textContent ?? "") : parseSqrefRanges(conditionalFormattingNode.getAttribute("sqref"));
4726
4758
  getChildElements(conditionalFormattingNode, "cfRule").forEach((cfRuleNode) => {
4727
- const parsedRule = isExtended ? parseExtendedConditionalFormatRule(cfRuleNode, ranges) : parseStandardConditionalFormatRule(cfRuleNode, ranges);
4759
+ const parsedRule = isExtended ? parseExtendedConditionalFormatRule(cfRuleNode, ranges) : parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles);
4728
4760
  if (parsedRule) {
4729
4761
  if (isExtended) {
4730
4762
  extendedRules.push(parsedRule);
@@ -4770,8 +4802,9 @@ function parseSheetState(archive, path, options) {
4770
4802
  return null;
4771
4803
  }
4772
4804
  const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;
4805
+ const autoFilterRanges = parseSqrefRanges(getLocalElements(document2, "autoFilter")[0]?.getAttribute("ref"));
4773
4806
  const cachedFormulaValues = {};
4774
- const conditionalFormatRules = parseConditionalFormatRules(document2);
4807
+ const conditionalFormatRules = parseConditionalFormatRules(document2, options?.differentialStyles ?? []);
4775
4808
  const sparklines = parseSheetSparklines(document2, options?.themePalette);
4776
4809
  const sheetFormatNode = getLocalElements(document2, "sheetFormatPr")[0] ?? null;
4777
4810
  const sheetViewNode = getLocalElements(document2, "sheetView")[0] ?? null;
@@ -4863,6 +4896,7 @@ function parseSheetState(archive, path, options) {
4863
4896
  }
4864
4897
  });
4865
4898
  return {
4899
+ autoFilterRanges,
4866
4900
  cachedFormulaValues,
4867
4901
  columnWidthCharacterWidthPx,
4868
4902
  colWidthOverridesPx,
@@ -6028,12 +6062,13 @@ function parseWorkbookStructureAssetsFromArchive(archive, options) {
6028
6062
  const workbookSheets = parseWorkbookSheets(archive);
6029
6063
  const theme = parseWorkbookTheme(archive);
6030
6064
  const themePalette = buildThemePalette(theme);
6031
- const { defaultFont, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);
6065
+ const { defaultFont, differentialStyles, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);
6032
6066
  return {
6033
6067
  contentTypes,
6034
6068
  namedCellStyleByName,
6035
6069
  sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {
6036
6070
  ...options,
6071
+ differentialStyles,
6037
6072
  defaultFont,
6038
6073
  themePalette
6039
6074
  })),
@@ -7186,6 +7221,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7186
7221
  const usedRange = worksheet.usedRange();
7187
7222
  if (!usedRange) {
7188
7223
  sheets.push({
7224
+ autoFilterRanges: sheetState?.autoFilterRanges ?? [],
7189
7225
  cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},
7190
7226
  columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,
7191
7227
  colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},
@@ -7272,6 +7308,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7272
7308
  return colWidthsCache;
7273
7309
  };
7274
7310
  const sheet = {
7311
+ autoFilterRanges: sheetState?.autoFilterRanges ?? [],
7275
7312
  cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},
7276
7313
  columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,
7277
7314
  colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},
@@ -7652,9 +7689,9 @@ function rangeContainsCell(range, cell) {
7652
7689
  const normalized = normalizeRange(range);
7653
7690
  return cell.row >= normalized.start.row && cell.row <= normalized.end.row && cell.col >= normalized.start.col && cell.col <= normalized.end.col;
7654
7691
  }
7655
- function mapWorksheetTables(worksheet) {
7692
+ function mapWorksheetTables(worksheet, autoFilterRanges = []) {
7656
7693
  const rawTables = worksheet?.tables ?? [];
7657
- return rawTables.flatMap((table, index) => {
7694
+ const mappedTables = rawTables.flatMap((table, index) => {
7658
7695
  const rawColumns = Array.isArray(table.columns) ? table.columns : [];
7659
7696
  const rawName = typeof table.name === "string" ? table.name : `Table${index + 1}`;
7660
7697
  const rawDisplayName = typeof table.displayName === "string" ? table.displayName : typeof table.name === "string" ? table.name : `Table ${index + 1}`;
@@ -7682,6 +7719,34 @@ function mapWorksheetTables(worksheet) {
7682
7719
  totalsRowShown: resolveWorkbookTableBoolean(table.totalsRowShown)
7683
7720
  }];
7684
7721
  });
7722
+ const existingReferences = new Set(mappedTables.map((table) => table.reference));
7723
+ const mappedAutoFilterTables = autoFilterRanges.flatMap((range, index) => {
7724
+ const reference = rangeToA1(range);
7725
+ if (existingReferences.has(reference)) {
7726
+ return [];
7727
+ }
7728
+ const columnCount = Math.max(0, range.end.col - range.start.col + 1);
7729
+ const columns = Array.from({ length: columnCount }, (_, columnIndex) => {
7730
+ const headerValue = worksheet ? decodeHtmlEntities(worksheet.getFormattedValueAt(range.start.row, range.start.col + columnIndex) ?? "") : "";
7731
+ return {
7732
+ id: columnIndex + 1,
7733
+ index: columnIndex,
7734
+ name: headerValue.trim().length > 0 ? headerValue : `Column ${columnIndex + 1}`
7735
+ };
7736
+ });
7737
+ return [{
7738
+ columns,
7739
+ displayName: `AutoFilter ${index + 1}`,
7740
+ end: range.end,
7741
+ headerRowCount: 1,
7742
+ name: `__autofilter_${index + 1}_${reference}`,
7743
+ reference,
7744
+ start: range.start,
7745
+ totalsRowCount: 0,
7746
+ totalsRowShown: false
7747
+ }];
7748
+ });
7749
+ return [...mappedTables, ...mappedAutoFilterTables];
7685
7750
  }
7686
7751
  function resolveWorkbookTableCount(value, fallback) {
7687
7752
  if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
@@ -8986,8 +9051,8 @@ function useXlsxViewerController(options) {
8986
9051
  }
8987
9052
  }, [activeSheetIndex, sheets, workbook]);
8988
9053
  const tables = React.useMemo(
8989
- () => isWorkerBacked ? workerTablesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? [] : mapWorksheetTables(getActiveWorksheet()),
8990
- [activeSheet?.workbookSheetIndex, getActiveWorksheet, isWorkerBacked, revision, workerTablesByWorkbookSheetIndex]
9054
+ () => isWorkerBacked ? workerTablesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? [] : mapWorksheetTables(getActiveWorksheet(), activeSheet?.autoFilterRanges ?? []),
9055
+ [activeSheet?.autoFilterRanges, activeSheet?.workbookSheetIndex, getActiveWorksheet, isWorkerBacked, revision, workerTablesByWorkbookSheetIndex]
8991
9056
  );
8992
9057
  const getCellSnapshotAsync = React.useCallback((workbookSheetIndex, row, col) => {
8993
9058
  if (!isWorkerBacked) {
@@ -11040,6 +11105,570 @@ import {
11040
11105
  useVirtualizer
11041
11106
  } from "@tanstack/react-virtual";
11042
11107
 
11108
+ // src/builtin-table-styles.ts
11109
+ var BUILTIN_TABLE_STYLES = {
11110
+ TableStyleLight1: {
11111
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" }, "bottom": { "color": { "theme": 1 }, "style": "thin" } } },
11112
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 1 }, "style": "thin" } } },
11113
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11114
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11115
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11116
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11117
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11118
+ },
11119
+ TableStyleLight2: {
11120
+ wholeTable: { "font": { "color": { "theme": 4, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" }, "bottom": { "color": { "theme": 4 }, "style": "thin" } } },
11121
+ headerRow: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 4 }, "style": "thin" } } },
11122
+ totalRow: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11123
+ firstColumn: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } } },
11124
+ lastColumn: { "font": { "bold": true, "color": { "theme": 4, "tint": -0.25 } } },
11125
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11126
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11127
+ },
11128
+ TableStyleLight3: {
11129
+ wholeTable: { "font": { "color": { "theme": 5, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" }, "bottom": { "color": { "theme": 5 }, "style": "thin" } } },
11130
+ headerRow: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 5 }, "style": "thin" } } },
11131
+ totalRow: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11132
+ firstColumn: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } } },
11133
+ lastColumn: { "font": { "bold": true, "color": { "theme": 5, "tint": -0.25 } } },
11134
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11135
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11136
+ },
11137
+ TableStyleLight4: {
11138
+ wholeTable: { "font": { "color": { "theme": 6, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" }, "bottom": { "color": { "theme": 6 }, "style": "thin" } } },
11139
+ headerRow: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 6 }, "style": "thin" } } },
11140
+ totalRow: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11141
+ firstColumn: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } } },
11142
+ lastColumn: { "font": { "bold": true, "color": { "theme": 6, "tint": -0.25 } } },
11143
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11144
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11145
+ },
11146
+ TableStyleLight5: {
11147
+ wholeTable: { "font": { "color": { "theme": 7, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" }, "bottom": { "color": { "theme": 7 }, "style": "thin" } } },
11148
+ headerRow: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 7 }, "style": "thin" } } },
11149
+ totalRow: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11150
+ firstColumn: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } } },
11151
+ lastColumn: { "font": { "bold": true, "color": { "theme": 7, "tint": -0.25 } } },
11152
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11153
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11154
+ },
11155
+ TableStyleLight6: {
11156
+ wholeTable: { "font": { "color": { "theme": 8, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" }, "bottom": { "color": { "theme": 8 }, "style": "thin" } } },
11157
+ headerRow: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 8 }, "style": "thin" } } },
11158
+ totalRow: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11159
+ firstColumn: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } } },
11160
+ lastColumn: { "font": { "bold": true, "color": { "theme": 8, "tint": -0.25 } } },
11161
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11162
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11163
+ },
11164
+ TableStyleLight7: {
11165
+ wholeTable: { "font": { "color": { "theme": 9, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" }, "bottom": { "color": { "theme": 9 }, "style": "thin" } } },
11166
+ headerRow: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } }, "border": { "bottom": { "color": { "theme": 9 }, "style": "thin" } } },
11167
+ totalRow: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } }, "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11168
+ firstColumn: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } } },
11169
+ lastColumn: { "font": { "bold": true, "color": { "theme": 9, "tint": -0.25 } } },
11170
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11171
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11172
+ },
11173
+ TableStyleLight8: {
11174
+ 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" } } },
11175
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11176
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11177
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11178
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11179
+ firstRowStripe: { "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11180
+ secondRowStripe: { "border": { "top": { "color": { "theme": 1 }, "style": "thin" } } },
11181
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 1 }, "style": "thin" } } },
11182
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 1 }, "style": "thin" } } }
11183
+ },
11184
+ TableStyleLight9: {
11185
+ 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" } } },
11186
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11187
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11188
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11189
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11190
+ firstRowStripe: { "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11191
+ secondRowStripe: { "border": { "top": { "color": { "theme": 4 }, "style": "thin" } } },
11192
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 4 }, "style": "thin" } } },
11193
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 4 }, "style": "thin" } } }
11194
+ },
11195
+ TableStyleLight10: {
11196
+ 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" } } },
11197
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11198
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11199
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11200
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11201
+ firstRowStripe: { "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11202
+ secondRowStripe: { "border": { "top": { "color": { "theme": 5 }, "style": "thin" } } },
11203
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 5 }, "style": "thin" } } },
11204
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 5 }, "style": "thin" } } }
11205
+ },
11206
+ TableStyleLight11: {
11207
+ 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" } } },
11208
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11209
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11210
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11211
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11212
+ firstRowStripe: { "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11213
+ secondRowStripe: { "border": { "top": { "color": { "theme": 6 }, "style": "thin" } } },
11214
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 6 }, "style": "thin" } } },
11215
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 6 }, "style": "thin" } } }
11216
+ },
11217
+ TableStyleLight12: {
11218
+ 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" } } },
11219
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11220
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11221
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11222
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11223
+ firstRowStripe: { "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11224
+ secondRowStripe: { "border": { "top": { "color": { "theme": 7 }, "style": "thin" } } },
11225
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 7 }, "style": "thin" } } },
11226
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 7 }, "style": "thin" } } }
11227
+ },
11228
+ TableStyleLight13: {
11229
+ 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" } } },
11230
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11231
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "double" } } },
11232
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11233
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11234
+ firstRowStripe: { "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11235
+ secondRowStripe: { "border": { "top": { "color": { "theme": 8 }, "style": "thin" } } },
11236
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 8 }, "style": "thin" } } },
11237
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 8 }, "style": "thin" } } }
11238
+ },
11239
+ TableStyleLight14: {
11240
+ 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" } } },
11241
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11242
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11243
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11244
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11245
+ firstRowStripe: { "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11246
+ secondRowStripe: { "border": { "top": { "color": { "theme": 9 }, "style": "thin" } } },
11247
+ firstColumnStripe: { "border": { "left": { "color": { "theme": 9 }, "style": "thin" } } },
11248
+ secondColumnStripe: { "border": { "left": { "color": { "theme": 9 }, "style": "thin" } } }
11249
+ },
11250
+ TableStyleLight15: {
11251
+ 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" } } },
11252
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11253
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11254
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11255
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11256
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11257
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11258
+ },
11259
+ TableStyleLight16: {
11260
+ 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" } } },
11261
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 4 }, "style": "medium" } } },
11262
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11263
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11264
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11265
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11266
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11267
+ },
11268
+ TableStyleLight17: {
11269
+ 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" } } },
11270
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 5 }, "style": "medium" } } },
11271
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11272
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11273
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11274
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11275
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11276
+ },
11277
+ TableStyleLight18: {
11278
+ 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" } } },
11279
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 6 }, "style": "medium" } } },
11280
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11281
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11282
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11283
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11284
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11285
+ },
11286
+ TableStyleLight19: {
11287
+ 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" } } },
11288
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 7 }, "style": "medium" } } },
11289
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11290
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11291
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11292
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11293
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11294
+ },
11295
+ TableStyleLight20: {
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" }, "horizontal": { "color": { "theme": 8 }, "style": "thin" }, "vertical": { "color": { "theme": 8 }, "style": "thin" } } },
11297
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 8 }, "style": "medium" } } },
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: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11302
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11303
+ },
11304
+ TableStyleLight21: {
11305
+ 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" } } },
11306
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "bottom": { "color": { "theme": 9 }, "style": "medium" } } },
11307
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11308
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11309
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11310
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11311
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11312
+ },
11313
+ TableStyleMedium1: {
11314
+ 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" } } },
11315
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11316
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11317
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11318
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11319
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11320
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11321
+ },
11322
+ TableStyleMedium2: {
11323
+ 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" } } },
11324
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11325
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "double" } } },
11326
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11327
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11328
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11329
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } }
11330
+ },
11331
+ TableStyleMedium3: {
11332
+ 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" } } },
11333
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11334
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "double" } } },
11335
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11336
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11337
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } },
11338
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.8 }, "fillType": "solid" } }
11339
+ },
11340
+ TableStyleMedium4: {
11341
+ 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" } } },
11342
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11343
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "double" } } },
11344
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11345
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11346
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11347
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } }
11348
+ },
11349
+ TableStyleMedium5: {
11350
+ 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" } } },
11351
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11352
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "double" } } },
11353
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11354
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11355
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } },
11356
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.8 }, "fillType": "solid" } }
11357
+ },
11358
+ TableStyleMedium6: {
11359
+ 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" } } },
11360
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11361
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "double" } } },
11362
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11363
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11364
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11365
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } }
11366
+ },
11367
+ TableStyleMedium7: {
11368
+ 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" } } },
11369
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11370
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "double" } } },
11371
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11372
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11373
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } },
11374
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.8 }, "fillType": "solid" } }
11375
+ },
11376
+ TableStyleMedium8: {
11377
+ 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" } } },
11378
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11379
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11380
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11381
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11382
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11383
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11384
+ },
11385
+ TableStyleMedium9: {
11386
+ 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" } } },
11387
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11388
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11389
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11390
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11391
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11392
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11393
+ },
11394
+ TableStyleMedium10: {
11395
+ 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" } } },
11396
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11397
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11398
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11399
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11400
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } },
11401
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } }
11402
+ },
11403
+ TableStyleMedium11: {
11404
+ 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" } } },
11405
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11406
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11407
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11408
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11409
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11410
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11411
+ },
11412
+ TableStyleMedium12: {
11413
+ 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" } } },
11414
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11415
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11416
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11417
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11418
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } },
11419
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } }
11420
+ },
11421
+ TableStyleMedium13: {
11422
+ 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" } } },
11423
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11424
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11425
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11426
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11427
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11428
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11429
+ },
11430
+ TableStyleMedium14: {
11431
+ 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" } } },
11432
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "thick" } } },
11433
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "thick" } } },
11434
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11435
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11436
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } },
11437
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } }
11438
+ },
11439
+ TableStyleMedium15: {
11440
+ 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" } } },
11441
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11442
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11443
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11444
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11445
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11446
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11447
+ },
11448
+ TableStyleMedium16: {
11449
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11450
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11451
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11452
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11453
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11454
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11455
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11456
+ },
11457
+ TableStyleMedium17: {
11458
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11459
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11460
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11461
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11462
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11463
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11464
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11465
+ },
11466
+ TableStyleMedium18: {
11467
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11468
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11469
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11470
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11471
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11472
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11473
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11474
+ },
11475
+ TableStyleMedium19: {
11476
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11477
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11478
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11479
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11480
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11481
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11482
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11483
+ },
11484
+ TableStyleMedium20: {
11485
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11486
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11487
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11488
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11489
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11490
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11491
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11492
+ },
11493
+ TableStyleMedium21: {
11494
+ wholeTable: { "font": { "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" }, "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11495
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 1 }, "style": "medium" } } },
11496
+ totalRow: { "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11497
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11498
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11499
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11500
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } }
11501
+ },
11502
+ TableStyleMedium22: {
11503
+ 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" } } },
11504
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11505
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "medium" } } },
11506
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11507
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11508
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11509
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11510
+ },
11511
+ TableStyleMedium23: {
11512
+ 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" } } },
11513
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11514
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 4 }, "style": "medium" } } },
11515
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11516
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11517
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11518
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11519
+ },
11520
+ TableStyleMedium24: {
11521
+ 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" } } },
11522
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11523
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 5 }, "style": "medium" } } },
11524
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11525
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11526
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } },
11527
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": 0.6 }, "fillType": "solid" } }
11528
+ },
11529
+ TableStyleMedium25: {
11530
+ 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" } } },
11531
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11532
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 6 }, "style": "medium" } } },
11533
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11534
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11535
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11536
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11537
+ },
11538
+ TableStyleMedium26: {
11539
+ 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" } } },
11540
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11541
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 7 }, "style": "medium" } } },
11542
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11543
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11544
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } },
11545
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": 0.6 }, "fillType": "solid" } }
11546
+ },
11547
+ TableStyleMedium27: {
11548
+ 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" } } },
11549
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11550
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 8 }, "style": "medium" } } },
11551
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11552
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11553
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11554
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11555
+ },
11556
+ TableStyleMedium28: {
11557
+ 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" } } },
11558
+ headerRow: { "font": { "bold": true, "color": { "theme": 1 } } },
11559
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 9 }, "style": "medium" } } },
11560
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11561
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11562
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } },
11563
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": 0.6 }, "fillType": "solid" } }
11564
+ },
11565
+ TableStyleDark1: {
11566
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.45 }, "fillType": "solid" } },
11567
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11568
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.15 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11569
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11570
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11571
+ firstRowStripe: { "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" } },
11572
+ firstColumnStripe: { "fill": { "color": { "theme": 1, "tint": 0.25 }, "fillType": "solid" } }
11573
+ },
11574
+ TableStyleDark2: {
11575
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 4 }, "fillType": "solid" } },
11576
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11577
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11578
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11579
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11580
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" } },
11581
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": -0.25 }, "fillType": "solid" } }
11582
+ },
11583
+ TableStyleDark3: {
11584
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11585
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11586
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11587
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11588
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11589
+ firstRowStripe: { "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" } },
11590
+ firstColumnStripe: { "fill": { "color": { "theme": 5, "tint": -0.25 }, "fillType": "solid" } }
11591
+ },
11592
+ TableStyleDark4: {
11593
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 6 }, "fillType": "solid" } },
11594
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11595
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11596
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11597
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11598
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" } },
11599
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": -0.25 }, "fillType": "solid" } }
11600
+ },
11601
+ TableStyleDark5: {
11602
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11603
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11604
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11605
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11606
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11607
+ firstRowStripe: { "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" } },
11608
+ firstColumnStripe: { "fill": { "color": { "theme": 7, "tint": -0.25 }, "fillType": "solid" } }
11609
+ },
11610
+ TableStyleDark6: {
11611
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 8 }, "fillType": "solid" } },
11612
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11613
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11614
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11615
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11616
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" } },
11617
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": -0.25 }, "fillType": "solid" } }
11618
+ },
11619
+ TableStyleDark7: {
11620
+ wholeTable: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11621
+ headerRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" }, "border": { "bottom": { "color": { "theme": 0 }, "style": "medium" } } },
11622
+ totalRow: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.5 }, "fillType": "solid" }, "border": { "top": { "color": { "theme": 0 }, "style": "medium" } } },
11623
+ firstColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" }, "border": { "right": { "color": { "theme": 0 }, "style": "medium" } } },
11624
+ lastColumn: { "font": { "bold": true, "color": { "theme": 0 } }, "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" }, "border": { "left": { "color": { "theme": 0 }, "style": "medium" } } },
11625
+ firstRowStripe: { "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" } },
11626
+ firstColumnStripe: { "fill": { "color": { "theme": 9, "tint": -0.25 }, "fillType": "solid" } }
11627
+ },
11628
+ TableStyleDark8: {
11629
+ wholeTable: { "fill": { "color": { "theme": 0, "tint": -0.15 }, "fillType": "solid" } },
11630
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 1 }, "fillType": "solid" } },
11631
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11632
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11633
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11634
+ firstRowStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } },
11635
+ firstColumnStripe: { "fill": { "color": { "theme": 0, "tint": -0.35 }, "fillType": "solid" } }
11636
+ },
11637
+ TableStyleDark9: {
11638
+ wholeTable: { "fill": { "color": { "theme": 4, "tint": 0.8 }, "fillType": "solid" } },
11639
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 5 }, "fillType": "solid" } },
11640
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11641
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11642
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11643
+ firstRowStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } },
11644
+ firstColumnStripe: { "fill": { "color": { "theme": 4, "tint": 0.6 }, "fillType": "solid" } }
11645
+ },
11646
+ TableStyleDark10: {
11647
+ wholeTable: { "fill": { "color": { "theme": 6, "tint": 0.8 }, "fillType": "solid" } },
11648
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 7 }, "fillType": "solid" } },
11649
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11650
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11651
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11652
+ firstRowStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } },
11653
+ firstColumnStripe: { "fill": { "color": { "theme": 6, "tint": 0.6 }, "fillType": "solid" } }
11654
+ },
11655
+ TableStyleDark11: {
11656
+ wholeTable: { "fill": { "color": { "theme": 8, "tint": 0.8 }, "fillType": "solid" } },
11657
+ headerRow: { "font": { "color": { "theme": 0 } }, "fill": { "color": { "theme": 9 }, "fillType": "solid" } },
11658
+ totalRow: { "font": { "bold": true, "color": { "theme": 1 } }, "border": { "top": { "color": { "theme": 1 }, "style": "double" } } },
11659
+ firstColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11660
+ lastColumn: { "font": { "bold": true, "color": { "theme": 1 } } },
11661
+ firstRowStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } },
11662
+ firstColumnStripe: { "fill": { "color": { "theme": 8, "tint": 0.6 }, "fillType": "solid" } }
11663
+ }
11664
+ };
11665
+ function resolveBuiltinTableStyle(name) {
11666
+ if (!name || !Object.prototype.hasOwnProperty.call(BUILTIN_TABLE_STYLES, name)) {
11667
+ return null;
11668
+ }
11669
+ return BUILTIN_TABLE_STYLES[name] ?? null;
11670
+ }
11671
+
11043
11672
  // src/cell-text-clip.ts
11044
11673
  function resolveCellTextClipOverscan(overscan, usesWrappedText) {
11045
11674
  return {
@@ -20687,7 +21316,7 @@ function canCellTextOverflow(data) {
20687
21316
  return false;
20688
21317
  }
20689
21318
  const textAlign = data.style.textAlign;
20690
- if (textAlign && textAlign !== "left" && textAlign !== "start" && textAlign !== "center") {
21319
+ if (textAlign && textAlign !== "left" && textAlign !== "start" && textAlign !== "center" && textAlign !== "right" && textAlign !== "end") {
20691
21320
  return false;
20692
21321
  }
20693
21322
  return true;
@@ -21163,7 +21792,87 @@ function mergeResolvedCellStyle(base, overlay, options) {
21163
21792
  }
21164
21793
  return nextStyle;
21165
21794
  }
21166
- function normalizeTableStyleEdges(style, table, row, col) {
21795
+ function resolveBorderEdgePriority(edge) {
21796
+ const style = typeof edge?.style === "string" ? edge.style : "none";
21797
+ const stylePriority = {
21798
+ dashed: 2,
21799
+ dashDot: 3,
21800
+ dashDotDot: 3,
21801
+ dotted: 1,
21802
+ double: 8,
21803
+ hair: 0,
21804
+ medium: 6,
21805
+ mediumDashDot: 5,
21806
+ mediumDashDotDot: 5,
21807
+ mediumDashed: 5,
21808
+ none: -1,
21809
+ slantDashDot: 4,
21810
+ thick: 7,
21811
+ thin: 4
21812
+ };
21813
+ return stylePriority[style] ?? -1;
21814
+ }
21815
+ function resolvePreferredBorderEdge(current, candidate) {
21816
+ if (!candidate || typeof candidate.style !== "string" || candidate.style === "none") {
21817
+ return current ?? null;
21818
+ }
21819
+ if (!current) {
21820
+ return candidate;
21821
+ }
21822
+ const currentPriority = resolveBorderEdgePriority(current);
21823
+ const candidatePriority = resolveBorderEdgePriority(candidate);
21824
+ if (candidatePriority > currentPriority) {
21825
+ return candidate;
21826
+ }
21827
+ return current;
21828
+ }
21829
+ function resolveMergedRegionBorderOverlay(row, col, merge, resolveBaseCellStyle) {
21830
+ const rowSpan = Math.max(1, merge?.rowSpan ?? 1);
21831
+ const colSpan = Math.max(1, merge?.colSpan ?? 1);
21832
+ if (rowSpan === 1 && colSpan === 1) {
21833
+ return null;
21834
+ }
21835
+ const endRow = row + rowSpan - 1;
21836
+ const endCol = col + colSpan - 1;
21837
+ let top = null;
21838
+ let right = null;
21839
+ let bottom = null;
21840
+ let left = null;
21841
+ for (let targetCol = col; targetCol <= endCol; targetCol += 1) {
21842
+ const topStyle = resolveBaseCellStyle(row, targetCol);
21843
+ const topBorder = topStyle?.border;
21844
+ top = resolvePreferredBorderEdge(top, topBorder?.top ?? null);
21845
+ const bottomStyle = resolveBaseCellStyle(endRow, targetCol);
21846
+ const bottomBorder = bottomStyle?.border;
21847
+ bottom = resolvePreferredBorderEdge(bottom, bottomBorder?.bottom ?? null);
21848
+ }
21849
+ for (let targetRow = row; targetRow <= endRow; targetRow += 1) {
21850
+ const leftStyle = resolveBaseCellStyle(targetRow, col);
21851
+ const leftBorder = leftStyle?.border;
21852
+ left = resolvePreferredBorderEdge(left, leftBorder?.left ?? null);
21853
+ const rightStyle = resolveBaseCellStyle(targetRow, endCol);
21854
+ const rightBorder = rightStyle?.border;
21855
+ right = resolvePreferredBorderEdge(right, rightBorder?.right ?? null);
21856
+ }
21857
+ const border = {};
21858
+ if (top) {
21859
+ border.top = top;
21860
+ }
21861
+ if (right) {
21862
+ border.right = right;
21863
+ }
21864
+ if (bottom) {
21865
+ border.bottom = bottom;
21866
+ }
21867
+ if (left) {
21868
+ border.left = left;
21869
+ }
21870
+ if (Object.keys(border).length === 0) {
21871
+ return null;
21872
+ }
21873
+ return { border };
21874
+ }
21875
+ function normalizeTableStyleEdges(style, region, row, col) {
21167
21876
  if (!style) {
21168
21877
  return null;
21169
21878
  }
@@ -21171,23 +21880,32 @@ function normalizeTableStyleEdges(style, table, row, col) {
21171
21880
  if (!border) {
21172
21881
  return style;
21173
21882
  }
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;
21883
+ const nextBorder = {};
21884
+ if (border.top && row === region.startRow) {
21885
+ nextBorder.top = border.top;
21180
21886
  }
21181
- if (nextBorder.vertical) {
21182
- if (col < table.end.col) {
21183
- nextBorder.right = nextBorder.right ?? nextBorder.vertical;
21184
- }
21185
- delete nextBorder.vertical;
21887
+ if (border.bottom && row === region.endRow) {
21888
+ nextBorder.bottom = border.bottom;
21186
21889
  }
21187
- return {
21188
- ...style,
21189
- border: nextBorder
21190
- };
21890
+ if (border.left && col === region.startCol) {
21891
+ nextBorder.left = border.left;
21892
+ }
21893
+ if (border.right && col === region.endCol) {
21894
+ nextBorder.right = border.right;
21895
+ }
21896
+ if (border.horizontal && row < region.endRow) {
21897
+ nextBorder.bottom = nextBorder.bottom ?? border.horizontal;
21898
+ }
21899
+ if (border.vertical && col < region.endCol) {
21900
+ nextBorder.right = nextBorder.right ?? border.vertical;
21901
+ }
21902
+ const nextStyle = { ...style };
21903
+ if (Object.keys(nextBorder).length === 0) {
21904
+ delete nextStyle.border;
21905
+ } else {
21906
+ nextStyle.border = nextBorder;
21907
+ }
21908
+ return nextStyle;
21191
21909
  }
21192
21910
  function resolveTableCellStyle(table, row, col, activeSheet) {
21193
21911
  if (!table || !activeSheet) {
@@ -21197,37 +21915,72 @@ function resolveTableCellStyle(table, row, col, activeSheet) {
21197
21915
  if (!styleName) {
21198
21916
  return null;
21199
21917
  }
21200
- const tableStyle = activeSheet.tableStyleByName[styleName];
21918
+ const tableStyle = activeSheet.tableStyleByName[styleName] ?? resolveBuiltinTableStyle(styleName);
21201
21919
  if (!tableStyle) {
21202
21920
  return null;
21203
21921
  }
21922
+ const headerRowCount = Math.max(table.headerRowCount, 1);
21923
+ const totalsRowCount = table.totalsRowShown ? Math.max(table.totalsRowCount, 1) : 0;
21924
+ const headerEndRow = table.start.row + headerRowCount - 1;
21925
+ const totalsStartRow = table.end.row - totalsRowCount + 1;
21926
+ const bodyStartRow = headerEndRow + 1;
21927
+ const bodyEndRow = totalsStartRow - 1;
21928
+ const isHeaderRow = row >= table.start.row && row <= headerEndRow;
21929
+ const isTotalsRow = totalsRowCount > 0 && row >= totalsStartRow && row <= table.end.row;
21930
+ const isBodyRow = row >= bodyStartRow && row <= bodyEndRow;
21931
+ const isFirstColumn = col === table.start.col;
21932
+ const isLastColumn = col === table.end.col;
21933
+ const tableRegion = {
21934
+ endCol: table.end.col,
21935
+ endRow: table.end.row,
21936
+ startCol: table.start.col,
21937
+ startRow: table.start.row
21938
+ };
21939
+ const headerRegion = { ...tableRegion, endRow: headerEndRow };
21940
+ const totalsRegion = { ...tableRegion, startRow: totalsStartRow };
21204
21941
  let resolved = null;
21205
- const applyElement = (elementType, enabled = true) => {
21942
+ const applyElement = (elementType, region, enabled = true) => {
21206
21943
  if (!enabled) {
21207
21944
  return;
21208
21945
  }
21209
- const nextStyle = normalizeTableStyleEdges(tableStyle[elementType] ?? null, table, row, col);
21946
+ const nextStyle = normalizeTableStyleEdges(tableStyle[elementType] ?? null, region, row, col);
21210
21947
  if (!nextStyle) {
21211
21948
  return;
21212
21949
  }
21213
21950
  resolved = mergeResolvedCellStyle(resolved, nextStyle);
21214
21951
  };
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);
21952
+ applyElement("wholeTable", tableRegion);
21953
+ if (isBodyRow && table.styleInfo?.showColumnStripes) {
21954
+ const isFirstStripe = (col - table.start.col) % 2 === 0;
21955
+ applyElement(isFirstStripe ? "firstColumnStripe" : "secondColumnStripe", {
21956
+ endCol: col,
21957
+ endRow: bodyEndRow,
21958
+ startCol: col,
21959
+ startRow: bodyStartRow
21960
+ });
21961
+ }
21962
+ if (isBodyRow && table.styleInfo?.showRowStripes) {
21963
+ const isFirstStripe = (row - bodyStartRow) % 2 === 0;
21964
+ applyElement(isFirstStripe ? "firstRowStripe" : "secondRowStripe", {
21965
+ ...tableRegion,
21966
+ endRow: row,
21967
+ startRow: row
21968
+ });
21969
+ }
21970
+ applyElement("lastColumn", { ...tableRegion, startCol: table.end.col }, Boolean(table.styleInfo?.showLastColumn) && isLastColumn);
21971
+ applyElement("firstColumn", { ...tableRegion, endCol: table.start.col }, Boolean(table.styleInfo?.showFirstColumn) && isFirstColumn);
21972
+ applyElement("headerRow", headerRegion, isHeaderRow);
21221
21973
  if (isHeaderRow && table.headerRowCellStyle) {
21222
21974
  const namedHeaderStyle = activeSheet.namedCellStyleByName[table.headerRowCellStyle];
21223
21975
  if (namedHeaderStyle) {
21224
21976
  resolved = mergeResolvedCellStyle(resolved, namedHeaderStyle);
21225
21977
  }
21226
21978
  }
21227
- if (table.totalsRowShown) {
21228
- const totalsRowCount = Math.max(table.totalsRowCount, 1);
21229
- applyElement("totalRow", row > table.end.row - totalsRowCount);
21230
- }
21979
+ applyElement("totalRow", totalsRegion, isTotalsRow);
21980
+ applyElement("firstHeaderCell", { ...headerRegion, endCol: table.start.col }, isHeaderRow && isFirstColumn);
21981
+ applyElement("lastHeaderCell", { ...headerRegion, startCol: table.end.col }, isHeaderRow && isLastColumn);
21982
+ applyElement("firstTotalCell", { ...totalsRegion, endCol: table.start.col }, isTotalsRow && isFirstColumn);
21983
+ applyElement("lastTotalCell", { ...totalsRegion, startCol: table.end.col }, isTotalsRow && isLastColumn);
21231
21984
  return resolved;
21232
21985
  }
21233
21986
  function getTableHeaderColumn(table, row, col) {
@@ -21934,7 +22687,8 @@ function resolveConditionalRuleThreshold(threshold, numericValues) {
21934
22687
  return null;
21935
22688
  }
21936
22689
  const fallbackValue = typeof threshold.value === "number" ? threshold.value : null;
21937
- if (threshold.type === "num" || threshold.type === "formula") {
22690
+ const thresholdType = threshold.type.trim().toLowerCase();
22691
+ if (thresholdType === "num" || thresholdType === "formula") {
21938
22692
  return fallbackValue;
21939
22693
  }
21940
22694
  if (numericValues.length === 0) {
@@ -21942,17 +22696,216 @@ function resolveConditionalRuleThreshold(threshold, numericValues) {
21942
22696
  }
21943
22697
  const minValue = Math.min(...numericValues);
21944
22698
  const maxValue = Math.max(...numericValues);
21945
- if (threshold.type === "min") {
22699
+ if (thresholdType === "min") {
21946
22700
  return minValue;
21947
22701
  }
21948
- if (threshold.type === "max") {
22702
+ if (thresholdType === "max") {
21949
22703
  return maxValue;
21950
22704
  }
21951
- if ((threshold.type === "percent" || threshold.type === "percentile") && fallbackValue !== null) {
22705
+ if (thresholdType === "automin" || thresholdType === "automaticmin") {
22706
+ return Math.min(0, minValue);
22707
+ }
22708
+ if (thresholdType === "automax" || thresholdType === "automaticmax") {
22709
+ return Math.max(0, maxValue);
22710
+ }
22711
+ if ((thresholdType === "percent" || thresholdType === "percentile") && fallbackValue !== null) {
21952
22712
  return minValue + (maxValue - minValue) * (fallbackValue / 100);
21953
22713
  }
21954
22714
  return fallbackValue;
21955
22715
  }
22716
+ function parseConditionalFormulaLiteral(formula) {
22717
+ const trimmed = formula.trim();
22718
+ if (trimmed.length === 0) {
22719
+ return null;
22720
+ }
22721
+ const withoutEquals = trimmed.startsWith("=") ? trimmed.slice(1).trim() : trimmed;
22722
+ if (withoutEquals.startsWith('"') && withoutEquals.endsWith('"') && withoutEquals.length >= 2) {
22723
+ return withoutEquals.slice(1, -1).replace(/\"\"/g, '"');
22724
+ }
22725
+ const numeric = Number(withoutEquals.replace(/,/g, ""));
22726
+ if (Number.isFinite(numeric)) {
22727
+ return numeric;
22728
+ }
22729
+ return withoutEquals;
22730
+ }
22731
+ function resolveConditionalCellIsMatch(operator, left, right, numericValue, textValue) {
22732
+ const normalizedOperator = operator.trim();
22733
+ const normalizedText = textValue.trim();
22734
+ const parsedNumericText = Number(normalizedText.replace(/,/g, ""));
22735
+ const effectiveNumericValue = numericValue ?? (Number.isFinite(parsedNumericText) ? parsedNumericText : null);
22736
+ const cellIsTextComparable = effectiveNumericValue === null && normalizedText.length > 0;
22737
+ const compareComparable = (literal, predicate) => {
22738
+ if (typeof literal !== "number") {
22739
+ return false;
22740
+ }
22741
+ if (effectiveNumericValue !== null) {
22742
+ return predicate(effectiveNumericValue, literal);
22743
+ }
22744
+ if (cellIsTextComparable) {
22745
+ return predicate(1, 0);
22746
+ }
22747
+ return false;
22748
+ };
22749
+ switch (normalizedOperator) {
22750
+ case "greaterThan":
22751
+ return compareComparable(left, (cell, value) => cell > value);
22752
+ case "greaterThanOrEqual":
22753
+ return compareComparable(left, (cell, value) => cell >= value);
22754
+ case "lessThan":
22755
+ return compareComparable(left, (cell, value) => cell < value);
22756
+ case "lessThanOrEqual":
22757
+ return compareComparable(left, (cell, value) => cell <= value);
22758
+ case "between":
22759
+ if (typeof left !== "number" || typeof right !== "number") {
22760
+ return false;
22761
+ }
22762
+ if (effectiveNumericValue === null) {
22763
+ return false;
22764
+ }
22765
+ return effectiveNumericValue >= left && effectiveNumericValue <= right;
22766
+ case "notBetween":
22767
+ if (typeof left !== "number" || typeof right !== "number") {
22768
+ return false;
22769
+ }
22770
+ if (effectiveNumericValue === null) {
22771
+ return cellIsTextComparable;
22772
+ }
22773
+ return effectiveNumericValue < left || effectiveNumericValue > right;
22774
+ case "notEqual":
22775
+ if (typeof left === "number") {
22776
+ if (effectiveNumericValue !== null) {
22777
+ return effectiveNumericValue !== left;
22778
+ }
22779
+ return cellIsTextComparable;
22780
+ }
22781
+ return left !== null && normalizedText.toLowerCase() !== String(left).toLowerCase();
22782
+ case "equal":
22783
+ default:
22784
+ if (typeof left === "number") {
22785
+ if (effectiveNumericValue !== null) {
22786
+ return effectiveNumericValue === left;
22787
+ }
22788
+ return false;
22789
+ }
22790
+ return left !== null && normalizedText.toLowerCase() === String(left).toLowerCase();
22791
+ }
22792
+ }
22793
+ function resolveConditionalFormulaComparable(formula, worksheet, sheet, batchedCells) {
22794
+ const literal = parseConditionalFormulaLiteral(formula);
22795
+ if (typeof literal === "number") {
22796
+ return literal;
22797
+ }
22798
+ const normalized = formula.trim().replace(/^=/, "").trim();
22799
+ if (normalized.length === 0) {
22800
+ return literal;
22801
+ }
22802
+ const splitReference = splitSheetFormulaReference(normalized);
22803
+ const targetSheetName = splitReference?.sheetName ?? null;
22804
+ if (targetSheetName && sheet?.name && targetSheetName !== sheet.name) {
22805
+ return literal;
22806
+ }
22807
+ const cellRef = splitReference?.range ?? normalized;
22808
+ const cell = parseA1CellReference3(cellRef.replace(/\$/g, ""));
22809
+ if (!cell) {
22810
+ return literal;
22811
+ }
22812
+ if (worksheet) {
22813
+ const numeric = getCellNumericValue(worksheet, cell.row, cell.col);
22814
+ if (numeric !== null) {
22815
+ return numeric;
22816
+ }
22817
+ return getCellDisplayValue(worksheet, cell.row, cell.col, sheet);
22818
+ }
22819
+ if (batchedCells) {
22820
+ const batched = batchedCells.get(`${cell.row}:${cell.col}`);
22821
+ if (batched) {
22822
+ const numeric = getBatchedCellNumericValue(batched);
22823
+ if (numeric !== null) {
22824
+ return numeric;
22825
+ }
22826
+ return batched.value;
22827
+ }
22828
+ }
22829
+ return literal;
22830
+ }
22831
+ function normalizeConditionalTextOperand(value) {
22832
+ if (value === null || value === void 0) {
22833
+ return "";
22834
+ }
22835
+ return String(value).trim().toLowerCase();
22836
+ }
22837
+ function resolveConditionalStyledRuleMatch(rule, numericValue, textValue, worksheet, sheet, batchedCells) {
22838
+ const normalizedRuleType = rule.ruleType.trim().toLowerCase();
22839
+ const left = resolveConditionalFormulaComparable(rule.formulas?.[0] ?? "", worksheet, sheet, batchedCells);
22840
+ const right = resolveConditionalFormulaComparable(rule.formulas?.[1] ?? "", worksheet, sheet, batchedCells);
22841
+ if (normalizedRuleType === "cellis") {
22842
+ return resolveConditionalCellIsMatch(rule.operator ?? "equal", left, right, numericValue, textValue);
22843
+ }
22844
+ const normalizedCellText = textValue.trim().toLowerCase();
22845
+ const normalizedOperand = normalizeConditionalTextOperand(rule.text) || normalizeConditionalTextOperand(left);
22846
+ switch (normalizedRuleType) {
22847
+ case "beginwith":
22848
+ case "beginswith":
22849
+ return normalizedOperand.length > 0 && normalizedCellText.startsWith(normalizedOperand);
22850
+ case "endwith":
22851
+ case "endswith":
22852
+ return normalizedOperand.length > 0 && normalizedCellText.endsWith(normalizedOperand);
22853
+ case "containstext":
22854
+ return normalizedOperand.length > 0 && normalizedCellText.includes(normalizedOperand);
22855
+ case "notcontainstext":
22856
+ return normalizedOperand.length > 0 && !normalizedCellText.includes(normalizedOperand);
22857
+ default:
22858
+ return false;
22859
+ }
22860
+ }
22861
+ var styledConditionalRulesByRuleList = /* @__PURE__ */ new WeakMap();
22862
+ function getStyledConditionalRules(rules) {
22863
+ let styledRules = styledConditionalRulesByRuleList.get(rules);
22864
+ if (!styledRules) {
22865
+ styledRules = rules.filter((rule) => rule.kind === "styled");
22866
+ styledConditionalRulesByRuleList.set(rules, styledRules);
22867
+ }
22868
+ return styledRules;
22869
+ }
22870
+ function resolveConditionalCellStyleForCell(row, col, sheet, readNumericValue, readTextValue, worksheet, batchedCells) {
22871
+ const rules = sheet?.conditionalFormatRules;
22872
+ if (!sheet || !rules || rules.length === 0) {
22873
+ return null;
22874
+ }
22875
+ const styledRules = getStyledConditionalRules(rules);
22876
+ if (styledRules.length === 0) {
22877
+ return null;
22878
+ }
22879
+ const matchedStyles = [];
22880
+ let numericValue;
22881
+ let textValue;
22882
+ for (const rule of styledRules) {
22883
+ if (!rule.ranges.some((range) => isCellInRange({ row, col }, range))) {
22884
+ continue;
22885
+ }
22886
+ if (numericValue === void 0) {
22887
+ numericValue = readNumericValue();
22888
+ }
22889
+ if (textValue === void 0) {
22890
+ textValue = readTextValue();
22891
+ }
22892
+ if (!resolveConditionalStyledRuleMatch(rule, numericValue, textValue, worksheet, sheet, batchedCells)) {
22893
+ continue;
22894
+ }
22895
+ matchedStyles.push(rule.style);
22896
+ if (rule.stopIfTrue) {
22897
+ break;
22898
+ }
22899
+ }
22900
+ if (matchedStyles.length === 0) {
22901
+ return null;
22902
+ }
22903
+ let resolved = null;
22904
+ for (let index = matchedStyles.length - 1; index >= 0; index -= 1) {
22905
+ resolved = mergeResolvedCellStyle(resolved, matchedStyles[index]);
22906
+ }
22907
+ return resolved;
22908
+ }
21956
22909
  function buildConditionalIcon(iconSet, iconId) {
21957
22910
  switch (iconSet) {
21958
22911
  case "NoIcons":
@@ -22960,6 +23913,7 @@ function GridRow({
22960
23913
  "div",
22961
23914
  {
22962
23915
  style: {
23916
+ left: cellData.spillOffsetX ?? 0,
22963
23917
  maxWidth: cellData.spillWidth,
22964
23918
  overflow: "visible",
22965
23919
  pointerEvents: "none",
@@ -23196,6 +24150,8 @@ function XlsxGrid({
23196
24150
  const firstVisibleRowRef = React4.useRef(void 0);
23197
24151
  const lastVisibleRowRef = React4.useRef(void 0);
23198
24152
  const cellRenderCacheRef = React4.useRef(/* @__PURE__ */ new Map());
24153
+ const cellBaseRawStyleCacheRef = React4.useRef(/* @__PURE__ */ new Map());
24154
+ const mergedBorderOverlayCacheRef = React4.useRef(/* @__PURE__ */ new Map());
23199
24155
  const conditionalFormatMetricsCacheRef = React4.useRef(/* @__PURE__ */ new Map());
23200
24156
  const resizeStateRef = React4.useRef(null);
23201
24157
  const resizeFrameRef = React4.useRef(null);
@@ -25221,6 +26177,8 @@ function XlsxGrid({
25221
26177
  const cellRenderCacheInvalidationRef = React4.useRef(null);
25222
26178
  if (cellRenderCacheInvalidationRef.current !== cellRenderCacheInvalidationKey) {
25223
26179
  cellRenderCacheRef.current.clear();
26180
+ cellBaseRawStyleCacheRef.current.clear();
26181
+ mergedBorderOverlayCacheRef.current.clear();
25224
26182
  cellRenderCacheInvalidationRef.current = cellRenderCacheInvalidationKey;
25225
26183
  }
25226
26184
  const getCellData = React4.useCallback((row, col) => {
@@ -25259,13 +26217,64 @@ function XlsxGrid({
25259
26217
  return mergedSecondaryData;
25260
26218
  }
25261
26219
  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 });
26220
+ const resolveBaseResolvedStyle = (targetRow, targetCol) => {
26221
+ const targetCacheKey = `${targetRow}:${targetCol}`;
26222
+ const cachedBaseStyle = cellBaseRawStyleCacheRef.current.get(targetCacheKey);
26223
+ if (cachedBaseStyle !== void 0) {
26224
+ return cachedBaseStyle;
26225
+ }
26226
+ const targetBatchCoversRow = viewportRowBatch ? targetRow >= viewportRowBatch.startRow && targetRow <= viewportRowBatch.endRow : false;
26227
+ const targetBatchedCell = targetBatchCoversRow ? viewportRowBatch?.cells.get(targetCacheKey) : void 0;
26228
+ const targetInheritedStyle = resolveInheritedCellStyle2(activeSheet, targetRow, targetCol);
26229
+ const targetWorksheetStyle = targetBatchCoversRow ? targetBatchedCell?.style ?? null : worksheet?.getCellStyleAt(targetRow, targetCol) ?? null;
26230
+ const targetRawStyle = mergeResolvedCellStyle(targetInheritedStyle, targetWorksheetStyle, {
26231
+ replaceXfSubtrees: true
26232
+ });
26233
+ const targetTable = getTableAtCell(effectiveTables, targetRow, targetCol);
26234
+ const targetTableStyle = resolveTableCellStyle(targetTable, targetRow, targetCol, activeSheet);
26235
+ const resolvedStyle = mergeResolvedCellStyle(targetRawStyle, targetTableStyle);
26236
+ cellBaseRawStyleCacheRef.current.set(targetCacheKey, resolvedStyle);
26237
+ return resolvedStyle;
26238
+ };
25265
26239
  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;
26240
+ const mergeRowSpan = Math.max(1, merge?.rowSpan ?? 1);
26241
+ const mergeColSpan = Math.max(1, merge?.colSpan ?? 1);
26242
+ let mergedBorderOverlay = null;
26243
+ if (mergeRowSpan > 1 || mergeColSpan > 1) {
26244
+ const mergedBorderOverlayCacheKey = `${row}:${col}:${mergeRowSpan}:${mergeColSpan}`;
26245
+ const cachedOverlay = mergedBorderOverlayCacheRef.current.get(mergedBorderOverlayCacheKey);
26246
+ if (cachedOverlay !== void 0) {
26247
+ mergedBorderOverlay = cachedOverlay;
26248
+ } else {
26249
+ mergedBorderOverlay = resolveMergedRegionBorderOverlay(
26250
+ row,
26251
+ col,
26252
+ merge,
26253
+ (targetRow, targetCol) => resolveBaseResolvedStyle(targetRow, targetCol)
26254
+ );
26255
+ mergedBorderOverlayCacheRef.current.set(mergedBorderOverlayCacheKey, mergedBorderOverlay);
26256
+ }
26257
+ }
26258
+ const baseResolvedStyle = resolveBaseResolvedStyle(row, col);
26259
+ const resolvedMergedStyle = mergeResolvedCellStyle(baseResolvedStyle, mergedBorderOverlay);
26260
+ let displayValue = null;
26261
+ const readDisplayValue = () => {
26262
+ if (displayValue === null) {
26263
+ displayValue = batchCoversRow || !worksheet ? batchedCell?.value ?? "" : getCellDisplayValue(worksheet, row, col, activeSheet);
26264
+ }
26265
+ return displayValue;
26266
+ };
26267
+ const conditionalCellStyle = resolveConditionalCellStyleForCell(
26268
+ row,
26269
+ col,
26270
+ activeSheet,
26271
+ () => worksheet ? getCellNumericValue(worksheet, row, col) : getBatchedCellNumericValue(batchedCell),
26272
+ readDisplayValue,
26273
+ worksheet,
26274
+ viewportRowBatch?.cells
26275
+ );
26276
+ const finalResolvedStyle = mergeResolvedCellStyle(resolvedMergedStyle, conditionalCellStyle);
26277
+ const alignment = finalResolvedStyle?.alignment;
25269
26278
  const textRotationDeg = resolveSpreadsheetTextRotation(alignment?.textRotation);
25270
26279
  const headerRowCount = table ? Math.max(table.headerRowCount, 1) : 0;
25271
26280
  const rawHyperlink = batchCoversRow ? batchedCell?.hyperlink : worksheet?.getHyperlinkAt(row, col);
@@ -25285,7 +26294,7 @@ function XlsxGrid({
25285
26294
  sparkline.range.start.col
25286
26295
  )
25287
26296
  ) : null;
25288
- const checkboxState = mergedStyle?.cellControl && worksheet ? getCellBooleanValue(worksheet, row, col) : null;
26297
+ const checkboxState = finalResolvedStyle?.cellControl && worksheet ? getCellBooleanValue(worksheet, row, col) : null;
25289
26298
  const chartHighlight = resolveCellChartHighlight({ row, col }, activeSheetChartHighlights);
25290
26299
  const nextData = {
25291
26300
  canvas: void 0,
@@ -25319,12 +26328,12 @@ function XlsxGrid({
25319
26328
  isTableHeader: Boolean(table && row >= table.start.row && row < table.start.row + headerRowCount),
25320
26329
  rowSpan: merge?.rowSpan,
25321
26330
  sparkline: sparkline && sparklineValues ? { config: sparkline, values: sparklineValues } : null,
25322
- style: scaleCssProperties(buildCellStyle(mergedStyle, palette, activeSheet?.themePalette, {
26331
+ style: scaleCssProperties(buildCellStyle(finalResolvedStyle, palette, activeSheet?.themePalette, {
25323
26332
  showGridLines: activeSheet?.showGridLines
25324
26333
  }), zoomFactor),
25325
26334
  textRotationDeg,
25326
26335
  validation: resolveCellDataValidation(row, col, activeSheet),
25327
- value: sparkline ? "" : checkboxState !== null ? "" : batchCoversRow || !worksheet ? batchedCell?.value ?? "" : getCellDisplayValue(worksheet, row, col, activeSheet)
26336
+ value: sparkline ? "" : checkboxState !== null ? "" : readDisplayValue()
25328
26337
  };
25329
26338
  if (getCellStyle) {
25330
26339
  const styleOverrides = getCellStyle({
@@ -25350,6 +26359,7 @@ function XlsxGrid({
25350
26359
  }
25351
26360
  }
25352
26361
  nextData.canvas = buildCanvasCellStyleCache(nextData.style);
26362
+ cellRenderCacheRef.current.set(cacheKey, nextData);
25353
26363
  if (canCellTextOverflow(nextData)) {
25354
26364
  const startColIndex = colIndexByActual.get(col);
25355
26365
  if (startColIndex !== void 0) {
@@ -25362,9 +26372,13 @@ function XlsxGrid({
25362
26372
  displayEffectiveColWidths[startColIndex] ?? displayDefaultColWidth,
25363
26373
  sumPrefixRange(colPrefixSums, startColIndex, endColIndex)
25364
26374
  );
26375
+ const align = nextData.style.textAlign;
26376
+ const spillSide = align === "right" || align === "end" ? "left" : "right";
25365
26377
  let availableWidth = baseWidth;
25366
26378
  if (requiredWidth > availableWidth) {
25367
- for (let nextColIndex = endColIndex + 1; nextColIndex < visibleCols.length; nextColIndex += 1) {
26379
+ const nextColStep = spillSide === "left" ? -1 : 1;
26380
+ let nextColIndex = spillSide === "left" ? startColIndex - 1 : endColIndex + 1;
26381
+ while (nextColIndex >= 0 && nextColIndex < visibleCols.length) {
25368
26382
  const nextActualCol = visibleCols[nextColIndex];
25369
26383
  if (nextActualCol === void 0) {
25370
26384
  break;
@@ -25377,9 +26391,12 @@ function XlsxGrid({
25377
26391
  if (requiredWidth <= availableWidth) {
25378
26392
  break;
25379
26393
  }
26394
+ nextColIndex += nextColStep;
25380
26395
  }
25381
26396
  if (availableWidth > baseWidth) {
25382
26397
  nextData.spillWidth = Math.max(0, availableWidth - horizontalPadding);
26398
+ nextData.spillSide = spillSide;
26399
+ nextData.spillOffsetX = spillSide === "left" ? Math.min(0, baseWidth - availableWidth) : 0;
25383
26400
  }
25384
26401
  }
25385
26402
  }
@@ -25424,7 +26441,6 @@ function XlsxGrid({
25424
26441
  }
25425
26442
  }
25426
26443
  }
25427
- cellRenderCacheRef.current.set(cacheKey, nextData);
25428
26444
  return nextData;
25429
26445
  }, [
25430
26446
  activeSheet,
@@ -27594,11 +28610,13 @@ function XlsxGrid({
27594
28610
  top: (useFrozenVerticalPosition ? stickyTopByRow.get(drawCell.row) ?? baseTop - drawingViewport.top : baseTop - drawingViewport.top) - paneBoundsForCell.top,
27595
28611
  width: displayRect?.width ?? (displayEffectiveColWidths[drawColIndex] ?? colItem.size)
27596
28612
  };
28613
+ const spillOffsetX = Math.min(0, cellData.spillOffsetX ?? 0);
28614
+ const drawableLeft = localRect.left + spillOffsetX;
27597
28615
  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) {
28616
+ if (drawableLeft + drawableWidth < 0 || localRect.top + localRect.height < 0 || drawableLeft > paneBoundsForCell.width || localRect.top > paneBoundsForCell.height) {
27599
28617
  continue;
27600
28618
  }
27601
- if (!intersectsCanvasDirtyRects(localRect.left, localRect.top, drawableWidth, localRect.height, paneDirtyRects)) {
28619
+ if (!intersectsCanvasDirtyRects(drawableLeft, localRect.top, drawableWidth, localRect.height, paneDirtyRects)) {
27602
28620
  canvasProfileCulledCells += 1;
27603
28621
  continue;
27604
28622
  }
@@ -27648,11 +28666,27 @@ function XlsxGrid({
27648
28666
  const bottomBorder = canvasCellStyle.bottomBorder;
27649
28667
  const leftBorder = canvasCellStyle.leftBorder;
27650
28668
  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);
28669
+ const rightNeighborCell = rightNeighborCol === void 0 ? null : { row: drawCell.row, col: rightNeighborCol };
28670
+ const rightNeighborData = rightNeighborCell ? getCellData(rightNeighborCell.row, rightNeighborCell.col) : null;
28671
+ let rightNeighborLeftBorder = rightNeighborData?.isMergedSecondary ? null : rightNeighborData?.canvas?.leftBorder ?? parseCanvasBorderDeclaration(rightNeighborData?.style.borderLeft);
28672
+ if (rightNeighborLeftBorder == null && rightNeighborCell && rightNeighborData?.isMergedSecondary) {
28673
+ const rightNeighborAnchorCell = resolveMergeAnchorCell(rightNeighborCell);
28674
+ if (rightNeighborAnchorCell.col === rightNeighborCell.col) {
28675
+ const rightNeighborAnchorData = getCellData(rightNeighborAnchorCell.row, rightNeighborAnchorCell.col);
28676
+ rightNeighborLeftBorder = rightNeighborAnchorData.isMergedSecondary ? null : rightNeighborAnchorData.canvas?.leftBorder ?? parseCanvasBorderDeclaration(rightNeighborAnchorData.style.borderLeft);
28677
+ }
28678
+ }
27653
28679
  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);
28680
+ const bottomNeighborCell = bottomNeighborRow === void 0 ? null : { row: bottomNeighborRow, col: drawCell.col };
28681
+ const bottomNeighborData = bottomNeighborCell ? getCellData(bottomNeighborCell.row, bottomNeighborCell.col) : null;
28682
+ let bottomNeighborTopBorder = bottomNeighborData?.isMergedSecondary ? null : bottomNeighborData?.canvas?.topBorder ?? parseCanvasBorderDeclaration(bottomNeighborData?.style.borderTop);
28683
+ if (bottomNeighborTopBorder == null && bottomNeighborCell && bottomNeighborData?.isMergedSecondary) {
28684
+ const bottomNeighborAnchorCell = resolveMergeAnchorCell(bottomNeighborCell);
28685
+ if (bottomNeighborAnchorCell.row === bottomNeighborCell.row) {
28686
+ const bottomNeighborAnchorData = getCellData(bottomNeighborAnchorCell.row, bottomNeighborAnchorCell.col);
28687
+ bottomNeighborTopBorder = bottomNeighborAnchorData.isMergedSecondary ? null : bottomNeighborAnchorData.canvas?.topBorder ?? parseCanvasBorderDeclaration(bottomNeighborAnchorData.style.borderTop);
28688
+ }
28689
+ }
27656
28690
  const resolvedRightBorder = resolveCanvasBoundaryBorder(rightBorder, rightNeighborLeftBorder);
27657
28691
  const resolvedBottomBorder = resolveCanvasBoundaryBorder(bottomBorder, bottomNeighborTopBorder);
27658
28692
  if (showGridLines && (!resolvedRightBorder || !resolvedBottomBorder)) {
@@ -27901,10 +28935,11 @@ function XlsxGrid({
27901
28935
  } else if (spillMaxWidth != null) {
27902
28936
  const text = shouldEllipsizeText ? truncateCanvasText(paneContext, rawText, maxTextWidth) : rawText;
27903
28937
  const textY = resolveCanvasTextMiddleY(cellStyle.verticalAlign, contentTop, contentHeight, singleLineHeight);
28938
+ const spillClipLeft = cellData.spillSide === "left" ? contentLeft + contentWidth - spillMaxWidth - textClipOverscan : contentLeft - textClipOverscan;
27904
28939
  deferredSpillTextsByPane[pane].push({
27905
28940
  align,
27906
28941
  clipHeight: contentHeight + textClipOverscan * 2,
27907
- clipLeft: contentLeft - textClipOverscan,
28942
+ clipLeft: spillClipLeft,
27908
28943
  clipTop: contentTop - textClipOverscan,
27909
28944
  clipWidth: spillMaxWidth + textClipOverscan * 2,
27910
28945
  color: textColor,
@@ -31592,7 +32627,17 @@ function useXlsxViewerThumbnails(options = {}) {
31592
32627
  const inheritedStyle = resolveInheritedCellStyle2(sheet, row, col);
31593
32628
  const worksheetStyle = worksheet ? worksheet.getCellStyleAt(row, col) ?? null : batchedCell?.style ?? null;
31594
32629
  const mergedStyle = mergeResolvedCellStyle(inheritedStyle, worksheetStyle, { replaceXfSubtrees: true });
31595
- const alignment = mergedStyle?.alignment;
32630
+ const conditionalCellStyle = resolveConditionalCellStyleForCell(
32631
+ row,
32632
+ col,
32633
+ sheet,
32634
+ () => worksheet ? getCellNumericValue(worksheet, row, col) : getBatchedCellNumericValue(batchedCell),
32635
+ () => worksheet ? getCellDisplayValue(worksheet, row, col, sheet) : batchedCell?.value ?? "",
32636
+ worksheet,
32637
+ workerRowBatch?.cells
32638
+ );
32639
+ const finalResolvedStyle = mergeResolvedCellStyle(mergedStyle, conditionalCellStyle);
32640
+ const alignment = finalResolvedStyle?.alignment;
31596
32641
  const sparkline = sparklineByCell.get(cacheKey) ?? null;
31597
32642
  const getNumericValue = (targetRow, targetCol) => worksheet ? getCellNumericValue(worksheet, targetRow, targetCol) : getBatchedCellNumericValue(workerRowBatch?.cells.get(`${targetRow}:${targetCol}`));
31598
32643
  const sparklineValues = sparkline ? sparkline.range.start.row === sparkline.range.end.row ? Array.from(
@@ -31608,7 +32653,7 @@ function useXlsxViewerThumbnails(options = {}) {
31608
32653
  sparkline.range.start.col
31609
32654
  )
31610
32655
  ) : null;
31611
- const checkboxState = mergedStyle?.cellControl ? worksheet ? getCellBooleanValue(worksheet, row, col) : getBatchedCellBooleanValue(batchedCell) : null;
32656
+ const checkboxState = finalResolvedStyle?.cellControl ? worksheet ? getCellBooleanValue(worksheet, row, col) : getBatchedCellBooleanValue(batchedCell) : null;
31612
32657
  const nextData = {
31613
32658
  canvas: void 0,
31614
32659
  checkboxState,
@@ -31619,7 +32664,7 @@ function useXlsxViewerThumbnails(options = {}) {
31619
32664
  isMergedSecondary: false,
31620
32665
  rowSpan: merge?.rowSpan,
31621
32666
  sparkline: sparkline && sparklineValues ? { config: sparkline, values: sparklineValues } : null,
31622
- style: buildCellStyle(mergedStyle, palette, sheet.themePalette, {
32667
+ style: buildCellStyle(finalResolvedStyle, palette, sheet.themePalette, {
31623
32668
  showGridLines
31624
32669
  }),
31625
32670
  textRotationDeg: resolveSpreadsheetTextRotation(alignment?.textRotation),