Java怎么应用poi解析word文档中的数据
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Java怎么应用poi解析word文档中的数据",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么应用poi解析word文档中的数据"文章能帮助大家解决疑惑,下面跟着小
千家信息网最后更新 2026年11月01日Java怎么应用poi解析word文档中的数据
本文小编为大家详细介绍"Java怎么应用poi解析word文档中的数据",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么应用poi解析word文档中的数据"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。
方法如下:
1、增加maven中的包
org.apache.poi poi-scratchpad 3.17 org.apache.poi poi-ooxml 3.17 2、解析doc中的数据
获取文件,把MultipartFile对象的数据转成本地file
File file = new File(FileUtils.getUserDirectoryPath() + "/" + multipartFile.getOriginalFilename());FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file); String fileName = file.getName().toLowerCase(); FileInputStream in = new FileInputStream(file); if (fileName.endsWith(".doc")) { // 处理doc格式 即office2003版本 handlerDoc(in); } if (fileName.endsWith(".docx")) { handlerDocx(in); }解析doc格式中的段落和第一个表格数据
/** * doc 格式解析 * * @param in * @throws IOException */ private void handlerDoc(FileInputStream in) throws IOException { POIFSFileSystem pfs = new POIFSFileSystem(in); HWPFDocument hwpf = new HWPFDocument(pfs); //得到文档的读取范围 Range range = hwpf.getRange(); for (int i = 0; i < range.numParagraphs(); i++) { //段落 Paragraph p = range.getParagraph(i); //段落文本 String paragraphText = p.text().replace("", ""); log.info("paragraphText = {}", paragraphText ); if (paragraphText.contains(VALUE_YLYC)) { analyze = false; } } TableIterator it = new TableIterator(range); // 迭代文档中的表格 // 如果有多个表格只读取需要的一个 set是设置需要读取的第几个表格,total是文件中表格的总数 int set = 1, total = 1; int num = set; for (int i = 0; i < set - 1; i++) { it.hasNext(); it.next(); } while (it.hasNext()) { Map> tabelText = DocUtils.getTabelDocText((Table) it.next()); log.info("tabelText = {}", tabelText); } // 过滤多余的表格 while (num < total) { it.hasNext(); it.next(); num += 1; } } 3、解析docx中数据
解析docx格式中的段落和第一个表格数据
/** * docx 格式解析 * * @param in * @throws IOException */ private void handlerDocx(FileInputStream in) throws IOException { XWPFDocument xwpf = new XWPFDocument(in); // 获取word中的所有段落与表格 List elements = xwpf.getBodyElements(); // 解析表格后续不解析 for (IBodyElement element : elements) { // 段落 if (element instanceof XWPFParagraph) { String paragraphText = DocUtils.getParagraphText((XWPFParagraph) element); log.info("paragraphText = {}", paragraphText); } else if (element instanceof XWPFTable) { // 表格 Map> tabelText = DocUtils.getTabelText((XWPFTable) element); log.info("tabelText = {}", tabelText); } else { log.info("其他内容"); } } } 工具类
package com.hundsun.fais.innerreport.utils;import org.apache.poi.hwpf.usermodel.Paragraph;import org.apache.poi.hwpf.usermodel.Table;import org.apache.poi.hwpf.usermodel.TableCell;import org.apache.poi.hwpf.usermodel.TableRow;import org.apache.poi.xwpf.usermodel.*;import java.util.*;/** * @author lvbaolin * @date 2021/4/2 10:39 */public class DocUtils { /** * docx 格式获取表格内容 * * @param table */ public static Map> getTabelText(XWPFTable table) { Map> result = new LinkedHashMap<>(); List rows = table.getRows(); for (XWPFTableRow row : rows) { String key = null; List list = new ArrayList<>(16); int i = 0; List cells = row.getTableCells(); for (XWPFTableCell cell : cells) { // 简单获取内容(简单方式是不能获取字体对齐方式的) StringBuffer sb = new StringBuffer(); // 一个单元格可以理解为一个word文档,单元格里也可以加段落与表格 List paragraphs = cell.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { sb.append(DocUtils.getParagraphText(paragraph)); } if (i == 0) { key = sb.toString(); } else { String value = sb.toString(); list.add(value == null || Objects.deepEquals(value, "") ? null : value.replace(",", "")); } i++; } result.put(key, list); } return result; } /** * docx 获取段落字符串 * 获取段落内容 * * @param paragraph */ public static String getParagraphText(XWPFParagraph paragraph) { StringBuffer runText = new StringBuffer(); // 获取段落中所有内容 List runs = paragraph.getRuns(); if (runs.size() == 0) { return runText.toString(); } for (XWPFRun run : runs) { runText.append(run.text()); } return runText.toString(); } /** * doc 格式的字段解析表格 * @param tb * @return */ public static Map> getTabelDocText(Table tb) { Map> result = new HashMap<>(16); //迭代行,默认从0开始,可以依据需要设置i的值,改变起始行数,也可设置读取到那行,只需修改循环的判断条件即可 for (int i = 0; i < tb.numRows(); i++) { List list = new ArrayList<>(16); int x = 0; TableRow tr = tb.getRow(i); String key = null; //迭代列,默认从0开始 for (int j = 0; j < tr.numCells(); j++) { //取得单元格 TableCell td = tr.getCell(j); StringBuffer sb = new StringBuffer(); //取得单元格的内容 for (int k = 0; k < td.numParagraphs(); k++) { Paragraph paragraph = td.getParagraph(k); String s = paragraph.text(); //去除后面的特殊符号 if (null != s && !"".equals(s)) { s = s.substring(0, s.length() - 1); } sb.append(s); } if (x == 0) { key = sb.toString(); } else { String value = sb.toString(); list.add(value == null || Objects.deepEquals(value, "") ? null : value.replace(",", "")); } x++; } result.put(key, list); } return result; }} 读到这里,这篇"Java怎么应用poi解析word文档中的数据"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
表格
段落
数据
内容
格式
文档
单元
应用
文章
功能
文件
方式
处理
迭代
妥当
特殊
人员
只需
基金
基金会
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
精品咖啡豆
上海喔噻互联网科技有限公司
互联网科技视频
中正互联网科技招聘
互联网公司会议桌创意科技软装饰
互联网科技公司招聘
中国的互联网科技企业的崛起
互联网软件和科技
赶超互联网科技 微信多开
移动互联网科技公司
速维有品互联网信息科技(苏州)有限公司
中国科技创新与世界互联网大会
互联网公司黑科技创始人
互联网科技如何创业
为客找房互联网科技公司怎么样
浙南科技城互联网大厦招聘
互联网科技股为什么大涨
互联网科技数字货币
张家口科技产业互联网平台
科技发展第三阶段互联网时代
中关村互联网科技集团
互联网科技与金融科技
齐家互联网科技
华中科技大学互联网
互联网科技公司名称
互联网 科技馆
互联网金融中的现代科技
互联网金融科技展
燊美集互联网科技有限公司
第三届互联网大会安防黑科技