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 6cd202c0f5..130ec63ca9 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 @@ -300,21 +300,9 @@ public class ChartDataServer implements ChartDataApi { detailsSheet = wb.createSheet("数据" + sheetIndex); Integer[] excelTypes = request.getExcelTypes(); - List xAxis = new ArrayList<>(); - xAxis.addAll(request.getViewInfo().getXAxis()); - xAxis.addAll(request.getViewInfo().getYAxis()); - xAxis.addAll(request.getViewInfo().getXAxisExt()); - xAxis.addAll(request.getViewInfo().getYAxisExt()); - xAxis.addAll(request.getViewInfo().getExtStack()); - 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(); + Object[] header = filterExportHeader(request.getHeader(), request.getViewInfo()); details.add(0, header); - List columnIndexs = new ArrayList<>(); - for (int i1 = 0; i1 < xAxis.size(); i1++) { - ChartViewFieldDTO xAxi = xAxis.get(i1); - if (xAxi.isHide()) { - columnIndexs.add(i1); - } - } + List columnIndexs = getHiddenExportColumnIndexes(header, request.getViewInfo()); ExportCenterDownLoadManage.removeColumn(details, columnIndexs); ViewDetailField[] detailFields = request.getDetailFields(); ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb); @@ -591,7 +579,7 @@ public class ChartDataServer implements ChartDataApi { } } - static List resolveExportFields(ChartViewDTO viewInfo, Object[] header) { + public static List resolveExportFields(ChartViewDTO viewInfo, Object[] header) { List fields = new ArrayList<>(); if (viewInfo != null && viewInfo.getData() != null && viewInfo.getData().get("fields") != null) { Object fieldsObj = viewInfo.getData().get("fields"); @@ -628,6 +616,29 @@ public class ChartDataServer implements ChartDataApi { return CollectionUtils.isNotEmpty(orderedFields) ? orderedFields : fields; } + public static Object[] filterExportHeader(Object[] header, ChartViewDTO viewInfo) { + if (ArrayUtils.isEmpty(header)) { + return ArrayUtils.EMPTY_OBJECT_ARRAY; + } + List exportFields = resolveExportFields(viewInfo, header); + if (CollectionUtils.isEmpty(exportFields)) { + return header; + } + Set exportFieldNames = exportFields.stream().map(ChartDataServer::getExportFieldName).collect(Collectors.toSet()); + return Arrays.stream(header).filter(Objects::nonNull).filter(item -> exportFieldNames.contains(item.toString())).toArray(); + } + + public static List getHiddenExportColumnIndexes(Object[] header, ChartViewDTO viewInfo) { + List exportFields = resolveExportFields(viewInfo, header); + List columnIndexs = new ArrayList<>(); + for (int i = 0; i < exportFields.size(); i++) { + if (exportFields.get(i).isHide()) { + columnIndexs.add(i); + } + } + return columnIndexs; + } + private static void appendFields(List target, List source) { if (CollectionUtils.isNotEmpty(source)) { target.addAll(source); diff --git a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterDownLoadManage.java b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterDownLoadManage.java index 4532b0aeb5..7324801193 100644 --- a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterDownLoadManage.java +++ b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterDownLoadManage.java @@ -519,23 +519,9 @@ public class ExportCenterDownLoadManage { detailsSheet = wb.createSheet("数据" + sheetIndex); Integer[] excelTypes = request.getExcelTypes(); ViewDetailField[] detailFields = request.getDetailFields(); - Object[] header = request.getHeader(); - List xAxis = new ArrayList<>(); - xAxis.addAll(request.getViewInfo().getXAxis()); - xAxis.addAll(request.getViewInfo().getYAxis()); - xAxis.addAll(request.getViewInfo().getXAxisExt()); - xAxis.addAll(request.getViewInfo().getYAxisExt()); - xAxis.addAll(request.getViewInfo().getExtStack()); - xAxis.addAll(request.getViewInfo().getDrillFields()); - header = Arrays.stream(request.getHeader()).filter(item -> xAxis.stream().map(d -> StringUtils.isNotBlank(d.getChartShowName()) ? d.getChartShowName() : d.getName()).toList().contains(item)).toArray(); + Object[] header = ChartDataServer.filterExportHeader(request.getHeader(), request.getViewInfo()); details.add(0, header); - List columnIndexs = new ArrayList<>(); - for (int i1 = 0; i1 < xAxis.size(); i1++) { - ChartViewFieldDTO xAxi = xAxis.get(i1); - if (xAxi.isHide()) { - columnIndexs.add(i1); - } - } + List columnIndexs = ChartDataServer.getHiddenExportColumnIndexes(header, request.getViewInfo()); removeColumn(details, columnIndexs); ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb); sheetIndex++; @@ -876,4 +862,3 @@ public class ExportCenterDownLoadManage { } } } - diff --git a/core/core-backend/src/test/java/io/dataease/chart/server/ChartDataServerTest.java b/core/core-backend/src/test/java/io/dataease/chart/server/ChartDataServerTest.java index ce1ce24fc4..a50f044ef6 100644 --- a/core/core-backend/src/test/java/io/dataease/chart/server/ChartDataServerTest.java +++ b/core/core-backend/src/test/java/io/dataease/chart/server/ChartDataServerTest.java @@ -135,6 +135,25 @@ public class ChartDataServerTest { } } + @Test + public void filterExportHeaderUsesCurrentDrillFieldsInsteadOfStaleViewAxes() { + ChartViewFieldDTO province = field("province", "省份", DeTypeConstants.DE_STRING); + ChartViewFieldDTO amount = field("amount", "销售额", DeTypeConstants.DE_FLOAT); + ChartViewFieldDTO city = field("city", "城市", DeTypeConstants.DE_STRING); + + ChartViewDTO view = new ChartViewDTO(); + view.setXAxis(new ArrayList<>(Arrays.asList(province, amount))); + view.setDrillFields(new ArrayList<>(List.of(city))); + + Map data = new HashMap<>(); + data.put("fields", new ArrayList<>(Arrays.asList(province, city, amount))); + view.setData(data); + + Object[] header = ChartDataServer.filterExportHeader(new Object[]{"省份", "城市", "销售额"}, view); + + assertEquals(Arrays.asList("省份", "城市", "销售额"), Arrays.asList(header)); + } + private ChartDataServer chartDataServerWithExportLimits(Long viewLimit, Long datasetLimit) throws Exception { ChartDataManage chartDataManage = mock(ChartDataManage.class); when(chartDataManage.calcData(any(ChartViewDTO.class))).thenAnswer(invocation -> {