From 8b26ddc890916d904df1ff8d56ae94e2a4634367 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 04 九月 2026 09:45:04 +0800
Subject: [PATCH] fix: 汇总表整数不再显示 .00(公式整数格同跳过)+ 导出列宽按内容自适应 + 09-04 测试报告与母版数据体检清单
---
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 65 ++++++++++++++++++++++++++++++++
1 files changed, 64 insertions(+), 1 deletions(-)
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
index b52289d..b1b1566 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3208,6 +3208,8 @@
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
dynamicSummaryYear(wb, year);
+ applyTwoDecimalFormat(wb);
+ autoFitContentColumns(wb); // 姹囨�昏〃瀵煎嚭鍚庢寜鍐呭鍔犲鍒楀锛堝彧鍔犲涓嶇缉绐勶級
return toBytes(wb);
}
}
@@ -4574,7 +4576,13 @@
CellType ct = cell.getCellType();
if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue;
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue;
- if (ct == CellType.NUMERIC && Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue()) continue;
+ boolean integral = false;
+ if (ct == CellType.NUMERIC) {
+ integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
+ } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) {
+ integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
+ }
+ if (integral) continue; // 鏁存暟涓嶆樉绀� .00锛堝惈鍏紡缁撴灉涓烘暣鏁扮殑鏍硷級
org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle();
if (cs == null) continue;
String f = cs.getDataFormatString();
@@ -4595,6 +4603,61 @@
}
}
+ /** 姹囨�昏〃瀵煎嚭鍚庢寜鍐呭鑷姩鍔犲鍒楀锛堝彧鍔犲涓嶇缉绐勶紱璺宠繃鍚堝苟鍗曞厓鏍兼爣棰橈紝闃查暱鏍囬鎶婂崟鍒楁拺鐖嗭級 */
+ private void autoFitContentColumns(org.apache.poi.ss.usermodel.Workbook wb) {
+ if (wb == null) return;
+ org.apache.poi.ss.usermodel.DataFormatter dfmt = new org.apache.poi.ss.usermodel.DataFormatter();
+ for (int s = 0; s < wb.getNumberOfSheets(); s++) {
+ org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(s);
+ if (sh == null) continue;
+ java.util.Set<String> merged = new java.util.HashSet<>();
+ for (org.apache.poi.ss.util.CellRangeAddress ra : sh.getMergedRegions()) {
+ for (int r = ra.getFirstRow(); r <= ra.getLastRow(); r++) {
+ for (int c = ra.getFirstColumn(); c <= ra.getLastColumn(); c++) {
+ merged.add(r + ":" + c);
+ }
+ }
+ }
+ int maxCol = -1;
+ for (org.apache.poi.ss.usermodel.Row row : sh) {
+ if (row == null) continue;
+ maxCol = Math.max(maxCol, (int) row.getLastCellNum() - 1);
+ }
+ if (maxCol < 0) continue;
+ int[] need = new int[maxCol + 1];
+ for (org.apache.poi.ss.usermodel.Row row : sh) {
+ if (row == null) continue;
+ for (org.apache.poi.ss.usermodel.Cell cell : row) {
+ int c = cell.getColumnIndex();
+ if (c > maxCol || merged.contains(row.getRowNum() + ":" + c)) continue;
+ String txt;
+ try {
+ txt = dfmt.formatCellValue(cell);
+ } catch (Exception ignore) {
+ continue;
+ }
+ if (txt == null || txt.isEmpty()) continue;
+ int units = 0;
+ for (int i = 0; i < txt.length(); i++) {
+ units += isWideChar(txt.charAt(i)) ? 2 : 1;
+ }
+ if (units > need[c]) need[c] = Math.min(units, 34); // 闀挎枃鏈笉鎶婂崟鍒楁拺鐖�
+ }
+ }
+ for (int c = 0; c <= maxCol; c++) {
+ if (need[c] <= 0) continue;
+ int target = Math.min(need[c] + 2, 46) * 256;
+ if (target > sh.getColumnWidth(c)) sh.setColumnWidth(c, target);
+ }
+ }
+ }
+
+ /** CJK / 鍏ㄨ瀛楃鎸変袱鍊嶅搴﹁锛堣繎浼� Excel 鏄剧ず鍒楀锛� */
+ private boolean isWideChar(char ch) {
+ return (ch >= 0x2E80 && ch <= 0x9FFF) || (ch >= 0xF900 && ch <= 0xFAFF)
+ || (ch >= 0xFF00 && ch <= 0xFFEF);
+ }
+
private byte[] toBytes(XSSFWorkbook wb) throws Exception {
applyTwoDecimalFormat(wb);
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
--
Gitblit v1.9.1