本文档为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"));
接下来我们就可以读取文档内容,包括段落、表格、图片等:
1// 段落 2List<XWPFParagraph> paragraphs = doc.getParagraphs(); 3// 表格 4List<XWPFTable> tables = doc.getTables(); 5// 图片 6List<XWPFPictureData> allPictures = doc.getAllPictures(); 7// 页眉 8List<XWPFHeader> headerList = doc.getHeaderList(); 9// 页脚 10List<XWPFFooter> footerList = doc.getFooterList();
1.3. 生成文档
通过传入一个OutStream,将文档写入流:
1try (FileOutputStream out = new FileOutputStream("simple.docx")) { 2 doc.write(out); 3}
2. 段落XWPFParagraph
段落是构成Word文档的一个基本单元。
2.1. 创建新段落
XWPFParagraph p1 = doc.createParagraph();
2.2. 设置段落格式
1// 对齐方式 2p1.setAlignment(ParagraphAlignment.CENTER); 3// 边框 4p1.setBorderBottom(Borders.DOUBLE); 5p1.setBorderTop(Borders.DOUBLE); 6p1.setBorderRight(Borders.DOUBLE); 7p1.setBorderLeft(Borders.DOUBLE); 8p1.setBorderBetween(Borders.SINGLE);
2.3. 基本元素XWPFRun
创建好段落后,我们就可以通过相关API处理段落内的文本和图片了。XWPFRun是段落的基本组成单元,它可以是一个文本,也可以是一张图片。
2.4. 段落文本
2.4.1. 读取段落内容
1// 获取文字 2String text = paragraph.getText(); 3 4// 获取段落内所有XWPFRun 5List<XWPFRun> runs = paragraph.getRuns();
2.4.2. 创建XWPFRun文本
1// 段落末尾创建XWPFRun 2XWPFRun run = paragraph.createRun(); 3run.setText("为这个段落追加文本");
2.4.3. 插入XWPFRun文本
1// 段落起始插入XWPFRun 2XWPFRun insertNewRun = paragraph.insertNewRun(0); 3insertNewRun.setText("在段落起始位置插入这段文本");
2.4.4. 修改XWPFRun文本
1List<XWPFRun> runs = paragraph.getRuns(); 2// setText默认为追加文本,参数0表示设置第0个位置的文本,覆盖上一次设置 3runs.get(0).setText("追加文本", 0); 4runs.get(0).setText("修改文本", 0);
2.4.5. 样式:颜色、字体
1// 颜色 2run.setColor("00ff00"); 3// 斜体 4run.setItalic(true); 5// 粗体 6run.setBold(true); 7// 字体 8run.setFontFamily("Courier"); 9// 下划线 10run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
2.4.6. 文本换行
run.addCarriageReturn();
2.5. 段落图片
2.5.1. 提取图片XWPFPicture
1List<XWPFPictureData> allPictures = doc.getAllPictures(); 2XWPFPicture pciture = allPictures.get(0); 3byte[] data = pciture.getPictureData().getData(); 4// 接下来就可以将图片字节数组写入输出流
2.5.2. 创建XWPFRun图片
1import org.apache.poi.util.Units; 2 3InputStream stream = new FileInputStream("./sayi.png"); 4XWPFRun run = paragraph.createRun(); 5run.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");
上面这一段代码和下面这一段代码是等价的:
1XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph(); 2XWPFRun r1 = p1.createRun(); 3r1.setText("EXAMPLE OF TABLE");
3.3. 设置单元格图片
图片操作其实就是获取段落,然后等同操作段落中的图片。
1XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph(); 2XWPFRun r1 = p1.createRun(); 3// 同段落图片
3.4. 设置单元格样式:背景色、对齐方式
1// 背景色 2cell.setColor(cellStyle.getBackgroundColor()); 3 4// 获取单元格段落后设置对齐方式 5XWPFParagraph addParagraph = cell.addParagraph(); 6addParagraph.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. 同一行单元格合并某几列
1// 合并第一行的第0列到第8列单元格 2TableTools.mergeCellsHorizonal(table, 1, 0, 8);
4.1.2. 同一列单元格合并某几行
1// 合并第0列的第一行到第九行的单元格 2TableTools.mergeCellsVertically(table, 0, 1, 9);
4.1.3. 表格宽度
1// 设置表格宽度为A4纸最大宽度 2TableTools.widthTable(table, MiniTableRenderData.WIDTH_A4_FULL, 10);
4.1.4. 表格样式
1// 设置表格居中 2TableStyle style = new TableStyle(); 3style.setAlign(STJc.CENTER); 4TableTools.styleTable(table, style);
4.2. NiceXWPFDocument
NiceXWPFDocument 是对原生 XWPFDocument 的增强。
4.2.1. 某个位置插入表格
1NiceXWPFDocument doc = new NiceXWPFDocument(new FileInputStream("./deepoove.docx")); 2 3// 在某个run位置插入10行10列的表格 4// XWPFRun run = ... 5XWPFTable table = doc.insertNewTable(run, 10, 10);
4.2.2. 某个位置插入段落
1// 在某个run位置插入段落 2// XWPFRun run = ... 3doc.insertNewParagraph(run);
4.2.3. Word合并
1NiceXWPFDocument main = new NiceXWPFDocument(new FileInputStream("main.docx")); 2 3NiceXWPFDocument sub = new NiceXWPFDocument(new FileInputStream("sub.docx")); 4 5// 合并两个文档 6NiceXWPFDocument newDoc = main.merge(sub); 7 8// 生成新文档 9FileOutputStream out = new FileOutputStream("new_doc.docx"); 10doc.write(out); 11doc.close(); 12out.close();