本文档为Apache POI Word(docx)的简短示例教程,主要通过示例介绍XWPFXXX API的基本使用方法,最后一节介绍了poi-tl模板引擎提供的增强API的使用。
1. 文档XWPFDocument
XWPFDocument是对 .docx
文档操作的高级封装API。
1.2. 读取已有文档:段落、表格、图片
XWPFDocument doc = new XWPFDocument(new FileInputStream("./deepoove.docx"));
接下来我们就可以读取文档内容,包括段落、表格、图片等:
// 段落
List<XWPFParagraph> paragraphs = doc.getParagraphs();
// 表格
List<XWPFTable> tables = doc.getTables();
// 图片
List<XWPFPictureData> allPictures = doc.getAllPictures();
// 页眉
List<XWPFHeader> headerList = doc.getHeaderList();
// 页脚
List<XWPFFooter> footerList = doc.getFooterList();
2. 段落XWPFParagraph
段落是构成Word文档的一个基本单元。
2.2. 设置段落格式
// 对齐方式
p1.setAlignment(ParagraphAlignment.CENTER);
// 边框
p1.setBorderBottom(Borders.DOUBLE);
p1.setBorderTop(Borders.DOUBLE);
p1.setBorderRight(Borders.DOUBLE);
p1.setBorderLeft(Borders.DOUBLE);
p1.setBorderBetween(Borders.SINGLE);
2.4. 段落文本
2.4.1. 读取段落内容
// 获取文字
String text = paragraph.getText();
// 获取段落内所有XWPFRun
List<XWPFRun> runs = paragraph.getRuns();
2.4.3. 插入XWPFRun文本
// 段落起始插入XWPFRun
XWPFRun insertNewRun = paragraph.insertNewRun(0);
insertNewRun.setText("在段落起始位置插入这段文本");
2.4.4. 修改XWPFRun文本
List<XWPFRun> runs = paragraph.getRuns();
// setText默认为追加文本,参数0表示设置第0个位置的文本,覆盖上一次设置
runs.get(0).setText("追加文本", 0);
runs.get(0).setText("修改文本", 0);
3. 表格XWPFTable
表格是构成Word文档的另一个重要基本元素。
3.2. 设置单元格文本
表格是由表格行XWPFRow构成,每行是由单元格XWPFCell构成,每个单元格内部又是由许多XWPFParagraph段落构成。
table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");
上面这一段代码和下面这一段代码是等价的:
XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
r1.setText("EXAMPLE OF TABLE");
4. poi-tl:Word模板引擎
poi-tl(poi template language)是基于Apache POI的Word模板引擎,完整的文档参见poi-tl官方文档,本小节不打算介绍模板引擎,主要讲解如何使用poi-tl里面对poi的增强API。
4.2. NiceXWPFDocument
NiceXWPFDocument
是对原生 XWPFDocument
的增强。
4.2.1. Word合并
NiceXWPFDocument main = new NiceXWPFDocument(new FileInputStream("main.docx"));
NiceXWPFDocument sub = new NiceXWPFDocument(new FileInputStream("sub.docx"));
// 合并两个文档
NiceXWPFDocument newDoc = main.merge(sub);
// 生成新文档
FileOutputStream out = new FileOutputStream("new_doc.docx");
doc.write(out);
doc.close();
out.close();