From 45d028ff18b51efe3c4d59edbf21a644ad9b353c Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 9 Jan 2025 16:28:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E3=80=90=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E3=80=91=E6=95=B0=E6=8D=AE=E9=9B=86=E5=AF=BC=E5=87=BA=E8=BE=83?= =?UTF-8?q?=E5=A4=A7=E5=80=BC=E4=B8=BA=E7=A7=91=E5=AD=A6=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E6=B3=95=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=8F=8C=E5=87=BB=E5=90=8E?= =?UTF-8?q?=E5=8F=98=E4=B8=BA=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/server/ChartDataServer.java | 118 ++++++++++++++---- .../manage/ExportCenterManage.java | 22 ++-- .../extensions/view/dto/FormatterCfgDTO.java | 2 +- 3 files changed, 103 insertions(+), 39 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 5603738802..f36cbc8f59 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 @@ -35,7 +35,6 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -133,20 +132,6 @@ public class ChartDataServer implements ChartDataApi { request.setHeader(dsHeader); request.setExcelTypes(dsTypes); } - if (CollectionUtils.isNotEmpty(tableRow)) { - FormatterCfgDTO formatterCfgDTO = new FormatterCfgDTO(); - for (Object[] objects : tableRow) { - for (int i = 0; i < viewDTO.getXAxis().size(); i++) { - if (viewDTO.getXAxis().get(i).getDeType().equals(DeTypeConstants.DE_INT) || viewDTO.getXAxis().get(i).getDeType().equals(DeTypeConstants.DE_FLOAT)) { - try { - objects[i] = valueFormatter(new BigDecimal(String.valueOf(objects[i])), viewDTO.getXAxis().get(i).getFormatterCfg() == null ? formatterCfgDTO : viewDTO.getXAxis().get(i).getFormatterCfg()); - } catch (Exception ignore) { - ignore.printStackTrace(); - } - } - } - } - } request.setDetails(tableRow); request.setData(chartViewInfo.getData()); } catch (Exception e) { @@ -271,7 +256,7 @@ public class ChartDataServer implements ChartDataApi { details.add(0, request.getHeader()); ViewDetailField[] detailFields = request.getDetailFields(); Object[] header = request.getHeader(); - ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo().getXAxis(), wb); sheetIndex++; details.clear(); } @@ -285,7 +270,7 @@ public class ChartDataServer implements ChartDataApi { ViewDetailField[] detailFields = request.getDetailFields(); Object[] header = request.getHeader(); Sheet detailsSheet = wb.createSheet("数据"); - setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, null); } else { for (int i = 0; i < request.getMultiInfo().size(); i++) { ChartExcelRequestInner requestInner = request.getMultiInfo().get(i); @@ -295,7 +280,7 @@ public class ChartDataServer implements ChartDataApi { ViewDetailField[] detailFields = requestInner.getDetailFields(); Object[] header = requestInner.getHeader(); Sheet detailsSheet = wb.createSheet("数据 " + (i + 1)); - setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, null); } } } @@ -320,12 +305,25 @@ public class ChartDataServer implements ChartDataApi { public void innerExportDataSetDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception { this.innerExportDetails(request, response); } - public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List details, ViewDetailField[] detailFields, Integer[] excelTypes) { - setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes,null); + + public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List details, ViewDetailField[] detailFields, Integer[] excelTypes, List xAxis, Workbook wb) { + setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, xAxis, wb); } - public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List details, ViewDetailField[] detailFields, Integer[] excelTypes,Comment comment) { + public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List details, ViewDetailField[] detailFields, Integer[] excelTypes, Comment comment, List xAxis, Workbook wb) { + List styles = new ArrayList<>(); + if (xAxis != null) { + for (ChartViewFieldDTO xAxi : xAxis) { + if (xAxi.getDeType().equals(DeTypeConstants.DE_INT) || xAxi.getDeType().equals(DeTypeConstants.DE_FLOAT)) { + FormatterCfgDTO formatterCfgDTO = xAxi.getFormatterCfg() == null ? new FormatterCfgDTO() : xAxi.getFormatterCfg(); + CellStyle formatterCellStyle = createCellStyle(wb, formatterCfgDTO); + styles.add(formatterCellStyle); + } else { + styles.add(null); + } + } + } boolean mergeHead = false; if (ArrayUtils.isNotEmpty(detailFields)) { cellStyle.setBorderTop(BorderStyle.THIN); @@ -411,19 +409,91 @@ public class ChartDataServer implements ChartDataApi { detailsSheet.setColumnWidth(j, 255 * 20); } else if (cellValObj != null) { try { - cell.setCellValue(cellValObj.toString()); + if (xAxis != null && xAxis.get(j).getDeType().equals(DeTypeConstants.DE_INT) || xAxis.get(j).getDeType().equals(DeTypeConstants.DE_FLOAT)) { + try { + FormatterCfgDTO formatterCfgDTO = xAxis.get(j).getFormatterCfg() == null ? new FormatterCfgDTO() : xAxis.get(j).getFormatterCfg(); + if (formatterCfgDTO.getType().equalsIgnoreCase("auto")) { + + } + if (styles.get(j) != null) { + row.getCell(j).setCellStyle(styles.get(j)); + } + + row.getCell(j).setCellValue(Double.valueOf(cellValue(formatterCfgDTO, new BigDecimal(cellValObj.toString())))); + } catch (Exception e) { + cell.setCellValue(cellValObj.toString()); + } + } else { + cell.setCellValue(cellValObj.toString()); + } + } catch (Exception e) { LogUtil.warn("export excel data transform error"); } } - - } } } } } + private static String cellValue(FormatterCfgDTO formatterCfgDTO, BigDecimal value) { + if (formatterCfgDTO.getType().equalsIgnoreCase("percent")) { + return value.multiply(BigDecimal.valueOf(100)).toString(); + } else { + return value.divide(BigDecimal.valueOf(formatterCfgDTO.getUnit())).toString(); + } + } + + private static CellStyle createCellStyle(Workbook workbook, FormatterCfgDTO formatter) { + CellStyle cellStyle = workbook.createCellStyle(); + DataFormat format = workbook.createDataFormat(); + String formatStr = ""; + if (formatter.getType().equals("value")) { + if (formatter.getDecimalCount() > 0) { + formatStr = "0." + new String(new char[formatter.getDecimalCount()]).replace('\0', '0'); + } else { + formatStr = "0"; + } + switch (formatter.getUnit()) { + case 1000: + formatStr = formatStr + "千"; + break; + case 10000: + formatStr = formatStr + "万"; + break; + case 1000000: + formatStr = formatStr + "百万"; + break; + case 100000000: + formatStr = formatStr + "'亿'"; + break; + default: + break; + } + if (formatter.getThousandSeparator()) { + formatStr = "#,##" + formatStr; + } + if (StringUtils.isNotEmpty(formatter.getSuffix())) { + formatStr = formatStr + formatter.getSuffix(); + } + } else if (formatter.getType().equals("percent")) { + if (formatter.getDecimalCount() > 0) { + formatStr = "0." + new String(new char[formatter.getDecimalCount()]).replace('\0', '0'); + } else { + formatStr = "0"; + } + formatStr = formatStr + "%"; + } + if (StringUtils.isNotEmpty(formatStr)) { + cellStyle.setDataFormat(format.getFormat(formatStr)); + } else { + return null; + } + return cellStyle; + } + + @Override public List getFieldData(ChartViewDTO view, Long fieldId, String fieldType) throws Exception { return chartDataManage.getFieldData(view, fieldId, fieldType); diff --git a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java index f39f5dfac5..e19512537e 100644 --- a/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java +++ b/core/core-backend/src/main/java/io/dataease/exportCenter/manage/ExportCenterManage.java @@ -40,9 +40,7 @@ import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.factory.ProviderFactory; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.provider.Provider; -import io.dataease.extensions.view.dto.ChartViewDTO; -import io.dataease.extensions.view.dto.ColumnPermissionItem; -import io.dataease.extensions.view.dto.DatasetRowPermissionsTreeObj; +import io.dataease.extensions.view.dto.*; import io.dataease.i18n.Translator; import io.dataease.license.config.XpackInteract; import io.dataease.license.utils.LicenseUtil; @@ -411,11 +409,7 @@ public class ExportCenterManage implements BaseExportApi { exportTask.setExportStatus("IN_PROGRESS"); exportTaskMapper.updateById(exportTask); - getDataFillingApi().writeExcel(dataPath + "/" + exportTask.getId() + ".xlsx", - new DataFillFormTableDataRequest() - .setId(Long.parseLong(exportTask.getExportFrom())) - .setWithoutLogs(true) - , exportTask.getUserId(), Long.parseLong(request.get("org").toString())); + getDataFillingApi().writeExcel(dataPath + "/" + exportTask.getId() + ".xlsx", new DataFillFormTableDataRequest().setId(Long.parseLong(exportTask.getExportFrom())).setWithoutLogs(true), exportTask.getUserId(), Long.parseLong(request.get("org").toString())); exportTask.setExportProgress("100"); @@ -683,7 +677,7 @@ public class ExportCenterManage implements BaseExportApi { details.add(0, request.getHeader()); ViewDetailField[] detailFields = request.getDetailFields(); Object[] header = request.getHeader(); - ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo().getXAxis(), wb); sheetIndex++; details.clear(); exportTask.setExportStatus("IN_PROGRESS"); @@ -742,7 +736,7 @@ public class ExportCenterManage implements BaseExportApi { ViewDetailField[] detailFields = request.getDetailFields(); Object[] header = request.getHeader(); Sheet detailsSheet = wb.createSheet("数据"); - ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, null); } } else { //多个sheet @@ -756,7 +750,7 @@ public class ExportCenterManage implements BaseExportApi { Object[] header = requestInner.getHeader(); //明细sheet Sheet detailsSheet = wb.createSheet("数据 " + (i + 1)); - ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes); + ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, null); } } } @@ -801,15 +795,15 @@ public class ExportCenterManage implements BaseExportApi { } - public void addWatermarkTools(Workbook wb){ + public void addWatermarkTools(Workbook wb) { VisualizationWatermark watermark = watermarkMapper.selectById("system_default"); WatermarkContentDTO watermarkContent = JsonUtil.parseObject(watermark.getSettingContent(), WatermarkContentDTO.class); if (watermarkContent.getEnable() && watermarkContent.getExcelEnable()) { UserFormVO userInfo = visualizationMapper.queryInnerUserInfo(AuthUtils.getUser().getUserId()); // 在主逻辑中添加水印 - int watermarkPictureIdx = ExcelWatermarkUtils.addWatermarkImage(wb, watermarkContent,userInfo); // 生成水印图片并获取 ID + int watermarkPictureIdx = ExcelWatermarkUtils.addWatermarkImage(wb, watermarkContent, userInfo); // 生成水印图片并获取 ID for (Sheet sheet : wb) { - ExcelWatermarkUtils.addWatermarkToSheet(sheet,watermarkPictureIdx); // 为每个 Sheet 添加水印 + ExcelWatermarkUtils.addWatermarkToSheet(sheet, watermarkPictureIdx); // 为每个 Sheet 添加水印 } } } diff --git a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/FormatterCfgDTO.java b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/FormatterCfgDTO.java index 47fe03247b..aa8b1cb7be 100644 --- a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/FormatterCfgDTO.java +++ b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/FormatterCfgDTO.java @@ -10,6 +10,6 @@ public class FormatterCfgDTO { private String type = "auto"; // auto,value,percent private Integer unit = 1; // 换算单位 private String suffix = ""; // 单位后缀 - private Integer decimalCount = 2; // 小数位数 + private Integer decimalCount = 0; // 小数位数 private Boolean thousandSeparator = false; // 千分符 }