From bd11a99ec7fc4b78987aba366fc1071acf97bcd1 Mon Sep 17 00:00:00 2001 From: wisonic Date: Mon, 11 Aug 2025 20:59:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E8=A1=A8=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E4=B9=8B=E5=90=8E=E5=AF=BC=E5=87=BA=E7=9A=84=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=B2=A1=E6=9C=89=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=20#16589?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/server/ChartDataServer.java | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java index 8605ec7695..330d70a742 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java +++ b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java @@ -262,7 +262,6 @@ public class ChartDataServer implements ChartDataApi { if ((details.size() + extractPageSize) > sheetLimit || i == chartViewDTO.getTotalPage()) { detailsSheet = wb.createSheet("数据" + sheetIndex); Integer[] excelTypes = request.getExcelTypes(); - Object[] header = request.getHeader(); request.getViewInfo().setXAxis(request.getViewInfo().getXAxis().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList())); request.getViewInfo().setYAxis(request.getViewInfo().getYAxis().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList())); request.getViewInfo().setXAxisExt(request.getViewInfo().getXAxisExt().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList())); @@ -274,7 +273,7 @@ public class ChartDataServer implements ChartDataApi { xAxis.addAll(request.getViewInfo().getXAxisExt()); xAxis.addAll(request.getViewInfo().getYAxisExt()); xAxis.addAll(request.getViewInfo().getExtStack()); - header = Arrays.stream(request.getHeader()).filter(item -> xAxis.stream().map(d -> StringUtils.isNotBlank(d.getChartShowName()) ? d.getChartShowName() : d.getName()).toList().contains(item)).collect(Collectors.toList()).toArray(); + Object[] header = Arrays.stream(request.getHeader()).filter(item -> xAxis.stream().map(d -> StringUtils.isNotBlank(d.getChartShowName()) ? d.getChartShowName() : d.getName()).toList().contains(item)).collect(Collectors.toList()).toArray(); details.add(0, header); ViewDetailField[] detailFields = request.getDetailFields(); ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb); @@ -347,6 +346,7 @@ public class ChartDataServer implements ChartDataApi { xAxis.addAll(viewInfo.getDrillFields()); TableHeader tableHeader = null; Integer totalDepth = 0; + List mergeConfig = new ArrayList<>(); if (StringUtils.equalsAnyIgnoreCase(viewInfo.getType(), "table-normal", "table-info")) { for (ChartViewFieldDTO xAxi : xAxis) { if (xAxi.getDeType().equals(DeTypeConstants.DE_INT) || xAxi.getDeType().equals(DeTypeConstants.DE_FLOAT)) { @@ -376,6 +376,22 @@ public class ChartDataServer implements ChartDataApi { } } } + if ("table-info".equalsIgnoreCase(viewInfo.getType()) && !"dataset".equalsIgnoreCase(viewInfo.getDownloadType())) { + Map tableCell = (Map) viewInfo.getCustomAttr().get("tableCell"); + Boolean mergeCells = (Boolean) tableCell.get("mergeCells"); + if (mergeCells != null && mergeCells) { + var quotaIndex = 0; + for (int i = 0; i < viewInfo.getXAxis().size(); i++) { + if ("q".equalsIgnoreCase(viewInfo.getXAxis().get(i).getGroupType())) { + quotaIndex = i; + break; + } + } + if (quotaIndex >= 1 && details.size() > 1) { + mergeConfig = getMergeConfig(details.subList(1, details.size()), quotaIndex - 1, totalDepth == 0 ? 1 : totalDepth); + } + } + } } boolean mergeHead = false; @@ -522,9 +538,47 @@ public class ChartDataServer implements ChartDataApi { } } } + if (CollectionUtils.isNotEmpty(mergeConfig)) { + mergeConfig.forEach(detailsSheet::addMergedRegion); + } } } + private static List getMergeConfig(List data, int colIndex, int offsetHeight) { + var result = new ArrayList(); + var preRange = new ArrayList(); + var initRange = new Integer[]{0, data.size() - 1}; + preRange.add(initRange); + for (int curColIndex = 0; curColIndex <= colIndex; curColIndex++) { + var curRange = new ArrayList(); + for (int preRangeIndex = 0; preRangeIndex < preRange.size(); preRangeIndex++) { + var preRowRange = preRange.get(preRangeIndex); + var start = preRowRange[0]; + var end = preRowRange[1]; + var lastColValue = data.get(start)[curColIndex].toString(); + var lastRowIndex = start; + for (Integer curRowIndex = start + 1; curRowIndex <= end; curRowIndex++) { + var curRow = data.get(curRowIndex); + var curColValue = curRow[curColIndex].toString(); + if (!StringUtils.equals(lastColValue, curColValue) && (curRowIndex - lastRowIndex > 1)) { + curRange.add(new Integer[]{lastRowIndex, curRowIndex - 1}); + result.add(new CellRangeAddress(lastRowIndex + offsetHeight, curRowIndex + offsetHeight - 1, curColIndex, curColIndex)); + } + if (curRowIndex.equals(end) && curColValue.equals(lastColValue) && curRowIndex - lastRowIndex > 0) { + curRange.add(new Integer[]{lastRowIndex, curRowIndex}); + result.add(new CellRangeAddress(lastRowIndex + offsetHeight, curRowIndex + offsetHeight, curColIndex, curColIndex)); + } + if (!StringUtils.equals(lastColValue, curColValue)) { + lastColValue = curColValue; + lastRowIndex = curRowIndex; + } + } + } + preRange = curRange; + } + return result; + } + private static boolean validateHeaderGroup(TableHeader header, List fields) { if (header == null) { return false;