| docs/功能测试报告/功能测试报告_汇总表整数不显示0.00与列宽自适应_2026-09-04.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/汇总表母版数据体检与待决策清单_2026-09-04.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×ܱíÕûÊý²»ÏÔʾ0.00ÓëÁпí×ÔÊÊÓ¦_2026-09-04.md
New file @@ -0,0 +1,26 @@ # åè½æµè¯æ¥åï¼æ±æ»è¡¨æ´æ°ä¸æ¾ç¤º .00 ä¸å宽èªéåºï¼2026-09-04ï¼ ## åè½è¯´æ é对ãçæ_éè·¯è¿è¾éæ±æ»è¡¨ã两个ä½éªé®é¢ä¿®æ¹ï¼ä» å¨ ReportExportService.javaï¼ï¼ 1. æ°åæ¾ç¤ºï¼ä¿çâæ¾ç¤ºä¸¤ä½å°æ°ãåå¨å ¨ç²¾åº¦âçæ»ååï¼ä½æ´æ°å¼ä¸åæ¾ç¤º `.00`ï¼åå®ç°å¯¹âå ¬å¼ç»æä¸ºæ´æ°âçæ ¼ä¹ä¼å¥ 0.00ï¼æ¬æ¬¡è¡¥é½è·³è¿é»è¾ï¼ã 2. åå®½ï¼æ±æ»è¡¨æ´æ¬å¯¼åºåæåå æ ¼å 容èªå¨å 宽ï¼åªå 宽ä¸ç¼©çªï¼è·³è¿åå¹¶åå æ ¼æ é¢ï¼ä¸ææ 2 å宽估ç®ï¼åæ ¼è¶ å®½ææ¬å°é¡¶ 34ï¼å宽ä¸é 46ï¼é²æ¢é¿è¯´ææåæçï¼ã ## æµè¯ç¯å¢ - å端 8090ï¼éæ°ç¼è¯å¹¶éå¯ï¼æ°ä»£ç çæï¼ï¼MySQL 127.0.0.1:3308ã - æ¯çï¼docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼åºçº¿æä»¶ï¼docs/çææ±æ»å¤§è¡¨/çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼æ§ä»£ç 导åºï¼ã ## ç¨ä¾ä¸ç»æ | # | ç¨ä¾ | è¾å ¥/颿 | å®é | ç»è®º | |---|---|---|---|---| | 1 | æ±æ»è¡¨æ´æ°æ ¼ä¸å¸¦ .00ï¼æ£åï¼ | 2026-07 æ´æ¬å¯¼åºï¼æ´æ°æ ¼ä¸åè¢«å¥ 0.00 æ ·å¼ | æ´æ°ä¸ 0.00 æ ·å¼çæ ¼ç±æ§æä»¶ 972 å¤éè³ 34 å¤ï¼å©ä½ 34 å¤ä¸ºæ¯çæ¬èº«é¢è®¾ 0.00 æ ·å¼ï¼éæ¬æ¬¡å¯¼åºæ°å¢ï¼ï¼0.00 æ ·å¼æ»æ° 10588â9650 | PASS | | 2 | æ±æ»è¡¨å°æ°æ ¼ä»ä¸¤ä½æ¾ç¤ºãä¿çå ¨ç²¾åº¦ï¼æ£åï¼ | éæ´æ°æ ¼æ¾ç¤º 0.00ãæ°å¼ç²¾åº¦ä¸å | æ½æ¥ä¸å£å¾åæ B4=11204.5406 ç仿 0.00 æ¾ç¤ºä¸åå¨å ¨ç²¾åº¦ï¼éæ´æ°çº¯æ°å¼æ ¼æ éæ¼ï¼nonint-plain=0ï¼ | PASS | | 3 | å宽æå 容å å®½ï¼æ£åï¼ | å页ç¾å宽åªå¢ä¸å | ä¸å£å¾åæ B/D/Hãå叿±æ»ãè´§è¿éæåãåå¸åå¸å·ãç线å è½¦çæ½æ¥å宽åå 宽ï¼å¦è´§è¿éæå Q åæªè®¾å®½åº¦â21ãBâ21ï¼ï¼max 宽 36 以å | PASS | | 4 | ç¬ç«æ¥è¡¨åå½ï¼wycSplit 2026-07ï¼ | æ´æ°ä¸å¸¦ .00ãéæ´æ°å ¨é¨ 0.00 | æ´æ°ä¸ .00 æ ¼=0ï¼188 ä¸ªéæ´æ°æ ¼å ¨é¨ 0.00 æ¾ç¤º | PASS | | 5 | ç¼è¯ä¸å¯å¨åå½ | mvn compile EXIT=0ãå端éå¯å°±ç»ª | ç¼è¯ EXIT=0ï¼8090 å¯å¨ OK | PASS | ## åç°çé®é¢ä¸å¤ç½® 1. æ¯çèªèº«ä»æ 34 ä¸ªâæ´æ°æ ¼é¢è®¾ 0.00 æ ·å¼âï¼å±çå¼è®¾è®¡èé导åºäº§çï¼ï¼å¦éå½»åºå»æéæ¹æ¯çæ ·å¼ï¼æ¬æ¬¡ä¸å¨ã 2. æ±æ»è¡¨æ¯çå卿°æ®é®é¢ï¼7æå½æåéç¨ç´¯è®¡å¼ï¼æ¶å 5 个页ç¾ï¼ï¼å±æ°æ®å±é®é¢ãéæ¬æ¬¡æ ¼å¼ä¿®æ¹èå´ï¼å¦è§ãæ±æ»è¡¨æ¯çæ°æ®ä½æ£ä¸å¾ å³çæ¸ å_2026-09-04.mdãã ## ç»è®º 两项修æ¹éè¿æµè¯ï¼æ´æ°ä¸åæ¾ç¤º .00ï¼æ±æ»è¡¨å¯¼åºåå宽æå 容èªéåºå 宽ï¼éæ´æ°æ ¼ä»æ¾ç¤ºä¸¤ä½å°æ°å¹¶ä¿çå ¨ç²¾åº¦ã docs/Éú³É»ã×Ü´ó±í/»ã×ܱíĸ°æÊý¾ÝÌå¼ìÓë´ý¾ö²ßÇåµ¥_2026-09-04.md
New file @@ -0,0 +1,26 @@ # æ±æ»è¡¨æ¯çæ°æ®ä½æ£ä¸å¾ å³çæ¸ åï¼2026-09-04ï¼ > ç»è®ºå è¡ï¼å½åâçæ_éè·¯è¿è¾éæ±æ»è¡¨ = æ´æ¬å¤å¶æ¯çâãæ¬æ¬¡ä½æ£åç°çé®é¢ç»å¤§å¤æ°**åå¨äºæ¯çæä»¶æ¬èº«ï¼æ°æ®å±ï¼**ï¼ä¸æ¯å¯¼åºç¨åºæå®ç®éãæ¯çæä»¶ï¼docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxã ## ä¸ã已确认é®é¢ï¼å½æåéç¨ç´¯è®¡å¼ï¼ æ¯çä¸ä»¥ä¸ 5 个æå页çâ7æå½æâæ°æ®åï¼è¢«å¤å¶æäºâ1-7æç´¯è®¡âæ°æ®åï¼æ°å¼ãåæ¯å ¨é¨ç¸åï¼ï¼ | é¡µç¾ | 累计å | 彿å(é误) | ç¤ºä¾ | 7æå½æåºçº¦ä¸º | |---|---|---|---|---| | ä¸å£å¾åæ | r3-r7 | r12-r16 | æ»å®¢è¿é 27524.49 | â4028ï¼ç线 1631.20ï¼å ¬äº¤å乡 1466.66ï¼åºç§å乡 509.00ï¼ç½çº¦è½¦å乡 421.46ï¼åå 2026-07 åºå /æåå¼ï¼ | | å叿±æ» | r3-r9 | r14-r20 | æ»å®¢è¿é 237412.33 | â35465ï¼å ¬äº¤ 12974.73ï¼å·¡æ¸¸åºç§ 5860.24ï¼ç½çº¦è½¦ 4852.30ï¼è½¨é 11731.83ï¼è½®æ¸¡ 46.05ï¼ | | åå¸åå¸å· | r5 èµ· | r50 èµ· | å ¨çæ»å®¢è¿é 237412.33 | åå叿±æ»åæå£å¾ | | è´§è¿éæå | r4-r21 | r25-⦠| å ¨çè§ä¸ 27734.461 | 7æåæï¼è¿å°äº 1-7 ç´¯è®¡ï¼ | | è´§è¿å¨è½¬éæå | r5 èµ· | r27 èµ· | å ¨çè§ä¸å¨è½¬é 4357157.34 | 7æåæ | è¿å¸¦å½±åï¼å½æåçâ忝ââæåââå æ¯âä¹éé误å¼ä¸å¹¶éï¼å¦ä¸å£å¾åæ C12/G12 å C3/G3ï¼ç¨ç齿¯ç´¯è®¡åæ¯ï¼ã ## äºãå ¶ä»éè¦ä½ ææ¿/çæçé®é¢ 1. æ°æ®æºç¼ºå£ï¼å½±åâç¨åºèªå¨çæ 1-7 累计âï¼ï¼åºå h2031 ä¼ä¸ææ¥åªæ 2026-03ã2026-07ï¼åå¸å ¬äº¤/巡游åºç§åªæ 2026-06ã2026-07ï¼ä¸ªä½å®¢è¿åªæ 2026-07ãå½åå¯ä¸å®æ´ç 1-7 åæå£å¾ä¾æ®æ¯æ¯çå°è´¦é¡µæ¬èº«ã 2. ç½çº¦è½¦æåº¦æåè¾å ¥ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãç®ååªæ 2026-07 ä¸è¡ï¼1-6 æç½çº¦è½¦åææ æ³ç±ç¨åºèªå¨è®¡ç®ã 3. æ¯çå ¶å®éçï¼å³ä¾§å¤§é 2024/æ´æ©åèåä¸ `#REF!` æé¾ï¼å·²ç¥å¤ç项ï¼ï¼é¡µç¾é´å ¬å¼å¼ç¨ä¸â空æ¯çå¡«å¼âæ¹æ¡ä»æ P2 è½å°æ¹æ¡æ¨è¿ï¼è¡åè¾¹çãæä»½æ©å±ã2024 åå¤çã轨éè½®æ¸¡å ¥åºãè¾åºç®å½äºé¡¹å¾ ææ¿ï¼ã ## ä¸ãä¿®å¤æ¹å建议ï¼è¯·éæ©/ç¡®è®¤ï¼ - æ¹æ¡ Aï¼ç平快ï¼ä» æ¬ææ£ç¡®ï¼ï¼æä¸è¡¨ææ¯ç 5 个页ç¾çâ7æå½æåâç¨ 7 æå½æåºå¼/æåç»ææ¹æ£ç¡®ï¼æ¬æ¬¡çæå³æ£ç¡®ï¼ä»¥åæ¯ææ¯çä»é人工ä¿è¯å½æåæ£ç¡®ã - æ¹æ¡ Bï¼æ ¹æ²»ï¼æ¨èåç» P2 å®ç°ï¼ï¼å¯¼åºæ¶ä¸åä¿¡ä»»æ¯ç彿åï¼æ¹ä¸ºâå°è´¦é¡µï¼ä¿ç 1-7 åæï¼ï¼å½æåºå¼ï¼ç½çº¦è½¦æåè¾å ¥âèªå¨éç®æå页彿åï¼ç´¯è®¡åä¸å°è´¦é¡µä¸è´æ§ä¹å¯å å ¥çæåèªå¨æ ¡éªã - å å A 顶使¬ææµè¯ï¼åææå 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()) {