前言
在现代软件开发中,处理Office文档是一个常见需求。无论是生成报告、创建合同模板,还是批量处理Word文档,Apache POI库中的XWPFDocument类都是Java开发者的得力助手。本文将详细介绍XWPFDocument的功能特性和实际使用方法。
什么是XWPFDocument?
XWPFDocument是Apache POI项目中专门用于处理Microsoft Word 2007及以后版本(.docx格式)文档的核心类。它基于Office Open XML格式,提供了完整的API来创建、读取、修改Word文档。相比于处理旧版.doc格式的HWPFDocument,XWPFDocument功能更加强大且稳定。
主要功能特性
1. 文档基础操作
-
创建新的Word文档
-
读取现有的.docx文件
-
保存文档到本地或输出流
-
获取文档基本信息(作者、标题、创建时间等)
2. 段落和文本处理
-
创建和编辑段落(XWPFParagraph)
-
设置文本格式(字体、大小、颜色、粗体、斜体等)
-
文本对齐方式控制
-
行间距和段落间距设置
3. 表格操作
-
创建和编辑表格(XWPFTable)
-
设置表格样式和边框
-
合并单元格
-
动态调整行列数量
4. 图片和媒体
-
插入图片到文档
-
设置图片尺寸和位置
-
支持多种图片格式(PNG, JPEG, GIF等)
5. 页面设置
-
页边距设置
-
页面方向控制
-
页眉页脚操作
-
分页控制
环境配置
首先需要在项目中添加Apache POI依赖:
Maven配置
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>5.2.4</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.4</version> </dependency>
Gradle配置
implementation 'org.apache.poi:poi-scratchpad:5.2.4' implementation 'org.apache.poi:poi-ooxml:5.2.4'
基础使用示例
1. 创建简单文档
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class CreateDocumentExample {
public static void main(String[] args) {
try {
// 创建空白文档
XWPFDocument document = new XWPFDocument();
// 创建段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("Hello, 这是我的第一个XWPFDocument文档!");
run.setBold(true);
run.setFontSize(14);
// 保存文档
FileOutputStream out = new FileOutputStream("example.docx");
document.write(out);
out.close();
document.close();
System.out.println("文档创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 读取现有文档
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class ReadDocumentExample {
public static void main(String[] args) {
try {
// 读取现有文档
FileInputStream fis = new FileInputStream("example.docx");
XWPFDocument document = new XWPFDocument(fis);
// 获取所有段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph para : paragraphs) {
System.out.println("段落内容: " + para.getText());
}
// 获取所有表格
List<XWPFTable> tables = document.getTables();
for (XWPFTable table : tables) {
System.out.println("找到表格,行数: " + table.getRows().size());
}
document.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 创建格式化文档
public class FormattedDocumentExample {
public static void createFormattedDocument() throws IOException {
XWPFDocument document = new XWPFDocument();
// 创建标题
XWPFParagraph title = document.createParagraph();
title.setAlignment(ParagraphAlignment.CENTER);
XWPFRun titleRun = title.createRun();
titleRun.setText("项目报告");
titleRun.setBold(true);
titleRun.setFontSize(18);
titleRun.setColor("FF0000"); // 红色
// 创建正文段落
XWPFParagraph paragraph = document.createParagraph();
paragraph.setAlignment(ParagraphAlignment.LEFT);
XWPFRun run = paragraph.createRun();
run.setText("这是项目报告的正文内容。");
run.setFontSize(12);
run.setFontFamily("宋体");
// 添加分页符
paragraph.createRun().addBreak(BreakType.PAGE);
// 保存文档
FileOutputStream out = new FileOutputStream("formatted_document.docx");
document.write(out);
out.close();
document.close();
}
}
4. 创建表格
public class TableExample {
public static void createTable() throws IOException {
XWPFDocument document = new XWPFDocument();
// 创建表格
XWPFTable table = document.createTable(3, 3);
// 设置表格样式
table.setWidth(100); // 设置宽度百分比
// 填充表格内容
List<XWPFTableRow> rows = table.getRows();
for (int i = 0; i < rows.size(); i++) {
List<XWPFTableCell> cells = rows.get(i).getTableCells();
for (int j = 0; j < cells.size(); j++) {
cells.get(j).setText("单元格(" + i + "," + j + ")");
}
}
// 设置表头样式
XWPFTableRow headerRow = table.getRow(0);
for (XWPFTableCell cell : headerRow.getTableCells()) {
cell.setColor("CCCCCC"); // 设置背景色
XWPFParagraph para = cell.getParagraphs().get(0);
XWPFRun run = para.createRun();
run.setBold(true);
}
FileOutputStream out = new FileOutputStream("table_document.docx");
document.write(out);
out.close();
document.close();
}
}
5. 插入图片
import org.apache.poi.util.Units;
public class ImageExample {
public static void insertImage() throws IOException {
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("下面是插入的图片:");
run.addBreak();
// 插入图片
FileInputStream imageStream = new FileInputStream("image.png");
run.addPicture(imageStream,
XWPFDocument.PICTURE_TYPE_PNG,
"image.png",
Units.toEMU(200), // 宽度
Units.toEMU(150) // 高度
);
imageStream.close();
FileOutputStream out = new FileOutputStream("image_document.docx");
document.write(out);
out.close();
document.close();
}
}
高级功能
1. 页眉页脚设置
public class HeaderFooterExample {
public static void addHeaderFooter() throws IOException {
XWPFDocument document = new XWPFDocument();
// 创建页眉
XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
XWPFParagraph headerPara = header.createParagraph();
headerPara.setAlignment(ParagraphAlignment.CENTER);
XWPFRun headerRun = headerPara.createRun();
headerRun.setText("文档页眉");
// 创建页脚
XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);
XWPFParagraph footerPara = footer.createParagraph();
footerPara.setAlignment(ParagraphAlignment.CENTER);
XWPFRun footerRun = footerPara.createRun();
footerRun.setText("第 ");
// 插入页码
footerPara.getCTP().addNewFldSimple().setInstr("PAGE");
footerRun = footerPara.createRun();
footerRun.setText(" 页");
// 添加正文内容
XWPFParagraph paragraph = document.createParagraph();
paragraph.createRun().setText("这是文档正文内容。");
FileOutputStream out = new FileOutputStream("header_footer_document.docx");
document.write(out);
out.close();
document.close();
}
}
2. 样式应用
public class StyleExample {
public static void applyStyles() throws IOException {
XWPFDocument document = new XWPFDocument();
// 获取或创建样式
XWPFStyles styles = document.getStyles();
// 创建标题样式
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId("Heading1");
ctStyle.setType(STStyleType.PARAGRAPH);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal("Heading 1");
ctStyle.setName(styleName);
XWPFStyle style = new XWPFStyle(ctStyle);
styles.addStyle(style);
// 应用样式到段落
XWPFParagraph paragraph = document.createParagraph();
paragraph.setStyle("Heading1");
paragraph.createRun().setText("这是标题文本");
FileOutputStream out = new FileOutputStream("styled_document.docx");
document.write(out);
out.close();
document.close();
}
}
最佳实践和注意事项
1. 资源管理
始终确保正确关闭文档和输入/输出流,建议使用try-with-resources语句:
try (XWPFDocument document = new XWPFDocument();
FileOutputStream out = new FileOutputStream("output.docx")) {
// 文档操作代码
document.write(out);
} catch (IOException e) {
e.printStackTrace();
}
2. 性能考虑
-
对于大型文档,考虑分批处理
-
避免在循环中频繁创建新的Run对象
-
处理完成后及时释放资源
3. 异常处理
XWPFDocument操作可能抛出多种异常,包括IOException、InvalidFormatException等,需要适当处理。
4. 版本兼容性
确保使用的Apache POI版本与项目中其他依赖兼容,避免版本冲突。
常见应用场景
-
报告生成:自动生成业务报告、财务报表等
-
合同模板:批量生成个性化合同文档
-
文档转换:将其他格式数据转换为Word文档
-
内容管理:批量处理和修改Word文档内容
-
模板填充:基于模板文档填充动态数据
总结
XWPFDocument是Java生态系统中处理Word文档的强大工具。它提供了丰富的API来满足各种文档操作需求,从简单的文本处理到复杂的格式设置都能轻松应对。掌握XWPFDocument的使用,可以显著提高涉及Word文档处理的项目开发效率。
在实际项目中,建议根据具体需求选择合适的功能,同时注意性能优化和异常处理,以确保应用程序的稳定性和可靠性。随着业务需求的复杂化,XWPFDocument将继续是Java开发者处理Office文档的重要选择。
1043

被折叠的 条评论
为什么被折叠?



