From f36b2512fde1e7107b9942d7ef3bcc355a2303b3 Mon Sep 17 00:00:00 2001 From: wisonic-s Date: Mon, 2 Mar 2026 18:51:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8)=EF=BC=9A=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E9=80=8F=E8=A7=86=E8=A1=A8=E5=88=97=E8=87=AA=E9=80=82?= =?UTF-8?q?=E5=BA=94=E6=A8=A1=E5=BC=8F=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/panel/common/common_table.ts | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts index 4d7e72167f..9085bee5a2 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts @@ -36,6 +36,7 @@ import { S2Options, S2Theme, SERIES_NUMBER_FIELD, + EXTRA_FIELD, setTooltipContainerStyle, SHAPE_STYLE_MAP, SpreadSheet, @@ -565,6 +566,77 @@ export function getStyle(chart: Chart, dataConfig: S2DataConfig): Style { } case 'colAdapt': { style.layoutWidthType = 'colAdaptive' + const parentNodeWidthMap = {} + const nodeMaxWidthMap = {} + const quotaLabelMap = chart.yAxis?.reduce((p, n) => { + p[n.dataeaseName] = n.chartShowName || n.name + return p + }, {}) || {} + let calcCount = 50 + //只计算最后两层表头的宽度,采样 50 个数据 + style.colCfg.width = node => { + const spreadsheet = node.spreadsheet + const colHeaderTheme = spreadsheet.theme.colCell.bolderText + const padding = spreadsheet.theme.colCell.cell.padding + const paddingWidth = (padding?.left || 8) + (padding?.right || 8) + 12 + // 小计总计和第一层表头直接根据文本计算宽度 + if (node.isTotals || node.parent.id === 'root') { + let label = node.label + if (node.key === EXTRA_FIELD) { + label = quotaLabelMap[node.label] || label + } + const totalsWidth = spreadsheet.measureTextWidth(label, colHeaderTheme) + paddingWidth + return totalsWidth + } + + const parentWidth = parentNodeWidthMap[node.parent.id] + if (!parentWidth || (parentWidth && calcCount < 50)) { + const parentLabel = node.parent.label + const parentTextWidth = spreadsheet.measureTextWidth(parentLabel, colHeaderTheme) + paddingWidth + parentNodeWidthMap[node.parent.id] = parentTextWidth + const siblings = node.parent.children + const siblingsTextWidthMap = {} + const siblingsWidth = siblings.reduce((p, n) => { + let label = n.label + if (n.key === EXTRA_FIELD) { + label = quotaLabelMap[n.label] || label + } + const pureTextWidth = spreadsheet.measureTextWidth(label, colHeaderTheme) + if (n.key === EXTRA_FIELD) { + siblingsTextWidthMap[n.label] = pureTextWidth + } + calcCount++ + return p + pureTextWidth + paddingWidth + }, 0) + if (siblingsWidth < parentTextWidth) { + const offsetWidth = parentTextWidth - siblingsWidth + const expandOffsetWidth = offsetWidth / Object.keys(siblingsTextWidthMap).length + for (const key in siblingsTextWidthMap) { + const tmpWidth = siblingsTextWidthMap[key] + Math.ceil(expandOffsetWidth) + paddingWidth + const maxWidth = nodeMaxWidthMap[key] + if (!maxWidth || (maxWidth && tmpWidth > maxWidth)) { + nodeMaxWidthMap[key] = tmpWidth + } + } + } else { + for (const key in siblingsTextWidthMap) { + const tmpWidth = siblingsTextWidthMap[key] + paddingWidth + const maxWidth = nodeMaxWidthMap[key] + if (!maxWidth || (maxWidth && tmpWidth > maxWidth)) { + nodeMaxWidthMap[key] = tmpWidth + } + } + } + return nodeMaxWidthMap[node.label] + } else { + const fieldWidth = nodeMaxWidthMap[node.label] + if (fieldWidth) { + return fieldWidth + } + const textWidth = spreadsheet.measureTextWidth(node.label, colHeaderTheme) + paddingWidth + return textWidth + } + } break } // 查看详情用,均分铺满