fix: 【数据集】数据集导出较大值为科学计数法显示,双击后变为文本

This commit is contained in:
taojinlong
2025-01-09 16:28:20 +08:00
committed by xuwei-fit2cloud
parent 98372322f2
commit 45d028ff18
3 changed files with 103 additions and 39 deletions

View File

@@ -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<Object[]> details, ViewDetailField[] detailFields, Integer[] excelTypes) {
setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes,null);
public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List<Object[]> details, ViewDetailField[] detailFields, Integer[] excelTypes, List<ChartViewFieldDTO> xAxis, Workbook wb) {
setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, null, xAxis, wb);
}
public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List<Object[]> details, ViewDetailField[] detailFields, Integer[] excelTypes,Comment comment) {
public static void setExcelData(Sheet detailsSheet, CellStyle cellStyle, Object[] header, List<Object[]> details, ViewDetailField[] detailFields, Integer[] excelTypes, Comment comment, List<ChartViewFieldDTO> xAxis, Workbook wb) {
List<CellStyle> 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<String> getFieldData(ChartViewDTO view, Long fieldId, String fieldType) throws Exception {
return chartDataManage.getFieldData(view, fieldId, fieldType);

View File

@@ -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 添加水印
}
}
}

View File

@@ -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; // 千分符
}