word 文件读取
使用Apache POI Word 进行读取文件
使用poi 时如果报ClassNotFoundException 等错误,请注意请求以下maven 文件的版本
Apache POI Word 说明文档:Apache POI Word 说明文档
maven 解决依赖冲突教程:https://www.cnblogs.com/shangxiaofei/p/17662176.html
1:导包
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<!--读取doc文件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.2</version>
</dependency>
2:读取doc和docx文件的工具类
package com.wkl.testdemo.word;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
/**
* 读取word工具类
*/
public class ReadWordUtil {
public static String readWord(InputStream inputStream, String suffix) throws Exception{
String buffer = "";
try {
if ("doc".equals(suffix)) {
HWPFDocument document = new HWPFDocument(inputStream);
WordExtractor extractor = new WordExtractor(document);
buffer = extractor.getText();
String[] paragraphText = extractor.getParagraphText();
//解析段落
for (String s : paragraphText) {
System.out.println(s);
}
extractor.close();
document.close();
} else if ("docx".equals(suffix)) {
XWPFDocument doc = new XWPFDocument(inputStream);
XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
buffer = extractor.getText();
//解析段落
List<XWPFParagraph> paragraphs = doc.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String text1 = paragraph.getText();
System.out.println(text1);
}
extractor.close();
doc.close();
}
return buffer;
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) throws Exception {
String pathdocx = "C:\\Users\\wenge\\Desktop\\新建 DOCX 文档.docx";
readWord(new FileInputStream(new File(pathdocx)),"docx");
String pathdoc = "C:\\Users\\wenge\\Desktop\\新建 DOC 文档.doc";
readWord(new FileInputStream(new File(pathdoc)),"doc");
}
}
导出word文档-Poi-tl
1:Poi-tl介绍
poi-tl是一个基于Apache POI的Java库,用于操作Microsoft Office文档,包括Word文档(.docx)、Excel电子表格(.xlsx)和PowerPoint演示文稿(.pptx)。它提供了一组简单易用的API,使开发人员能够轻松地创建、读取和修改Office文档。
poi-tl的主要特点如下:
-
简单易用:poi-tl提供了一组简单易用的API,使开发人员能够快速上手并进行Office文档的操作。它提供了丰富的方法和属性,以满足不同的需求。
-
支持多种文档格式:poi-tl支持多种常见的Office文档格式,包括Word文档(.docx)、Excel电子表格(.xlsx)和PowerPoint演示文稿(.pptx)。开发人员可以使用poi-tl来创建、读取和修改这些文档。
-
功能丰富:poi-tl提供了许多有用的功能,如创建和修改文档的样式、添加和删除文本、插入和删除图片、创建和修改表格、添加和删除行列等。它还支持合并单元格、设置字体样式和颜色、设置边框和背景颜色等高级功能。
-
支持模板引擎:poi-tl支持使用模板引擎来生成Office文档。开发人员可以使用模板引擎来定义文档的结构和样式,并使用poi-tl来填充数据。这样可以实现文档的动态生成,使开发人员能够更灵活地生成各种类型的文档。
-
支持国际化:poi-tl支持国际化,可以根据不同的语言和地区生成相应的文档。开发人员可以使用poi-tl提供的API来设置文档的语言、日期格式、货币格式等,以满足不同国家和地区的需求。
-
开源免费:poi-tl是一个开源的Java库,使用Apache License 2.0许可证。这意味着开发人员可以免费使用和修改poi-tl,并将其用于商业和非商业项目。
综上所述,poi-tl是一个功能强大且易于使用的Java库,用于操作Microsoft Office文档。它提供了丰富的API和功能,使开发人员能够轻松地创建、读取和修改Office文档。无论是生成报告、导出数据还是进行数据分析,poi-tl都是一个理想的选择
2:Poi-tl和其他模板引擎对比
其中:
poi-tl官网地址:https://deepoove.com/poi-tl/
Apache POI Word 说明文档:Apache POI Word 说明文档
3:Poi-tl 功能列表
4:导包
看poi-tl 官网,有版本建议
<!--poi word-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<!--读取doc文件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.2</version>
</dependency>
5:导出文件测试-helloworld
1:生成一个模板.docx
2:程序测试
package com.wkl.testdemo.word;
import com.deepoove.poi.XWPFTemplate;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @author wangkanglu
* @version 1.0
* @description
* @date 2023-12-20 15:53
*/
public class WriteWordUtil {
public static void main(String[] args) {
String path = "C:\\Users\\Desktop\\模板.docx";
Map<String,String> data = new HashMap<>();
data.put("title","标题1111");
data.put("publishTime","2023-12-20 13:12:12");
data.put("content","内容");
try {
toword(data,path,"C:\\Users\\Desktop\\模板1.docx");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 生成word工具类
* @param datas 数据
* @param filePath 模板地址
* @param descpath 输出地址
* @return 返回生成文件路径
* @throws IOException
*/
public static String toword(Map datas, String filePath, String descpath) throws IOException {
String outPath = descpath;
XWPFTemplate template = XWPFTemplate.compile(filePath)
.render(datas);
FileOutputStream out = new FileOutputStream(outPath);
template.write(out);
template.close();
return descpath;
}
}
3:结果:
6:复杂使用-增加文件批注
package com.wkl.testdemo.word;
import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.util.LocaleUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Documents;
import com.deepoove.poi.data.Documents.DocumentBuilder;
import com.deepoove.poi.data.ParagraphRenderData;
import com.deepoove.poi.data.Paragraphs;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.Texts;
import com.deepoove.poi.data.style.Style;
import com.deepoove.poi.plugin.comment.CommentRenderData;
import com.deepoove.poi.plugin.comment.CommentRenderPolicy;
import com.deepoove.poi.plugin.comment.Comments;
import com.deepoove.poi.plugin.comment.Comments.CommentBuilder;
public class CommentRenderPolicyTest {
public static void main(String[] args) {
try {
testCommentExample();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void testCommentExample() throws IOException {
// comment
CommentRenderData comment0 = newCommentBuilder().addText(Texts.of("咏鹅").fontSize(20).bold().create())
.comment(Documents.of()
.addParagraph(Paragraphs.of(Pictures.ofLocal("D:\\Pictures\\002KoyJzly1hix2zhdr2qj60sq0sq0uu02.jpg").create()).create())
.create())
.create();
CommentRenderData comment1 = newCommentBuilder().addText("骆宾王")
.comment("骆宾王作为“初唐四杰”之一,对荡涤六朝文学颓波,革新初唐浮靡诗风。他一生著作颇丰,是一个才华横溢的诗人。")
.create();
CommentRenderData comment2 = newCommentBuilder().addText("曲项").comment("弯着脖子").create();
CommentRenderData comment3 = newCommentBuilder().addText("拨").comment("划动").create();
// document
DocumentBuilder documentBuilder = Documents.of()
.addParagraph(Paragraphs.of().addComment(comment0).center().create());
documentBuilder.addParagraph(Paragraphs.of().addComment(comment1).center().create());
documentBuilder.addParagraph(Paragraphs.of("鹅,鹅,鹅,").addComment(comment2).addText("向天歌。").center().create());
documentBuilder.addParagraph(Paragraphs.of("白毛浮绿水,红掌").addComment(comment3).addText("清波。").center().create());
// render
XWPFTemplate.create(documentBuilder.create(), Style.builder().buildFontFamily("微软雅黑").buildFontSize(14f).build())
.writeToFile("C:\\Users\\Desktop\\增加批注.docx");
}
private static CommentBuilder newCommentBuilder() {
return Comments.of().signature("Sayi", "s", LocaleUtil.getLocaleCalendar());
}
}