背景(用户报障):把《湖北网络预约出租汽车2025年09月分析报告.docx》放到桌面后用「网约车订单报告」导入,一直失败。
定位结论:该文件**不是真正的 docx**。它是 Word 2003 XML(WordML 平铺 XML,单文件)被改名成了 .docx:
- 文件头是 <?xml version="1.0" ...?> <?mso-application progid="Word.Document"?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" ...>
- 3.1MB 纯 XML,**不是 zip 包**;POI 的 XWPFDocument 只能读 OPC(zip) 包,于是抛 File is not a zip file。
- 这类文件是 WPS/Word「Word 2003 XML 文档」格式,网约车监管平台/同事之间流转很常见,会反复出现。
改动:traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
importWycOrderReport() 入口先按文件头嗅探格式,再分派:PK 开头 → docx(zip):原 XWPFDocument 路径;<w:wordDocument + wordml → WordML 平铺 XML:新增解析路径;D0CF11E0 → OLE2 老 .doc:给出「请另存为 docx」的明确提示;isWordPackage():zip 但包内没有 word/document.xml(如 xlsx 改名)时,直接提示「这不是 Word 文档……多半是 Excel 或其它格式」,不再抛出 XMLBeans 的英文堆栈。parseXmlSafely():DOM 解析并**关闭外部实体/DTD**(报告来自外部平台,防 XXE)。matchWycOrderTable(tables, orders, sumHolder):XWPFTable 文本化后调用;<w:tbl>/<w:tr>/<w:tc> 文本化后调用;periodOfParagraphs(List<String>),两种格式共用(标题 网约车行业YYYY年M月 优先,取不到回退「前 10 段任意 YYYY年M月」)。mvn -o compile 后重启,加载新类;启动日志 Started TrafficAuditApplication);数据库 traffic_audit(127.0.0.1:3308)。POST /api/import/wycOrderReport(file + period,period 可为空 → 由报告标题推断)。D:\桌面\湖北网络预约出租汽车2025年09月分析报告.docx(WordML,3,145,560 字节);D:\05_数据分类\城市客运\8月\湖北网络预约出租汽车2026年08月分析报告0910最终版.docx(真 docx)。_tmp/_qa_out/(命令输出见本报告表格;数据核对见 _wyc_2025_09_row.txt)。| 编号 | 类型 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| 1 | 正向 | WordML「2025年09月」报告,period=2025-09 |
解析出 17 市州订单,写入 2025-09 | 导入成功:报表期 2025-09,订单合计 17,652,159 单,已写入 17 个市州 |
通过 |
| 2 | 正向 | 同上,period= 留空 |
由标题 网约车行业2025年9月 推断出 2025-09 |
报表期 2025-09,结果与用例 1 一致 | 通过 |
| 3 | 正向 | 真 docx「2026年08月」报告重导 | 与库内既有值一致(幂等,不改变结果) | 订单合计 30,508,652、武汉 11,550,551,与导入前完全相同 | 通过 |
| 4 | 正向 | 2026年06月报告 | 订单合计 = 报告正文「全省订单总数 2684.30 万单」 | 库内 2026-06 = 26,843,037 | 通过 |
| 5 | 负向 | .doc(OLE2 复合文档,Word 97-2003) |
明确提示改用 docx | 这是 Word 97-2003 老格式(.doc),请用 WPS/Word 打开后「另存为」docx 格式再导入 |
通过 |
| 6 | 负向 | xlsx 改名成 .docx 上传 |
明确提示不是 Word | 这不是 Word 文档(压缩包里没有 word/document.xml),多半是 Excel 或其它格式…… |
通过 |
| 7 | 负向 | 非网约车报告的 docx(《投资表之间的关系.docx》) | 提示未解析到订单数 | 未解析到任何市州订单数,请确认上传的是《网约车行业YYYY年M月运行监测情况分析报告》 |
通过 |
| 8 | 边界 | WordML 中表格含 16 列、表头在第 1 行、市州名用简称(武汉/林区) |
简称能映射到规范名(武汉市/神农架林区) | 17 市州全部识别,无缺失 | 通过 |
入库抽查(报表期 2025-09,与报告附件1逐项对齐)
| 项 | 报告附件1 | 库内 wyc_order_monthly |
结论 |
|---|---|---|---|
| 订单合计 | 17,652,159 | 17,652,159 | 一致 |
| 武汉 | 8,076,610 | 8,076,610 | 一致 |
| 黄石 | 676,644 | 676,644 | 一致 |
| 十堰 | 1,048,593 | 1,048,593 | 一致 |
| 恩施 | 804,736 | 804,736 | 一致 |
| 神农架林区 | 1,424 | 1,424 | 一致 |
| 全省 pin(B~E) | 报告无 | 2794.31 / 2522.54 / 16394.73 / 12998.74(从 wyc_total_monthly 同期复制) |
符合设计 |
org.apache.xmlbeans.XmlException: Element workbook@... is not a valid document@...。已改为中文业务提示。docs/功能测试报告/ 下已归档本报告。