fix: 【嵌入式】iframe嵌入的汇总表做了下钻后导出 excel 缺失表头

This commit is contained in:
tjlygdx
2026-05-18 15:30:20 +08:00
parent 894d04609a
commit 00087fe8e3
3 changed files with 47 additions and 32 deletions

View File

@@ -300,21 +300,9 @@ public class ChartDataServer implements ChartDataApi {
detailsSheet = wb.createSheet("数据" + sheetIndex);
Integer[] excelTypes = request.getExcelTypes();
List<ChartViewFieldDTO> 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<Integer> columnIndexs = new ArrayList<>();
for (int i1 = 0; i1 < xAxis.size(); i1++) {
ChartViewFieldDTO xAxi = xAxis.get(i1);
if (xAxi.isHide()) {
columnIndexs.add(i1);
}
}
List<Integer> 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<ChartViewFieldDTO> resolveExportFields(ChartViewDTO viewInfo, Object[] header) {
public static List<ChartViewFieldDTO> resolveExportFields(ChartViewDTO viewInfo, Object[] header) {
List<ChartViewFieldDTO> 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<ChartViewFieldDTO> exportFields = resolveExportFields(viewInfo, header);
if (CollectionUtils.isEmpty(exportFields)) {
return header;
}
Set<String> 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<Integer> getHiddenExportColumnIndexes(Object[] header, ChartViewDTO viewInfo) {
List<ChartViewFieldDTO> exportFields = resolveExportFields(viewInfo, header);
List<Integer> 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<ChartViewFieldDTO> target, List<ChartViewFieldDTO> source) {
if (CollectionUtils.isNotEmpty(source)) {
target.addAll(source);

View File

@@ -519,23 +519,9 @@ public class ExportCenterDownLoadManage {
detailsSheet = wb.createSheet("数据" + sheetIndex);
Integer[] excelTypes = request.getExcelTypes();
ViewDetailField[] detailFields = request.getDetailFields();
Object[] header = request.getHeader();
List<ChartViewFieldDTO> 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<Integer> columnIndexs = new ArrayList<>();
for (int i1 = 0; i1 < xAxis.size(); i1++) {
ChartViewFieldDTO xAxi = xAxis.get(i1);
if (xAxi.isHide()) {
columnIndexs.add(i1);
}
}
List<Integer> 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 {
}
}
}

View File

@@ -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<String, Object> 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 -> {