java poi word详解
在日常开发中,经常需要生成或操作Word文档。Apache POI是一个非常强大的工具库,能够帮助我们轻松地处理Excel、Word等Office文件。如何使用Java中的POI库来操作Word文档,并提供多种解决方案和代码示例。
开头解决方案
Apache POI提供了对Microsoft Word文档的读写支持,主要通过XWPFDocument
类来操作.docx
格式的文件(对于.doc
文件则需要使用HWPF)。从以下几个方面进行讲解:
1. 如何创建一个新的Word文档。
2. 如何向文档中添加段落、表格等内容。
3. 如何读取已有的Word文档内容。
4. 提供多种实现思路以满足不同的业务需求。
1. 创建一个新的Word文档
创建一个新的Word文档非常简单,只需要实例化XWPFDocument
类即可。以下是一个完整的代码示例:
java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;</p>
<p>import java.io.FileOutputStream;
import java.io.IOException;</p>
<p>public class CreateWordExample {
public static void main(String[] args) throws IOException {
// 创建一个新的Word文档
XWPFDocument document = new XWPFDocument();</p>
<pre><code> // 创建一个段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("这是一个新的Word文档。");
// 设置字体样式
run.setBold(true); // 加粗
run.setFontFamily("宋体"); // 设置字体
run.setFontSize(16); // 设置字号
// 将文档保存到文件
try (FileOutputStream out = new FileOutputStream("example.docx")) {
document.write(out);
}
// 关闭文档
document.close();
}
}
说明:
- XWPFDocument
:表示整个Word文档。
- XWPFParagraph
:表示文档中的段落。
- XWPFRun
:表示段落中的文本块,可以设置字体、颜色、加粗等属性。
2. 向文档中添加表格
在Word文档中添加表格也非常常见。以下代码展示了如何创建一个包含两行三列的表格:
java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;</p>
<p>import java.io.FileOutputStream;
import java.io.IOException;</p>
<p>public class AddTableExample {
public static void main(String[] args) throws IOException {
// 创建一个新的Word文档
XWPFDocument document = new XWPFDocument();</p>
<pre><code> // 创建一个段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("下面是一个表格示例:");
// 创建一个表格
XWPFTable table = document.createTable(2, 3); // 2行3列
// 填充表格内容
for (int rowNum = 0; rowNum < 2; rowNum++) {
XWPFTableRow row = table.getRow(rowNum);
for (int cellNum = 0; cellNum < 3; cellNum++) {
XWPFTableCell cell = row.getCell(cellNum);
cell.setText("行" + (rowNum + 1) + "列" + (cellNum + 1));
}
}
// 将文档保存到文件
try (FileOutputStream out = new FileOutputStream("table_example.docx")) {
document.write(out);
}
// 关闭文档
document.close();
}
}
说明:
- XWPFTable
:表示表格。
- XWPFTableRow
:表示表格中的行。
- XWPFTableCell
:表示表格中的单元格。
3. 读取现有的Word文档
如果需要读取已有的Word文档内容,可以通过XWPFDocument
类加载文件并逐段读取内容。以下是一个示例代码:
java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;</p>
<p>import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;</p>
<p>public class ReadWordExample {
public static void main(String[] args) throws IOException {
// 打开现有的Word文档
try (FileInputStream fis = new FileInputStream("example.docx");
XWPFDocument document = new XWPFDocument(fis)) {</p>
<pre><code> // 获取所有段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
System.out.println("段落内容: " + paragraph.getText());
}
}
}
}
说明:
- 使用FileInputStream
加载Word文件。
- 调用document.getParagraphs()
获取文档中的所有段落。
4. 多种实现思路
4.1 替换模板中的占位符
在实际项目中,我们可能需要根据模板生成Word文档。以下是一个简单的占位符替换示例:
java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;</p>
<p>import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;</p>
<p>public class TemplateReplaceExample {
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("template.docx");
XWPFDocument document = new XWPFDocument(fis)) {</p>
<pre><code> // 遍历所有段落,替换占位符
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String text = paragraph.getText();
if (text != null && text.contains("${name}")) {
paragraph.getRuns().get(0).setText(text.replace("${name}", "张三"), 0);
}
}
// 保存修改后的文档
try (FileOutputStream fos = new FileOutputStream("output.docx")) {
document.write(fos);
}
}
}
}
说明:
- 模板文件中可以包含类似${name}
的占位符。
- 遍历段落并替换占位符为实际值。
4.2 插入图片
在Word文档中插入图片也很常见。以下是一个插入图片的示例:
java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;</p>
<p>import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;</p>
<p>public class InsertImageExample {
public static void main(String[] args) throws IOException {
XWPFDocument document = new XWPFDocument();</p>
<pre><code> // 创建段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
// 添加文字
run.setText("以下是一张图片:");
// 插入图片
File imageFile = new File("image.png");
BufferedImage img = ImageIO.read(imageFile);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ImageIO.write(img, "png", byteArrayOut);
run.addPicture(new FileInputStream(imageFile), XWPFDocument.PICTURE_TYPE_PNG, "image.png", 200, 200);
// 保存文档
try (FileOutputStream out = new FileOutputStream("image_example.docx")) {
document.write(out);
}
document.close();
}
}
说明:
- 使用run.addPicture()
方法插入图片。
- 需要指定图片类型(如PNG、JPG)以及图片尺寸。
通过以上几种方式,我们可以灵活地使用Java POI库来操作Word文档。无论是创建新文档、读取现有文档还是插入图片、替换模板,都可以轻松实现。希望能为你提供一些有价值的参考!