政府项目里Word文档的表格怎么读进系统——POI双格式解析
政府项目里Word文档的表格怎么读进系统——Apache POI双格式解析项目申报书、评审表、统计数据——政府项目里大量数据以Word表格的形式存在。手工录入费时还容易错。这篇文章记录了一个同时支持 .doc 和 .docx 的Word表格提取器三行调用把所有表格读进List直接对接数据库入库。文章目录政府项目里Word文档的表格怎么读进系统——Apache POI双格式解析一、为什么需要解析Word表格二、解析docx——新格式三、解析doc——旧格式多了一个坑四、统一入口——自动判断格式五、从表格到数据库六、结语一、为什么需要解析Word表格政务项目里外部数据常常长这样项目申报书申报单位信息、预算明细、人员名单——全在Word表格里评审意见表十几位专家的打分表每位专家一个Word文档统计数据上级部门下发的统计报表Word格式几百行数据这些数据如果手工录进系统一个申报书几十个字段录错了还得返工。最省事的办法——写一个工具类把Word里的表格直接解析成结构化的数据再批量入库。二、解析docx——新格式importorg.apache.poi.xwpf.usermodel.XWPFDocument;importorg.apache.poi.xwpf.usermodel.XWPFTable;importorg.apache.poi.xwpf.usermodel.XWPFTableCell;importorg.apache.poi.xwpf.usermodel.XWPFTableRow;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;publicstaticListArrayListArrayListStringdocx(InputStreamfis){ListArrayListArrayListStringtablesnewArrayList();try{XWPFDocumentdocumentnewXWPFDocument(fis);ListXWPFTabletlistdocument.getTables();for(XWPFTableobj:tlist){ListXWPFTableRowrowsobj.getRows();ArrayListArrayListStringtablenewArrayList();for(XWPFTableRowrow:rows){ListXWPFTableCellcellsrow.getTableCells();ArrayListStringrnewArrayList();for(XWPFTableCellcell:cells){r.add(cell.getText());}table.add(r);}tables.add(table);}fis.close();}catch(IOExceptione){e.printStackTrace();}returntables;}三层循环表→行→单元格。每层把数据塞进一个ArrayList最终返回List表行单元格文本。这个嵌套结构调用方用起来很直观——取第一个表第3行第2列tables.get(0).get(2).get(1)。三、解析doc——旧格式多了一个坑importorg.apache.poi.hwpf.HWPFDocument;importorg.apache.poi.hwpf.usermodel.*;importorg.apache.poi.poifs.filesystem.POIFSFileSystem;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;publicstaticListArrayListArrayListStringdoc(InputStreamfis){ListArrayListArrayListStringtablesnewArrayList();try{POIFSFileSystempfsnewPOIFSFileSystem(fis);HWPFDocumentdocumentnewHWPFDocument(pfs);Rangerangedocument.getRange();TableIteratoritnewTableIterator(range);while(it.hasNext()){Tabletb(Table)it.next();ArrayListArrayListStringtablenewArrayList();for(inti0;itb.numRows();i){TableRowtrtb.getRow(i);ArrayListStringrnewArrayList();for(intj0;jtr.numCells();j){TableCelltdtr.getCell(j);Stringtext;// 单元格内可能有多个段落for(intk0;ktd.numParagraphs();k){Paragraphparatd.getParagraph(k);Stringspara.text();// 去除段落末尾的控制字符if(null!s!.equals(s)){ss.substring(0,s.length()-1);}texts;}r.add(text);}table.add(r);}tables.add(table);}fis.close();}catch(IOExceptione){e.printStackTrace();}returntables;}.doc格式比.docx复杂两处第一表格遍历方式不同。.docx直接document.getTables()返回所有表格。.doc要先获取Range再用TableIterator遍历——API设计年代更早不够直观。第二也是最关键的——段落末尾的控制字符。.doc格式里每个段落的文本末尾有一个不可见控制字符。直接用para.text()取出来的字符串尾巴上带着这个字符——入库后字段值后面多一个乱码比对了半天不知道差在哪。所以第87行这一刀是必须的ss.substring(0,s.length()-1);这是靠打印每一个字符的Unicode码值才发现的。不加这行数据永远读不干净。四、统一入口——自动判断格式importjava.io.FileInputStream;importjava.io.FileNotFoundException;publicstaticvoidmain(String[]args)throwsFileNotFoundException{StringfilenameD:\\项目申报书.doc;FileInputStreamfisnewFileInputStream(filename);ListArrayListArrayListStringtables;if(filename.endsWith(.docx)){tablesdocx(fis);}else{tablesdoc(fis);}// 打印所有表格数据if(tables!null){for(inti0;itables.size();i){System.out.println( 表i );for(intm0;mtables.get(i).size();m){System.out.print(行m:);for(intn0;ntables.get(i).get(m).size();n){System.out.print(\ttables.get(i).get(m).get(n));}System.out.println();}}}}通过文件名后缀自动分派到docx()或doc()。调用方不用关心Word是什么版本——传入文件流返回解析好的表格数据。五、从表格到数据库解析出来的ListListListString直接对接入库// 假设第一个表是申报单位信息表头在第一行数据在后续行ListArrayListStringtabletables.get(0);for(inti1;itable.size();i){// 跳过表头行ArrayListStringrowtable.get(i);StringunitNamerow.get(0);// 单位名称StringunitCoderow.get(1);// 单位代码Stringcontactrow.get(2);// 联系人Stringphonerow.get(3);// 联系电话// 入库dao.setUnitName(unitName);dao.setUnitCode(unitCode);dao.insert();}表结构稳定时列号固定直接按索引取值入库。表结构不固定时第一行是表头可以用表头文本匹配列号——单位名称在第几列就取哪一列。六、结语这套工具类的核心价值不是代码多复杂——是省掉手工录Word表格的时间。一个项目申报书几十个字段手工录入要半小时还容易录错。用这套工具读到内存里再写一段入库的逻辑五分钟整个流程自动化。Apache POI对两种Word格式的API差异不小但核心思路都是套三层循环。唯一需要特别注意的就是.doc格式的那个段落末尾控制字符——不是文档里写的字符是格式存储方式产生的副作用。不加那一刀数据读出来永远有点脏。

相关新闻

银行扣款了天塌了也要记下来——回调接口的原子记账设计

银行扣款了天塌了也要记下来——回调接口的原子记账设计

银行扣款了,天塌了也要记下来——回调接口的原子记账设计 文章目录银行扣款了,天塌了也要记下来——回调接口的原子记账设计一、银行扣款和普通业务不一样二、异常分类:不是所有失败都能一样处理三、BaoPanTimer的教训:先判断是否…

2026/8/5 10:28:42 阅读更多 →
JSON数组解析全攻略:从基础概念到高性能实战

JSON数组解析全攻略:从基础概念到高性能实战

1. 项目概述:从“Json数组解析”说起 如果你是一名开发者,无论是前端、后端还是移动端,几乎每天都要和Json数据打交道。而Json数组,作为承载列表数据最普遍的结构,其解析的效率和正确性,直接关系到应用的稳…

2026/8/5 10:27:42 阅读更多 →
终极免费PlantUML在线编辑器:5分钟从代码到专业UML图

终极免费PlantUML在线编辑器:5分钟从代码到专业UML图

终极免费PlantUML在线编辑器:5分钟从代码到专业UML图 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为绘制复杂的UML图而头疼吗?PlantUML在线编辑器为你带来了…

2026/8/5 10:27:42 阅读更多 →

最新新闻

阿里云服务器-命令8-/var/log/secure 日志详解--登录安全深度排查

阿里云服务器-命令8-/var/log/secure 日志详解--登录安全深度排查

1. 命令作用last 只能看成功登录,/var/log/secure 可以看所有失败登录、密码错误、爆破记录,是服务器防暴力破解的核心日志。2. 核心排查命令cat /var/log/secure | grep Failed3. 异常特征出现大量 Failed password 字段,代表724小时有人在暴…

2026/8/5 11:24:08 阅读更多 →
Unity机械臂仿真:从Blender规范建模到物理约束配置完整工作流

Unity机械臂仿真:从Blender规范建模到物理约束配置完整工作流

1. 项目概述:为什么我们需要一个完整的机械臂仿真工作流?如果你在Unity里做过机械臂或者任何多关节机构的仿真,大概率经历过这样的痛苦:从3D建模软件里导出的模型,一进Unity,关节的旋转轴就歪七扭八&#x…

2026/8/5 11:24:08 阅读更多 →
付费文章:豆包官宣付费全拆解!国产AI免费红利终结,行业痛点与普通人应对策略一次性讲清

付费文章:豆包官宣付费全拆解!国产AI免费红利终结,行业痛点与普通人应对策略一次性讲清

# 豆包官宣付费全拆解!国产AI免费红利终结,行业痛点与普通人应对策略一次性讲清## 引言2025年3月,字节跳动旗下AI助手「豆包」正式官宣付费订阅模式,这一消息迅速引爆科技圈。曾经以“完全免费”为卖点的国民级AI应用转向商业化&a…

2026/8/5 11:24:08 阅读更多 →
Navicat试用期管理终极指南:Mac版无限使用的完整解决方案

Navicat试用期管理终极指南:Mac版无限使用的完整解决方案

Navicat试用期管理终极指南:Mac版无限使用的完整解决方案 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为N…

2026/8/5 11:24:08 阅读更多 →
Unity导入Alembic动画全攻略:从原理到性能优化

Unity导入Alembic动画全攻略:从原理到性能优化

1. 项目概述:为什么Unity需要.abc动画模型? 如果你在游戏、影视动画或者工业可视化领域工作过,大概率听说过 Alembic 格式,也就是那个后缀为 .abc 的文件。我第一次接触它,是在一个需要将高精度动态布料模拟从 Houdi…

2026/8/5 11:24:08 阅读更多 →
实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解

实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解

实用指南:如何让老旧电视重获新生 - MyTV-Android电视直播应用详解 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否有一台老旧智能电视,因为系统版本太低无法…

2026/8/5 11:23:08 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →