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