POI读取doc、docx文件
1.明确几个概念:
Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun)。
Section:word文档的一个小节,一个word文档可以由多个小节构成。Paragraph:word文档的一个段落,一个小节可以由多个段落构成。
CharacterRun:具有相同属性的一段文本,一个段落可以由多个CharacterRun组成。
Table:一个表格。
ableRow:表格对应的行。
TableCell:表格对应的单元格。
2.依赖包:
<!-- POI依赖,读取.docx型文档--><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><!-- POI依赖,读取.doc型文档--><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.1</version></dependency>
3.读取doc型文档
1)使用HWPFDocument 读取
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.junit.Test;import java.io.*;
import java.util.List;public class WordTest {@Testpublic void testReadByDoc() throws Exception {InputStream is = new FileInputStream("C:\\Users\\阿劼\\Desktop\\11.doc");HWPFDocument doc = new HWPFDocument(is);// 输出文本,这步读取不到????System.out.println("=========================文本信息==========================");System.out.println("-------------使用getDocumentText()获取文本---------------");System.out.println(doc.getDocumentText());System.out.println("-----------------使用getText()获取文本-------------------");System.out.println(doc.getText());// 输出书签信息this.printInfo(doc.getBookmarks());Range range = doc.getRange();// range信息this.printInfo(range);// 读表格this.readTable(range);// 读列表this.readList(range);this.closeStream(is);}/*** 关闭输入流** @param is*/private void closeStream(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 输出书签信息** @param bookmarks*/private void printInfo(Bookmarks bookmarks) {int count = bookmarks.getBookmarksCount();System.out.println("=========================书签信息==========================");System.out.println("书签数量:" + count);Bookmark bookmark;for (int i = 0; i < count; i++) {bookmark = bookmarks.getBookmark(i);System.out.println("书签" + (i + 1) + "的名称是:" + bookmark.getName());System.out.println("开始位置:" + bookmark.getStart());System.out.println("结束位置:" + bookmark.getEnd());}}private void readTable(Range range) {System.out.println("=========================表格信息==========================");//遍历range范围内的table。TableIterator tableIter = new TableIterator(range);while (tableIter.hasNext()) {Table table = tableIter.next();//开始位置int start = table.getStartOffset();//结束位置int end = table.getEndOffset();System.out.printf("开始位置%d,结束位置%d\r\n", start, end);//获取行的数目int rowNum = table.numRows();for (int j = 0; j < rowNum; j++) {//获取每一行TableRow row = table.getRow(j);int cellNum = row.numCells();for (int k = 0; k < cellNum; k++) {//获取每一列TableCell cell = row.getCell(k);// 输出单元格的文本System.out.printf("第%d行第%d列的内容是: %s", j + 1, k + 1, cell.text().trim());System.out.println();}}}}/*** 读列表** @param range*/private void readList(Range range) {System.out.println("=========================列表信息==========================");int num = range.numParagraphs();for (int i = 0; i < num; i++) {Paragraph paragraph = range.getParagraph(i);if (paragraph.isInList()) {System.out.println("list : " + paragraph.text());}}}/*** 输出Range** @param range*/private void printInfo(Range range) {System.out.println("=========================Range信息==========================");System.out.println("-------------------------段落信息-------------------------");// 获取段落数int paraNum = range.numParagraphs();System.out.println("段落数为 : " + paraNum);for (int i = 0; i < paraNum; i++) {System.out.println("段落" + (i + 1) + "内容为:" + range.getParagraph(i).text());}System.out.println("-------------------------小节信息-------------------------");int secNum = range.numSections();System.out.println("小节数为 : " + paraNum);System.out.println(secNum);Section section;for (int i = 0; i < secNum; i++) {section = range.getSection(i);System.out.println(section.text());}}
}
2)使用WordExtractor 读取
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.junit.Test;import java.io.*;
import java.util.List;public class WordTest {@Testpublic void readByExtractorTest() throws Exception {InputStream is = new FileInputStream("C:\\Users\\阿劼\\Desktop\\11.doc");WordExtractor extractor = new WordExtractor(is);// word文档所有的文本System.out.println("---------------文档中所有文本----------------");System.out.println(extractor.getText());// 页眉System.out.println("-------------------页眉-----------------");System.out.println(extractor.getHeaderText());// 页脚System.out.println("------------------页脚------------------");System.out.println(extractor.getFooterText());// 输出当前word文档的元数据信息,包括作者、文档的修改时间等。System.out.println("------------------元数据信息-------------------");System.out.println(extractor.getMetadataTextExtractor().getText());// 获取各个段落的文本System.out.println("=======================每个段落信息=========================");String paraTexts[] = extractor.getParagraphText();for (int i = 0; i < paraTexts.length; i++) {System.out.println("------------------段落" + (i + 1) + "----------------");System.out.println("Paragraph " + (i + 1) + " : " + paraTexts[i]);}// 当前word的一些信息printInfo(extractor.getSummaryInformation());// 当前word的一些信息this.printInfo(extractor.getDocSummaryInformation());this.closeStream(is);}/*** 输出SummaryInfomation** @param info*/private void printInfo(SummaryInformation info) {System.out.println("===================从getSummaryInformation中获取信息===============");// 作者System.out.println("---------------------作者----------------------");System.out.println(info.getAuthor());// 字符统计System.out.println("---------------------字符----------------------");System.out.println(info.getCharCount());// 页数System.out.println("---------------------页数----------------------");System.out.println(info.getPageCount());// 标题System.out.println("---------------------标题----------------------");System.out.println(info.getTitle());// 主题System.out.println("---------------------主题----------------------");System.out.println(info.getSubject());}/*** 输出DocumentSummaryInfomation** @param info*/private void printInfo(DocumentSummaryInformation info) {System.out.println("===================从getDocSummaryInformation中获取信息===============");// 分类System.out.println("---------------------分类----------------------");System.out.println(info.getCategory());// 公司System.out.println("---------------------公司----------------------");System.out.println(info.getCompany());}}
4.读取docx型文件
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.junit.Test;import java.io.*;
import java.util.List;public class WordTest {@Testpublic void poiReadDocxTest() {File file = new File("C:\\Users\\阿劼\\Desktop\\0.docx");try {FileInputStream fis = new FileInputStream(file);XWPFDocument xdoc = new XWPFDocument(fis);XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);String doc1 = extractor.getText();System.out.println(doc1);List<XWPFPictureData> allPictures = xdoc.getAllPictures();fis.close();} catch (Exception e) {e.printStackTrace();}}
}
感谢https://www.jb51.net/article/101910.htm
和https://www.cnblogs.com/Renyi-Fan/p/8147650.html两篇文章
POI读取doc、docx文件相关推荐
- python读取doc/docx文件
仅此记录python读取doc/docx文件的方法,和常用简单的open txt文件完全不同(版本python 3.6 Win10) docx 使用docx包,python为其专用接口,pytho ...
- Linux下读取doc,docx文件
如果是Linux Desktop发行版本,可以下载wps for linux docx文件 利用python-docx包 test.py # -*- coding:utf-8 -*- import s ...
- java读取docx_java使用poi读取doc和docx文件
maven构建的项目-->pom.xml文件 eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包: ...
- java 读取 doc_java使用poi读取doc和docx文件的实现示例
这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码. 我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码. 于 ...
- 使用POI读写word docx文件
目录 1 读docx文件 1.1 通过XWPFWordExtractor读 1.2 通过XWPFDocument读 2 写docx文件 2.1 直接通过XWPF ...
- 利用poi读取word模板文件生成新的word文档
利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...
- java word模板poi生成文件_利用poi读取word模板文件生成新的word文档
利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码.解决模板读取异常问题,提供wordUtils工具类(各种功能实现) ...
- docx poi 原理_使用POI读写word docx文件
目录 1 读docx文件 1.1 通过XWPFWordExtractor读 1.2 通过XWPFDocument读 2 写docx文件 2.1 直接通过XWPF ...
- java使用poi读取doc和docx文件
这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码. 我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码. 于 ...
最新文章
- UVA10881蚂蚁
- 【Python】青少年蓝桥杯_每日一题_3.19_约分
- JAVA项目实训struts2_Java Web项目搭建过程记录(struts2)
- php表达式生成工具,thinkPHP5.0数据查询表达式生成技巧
- gitlab-runner 安装使用
- 【blockly教程】第五章 循环结构
- linux的定cron计划任务命令
- Python机器学习:PCA与梯度上升:06scikit中的PCA
- fsmc同步通信设置_微服务模式-同步与异步
- js计算两个整数之间的百分比
- Substrings (C++ find函数应用)
- There is no more space for virtual disk. db_ sqlserver , vmdk.You might be able to continue this ses
- FPGROWTH算法
- 程序设计基本结构———顺序、选择与循环
- IDEA修改快捷键方法(在原快捷键不变的基础上增加自己习惯的快捷键)
- 利用JAVA流处理-统计男员工人数;找出所有薪资大于 5000 元的女员工;找出大于平均年龄的员工
- html超链接字体颜色怎么改DW,如何利用Dreamweaver设计彩色文字链接
- 数据治理:数据治理之道-数据文化-数据思维融入企业文化
- 遗传算法中常见遗传算子
- 考取阿里云认证后有什么用?能得到什么工作?
热门文章
- 2016年最新苹果IOS上架App Store商店步骤
- C++设计模式之建造者模式(三)
- linux netfilter路由表,linux网络相关,firewalld和netfilter,netfilter5表5链介绍,itptables语法...
- Aviator 常见使用
- 安卓bochs模拟linux_Bochs Linux安装
- 仿悟空遥控器控制页面
- java搜索目录特定文件夹
- PHP 对象继承和多态的实例
- 操作系统---设备管理
- c语言程序设计秋考答案,南开《C语言程序设计》19秋期末考核【标准答案】