Java怎么应用poi解析word文档中的数据
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,本文小编为大家详细介绍"Java怎么应用poi解析word文档中的数据",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么应用poi解析word文档中的数据"文章能帮助大家解决疑惑,下面跟着小
千家信息网最后更新 2025年01月17日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安全错误
数据库的锁怎样保障安全
sql在数据库中查找姓名的条件
四级数据库模拟
宁波其它区专业软件开发
JAVA项目管理同步服务器
网络安全设备巡检制度
河南对口高考数据库试题
保险项目软件开发
山东大树网络技术有限公司
电信 dns 服务器地址
安徽门店管理软件开发定制
魔法觉醒有几个服务器
长连接和短连接区别数据库
培训中心网络技术学校
为什么要监控服务器cpu
如何购买免费的云服务器
网络运维跟软件开发
泰安房地产数据库
如何开展网络安全迎检工作
真实的网络安全型号
租了服务器
山东智慧养老管理平台软件开发
典型软件开发模式
检查自己的网络安全
无锡云问网络技术有限公司图片
网络安全信息征文
国产数据库达梦
两个不同数据库 数据传输
潍柴通用软件开发
服务器布置环境
蓝牙传输数据库