本文档为Apache POI Word(docx)的简短示例教程,主要通过示例介绍XWPFXXX API的基本使用方法,最后一节介绍了poi-tl模板引擎提供的增强API的使用。
1. 文档XWPFDocument
XWPFDocument是对 .docx
文档操作的高级封装API。
1.1. 创建新文档
XWPFDocument doc = new XWPFDocument();
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();
1.3. 生成文档
通过传入一个OutStream,将文档写入流:
try (FileOutputStream out = new FileOutputStream("simple.docx")) {
doc.write(out);
}
2. 段落XWPFParagraph
段落是构成Word文档的一个基本单元。
2.1. 创建新段落
XWPFParagraph p1 = doc.createParagraph();
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.3. 基本元素XWPFRun
创建好段落后,我们就可以通过相关API处理段落内的文本和图片了。XWPFRun是段落的基本组成单元,它可以是一个文本,也可以是一张图片。
2.4. 段落文本
2.4.1. 读取段落内容
// 获取文字
String text = paragraph.getText();
// 获取段落内所有XWPFRun
List<XWPFRun> runs = paragraph.getRuns();
2.4.2. 创建XWPFRun文本
// 段落末尾创建XWPFRun
XWPFRun run = paragraph.createRun();
run.setText("为这个段落追加文本");
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);
2.4.5. 样式:颜色、字体
// 颜色
run.setColor("00ff00");
// 斜体
run.setItalic(true);
// 粗体
run.setBold(true);
// 字体
run.setFontFamily("Courier");
// 下划线
run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
2.4.6. 文本换行
run.addCarriageReturn();
2.5. 段落图片
2.5.1. 提取图片XWPFPicture
List<XWPFPictureData> allPictures = doc.getAllPictures();
XWPFPicture pciture = allPictures.get(0);
byte[] data = pciture.getPictureData().getData();
// 接下来就可以将图片字节数组写入输出流
2.5.2. 创建XWPFRun图片
import org.apache.poi.util.Units;
InputStream stream = new FileInputStream("./sayi.png");
XWPFRun run = paragraph.createRun();
run.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated", Units.toEMU(256), Units.toEMU(256));
3. 表格XWPFTable
表格是构成Word文档的另一个重要基本元素。
3.1. 创建新表格
创建一个三行三列的表格:
XWPFTable table = doc.createTable(3, 3);
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");
3.3. 设置单元格图片
图片操作其实就是获取段落,然后等同操作段落中的图片。
XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
// 同段落图片
3.4. 设置单元格样式:背景色、对齐方式
// 背景色
cell.setColor(cellStyle.getBackgroundColor());
// 获取单元格段落后设置对齐方式
XWPFParagraph addParagraph = cell.addParagraph();
addParagraph.setAlignment(ParagraphAlignment.CENTER);
4. poi-tl:Word模板引擎
poi-tl(poi template language)是基于Apache POI的Word模板引擎,完整的文档参见poi-tl官方文档,本小节不打算介绍模板引擎,主要讲解如何使用poi-tl里面对poi的增强API。
4.1. TableTools
TableTools
提供了若干操作表格的方法。
4.1.1. 同一行单元格合并某几列
// 合并第一行的第0列到第8列单元格
TableTools.mergeCellsHorizonal(table, 1, 0, 8);
4.1.2. 同一列单元格合并某几行
// 合并第0列的第一行到第九行的单元格
TableTools.mergeCellsVertically(table, 0, 1, 9);
4.1.3. 表格宽度
// 设置表格宽度为A4纸最大宽度
TableTools.widthTable(table, MiniTableRenderData.WIDTH_A4_FULL, 10);
4.1.4. 表格样式
// 设置表格居中
TableStyle style = new TableStyle();
style.setAlign(STJc.CENTER);
TableTools.styleTable(table, style);
4.2. NiceXWPFDocument
NiceXWPFDocument
是对原生 XWPFDocument
的增强。
4.2.1. 某个位置插入表格
NiceXWPFDocument doc = new NiceXWPFDocument(new FileInputStream("./deepoove.docx"));
// 在某个run位置插入10行10列的表格
// XWPFRun run = ...
XWPFTable table = doc.insertNewTable(run, 10, 10);
4.2.2. 某个位置插入段落
// 在某个run位置插入段落
// XWPFRun run = ...
doc.insertNewParagraph(run);
4.2.3. 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();