下面我将为您提供几种最常用的场景,并附上详细的代码示例。
准备工作:添加 Apache POI 依赖
您需要在您的项目中添加 Apache POI 的依赖,如果您使用 Maven,请在 pom.xml 文件中添加以下内容:
<dependencies>
<!-- 核心 POI 库,用于处理 .docx 文件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.4</version>
</dependency>
<!-- 用于处理 .docx 文件的 OOXML 库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.4</version>
</dependency>
<!-- 用于处理 XWPF 相关的样式和布局 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
在 Word 文档的指定位置插入一张图片
这是最基础的需求,我们将创建一个 Word 文档,并在其中插入一张图片。
步骤:
- 创建
XWPFDocument对象,代表一个空的 Word 文档。 - 创建一个
XWPFParagraph段落和一个XWPFRun运行对象(Run是段落中具有相同格式的一串文本)。 - 使用
XWPFRun.addPicture()方法将图片添加到Run中。 - 设置图片的宽度、高度和类型。
- 将
XWPFDocument写入到.docx文件中。
代码示例:
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToWord {
public static void main(String[] args) {
// 1. 创建一个空的 Word 文档对象
XWPFDocument document = new XWPFDocument();
// 2. 创建一个段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
// 3. 在段落中添加文本
run.setText("这是一张测试图片:");
try {
// 4. 读取图片文件
// 请确保你的项目路径下有 "logo.png" 这张图片
// 或者使用绝对路径,"C:/Users/YourUser/Desktop/logo.png"
String imagePath = "logo.png";
java.io.FileInputStream inputStream = new java.io.FileInputStream(imagePath);
// 5. 将图片添加到 Run 中
// 参数说明:
// - inputStream: 图片输入流
// - pictureType: 图片格式 (如 PNG, JPEG)
// - width: 图片宽度 (单位:EMU - English Metric Unit, 1英寸 = 1440 EMU)
// - height: 图片高度 (单位:EMU)
run.addPicture(inputStream, XWPFDocument.PICTURE_TYPE_PNG, "logo.png", Units.toEMU(200), Units.toEMU(150));
// 6. 关闭图片输入流
inputStream.close();
// 7. 在图片后添加更多文本
run.setText("\n图片已成功插入!");
// 8. 将文档写入到 .docx 文件
try (FileOutputStream out = new FileOutputStream("InsertImageResult.docx")) {
document.write(out);
System.out.println("Word 文档生成成功,文件名为: InsertImageResult.docx");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在表格的单元格中插入图片
在 Word 表格中插入图片也很常见,例如在报表中展示图表或产品图片。
步骤:
- 创建
XWPFDocument和XWPFTable。 - 创建
XWPFTableRow和XWPFTableCell。 - 获取单元格中的段落 (
XWPFParagraph) 和运行 (XWPFRun)。 - 与场景一类似,使用
run.addPicture()方法添加图片。
代码示例:
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToTable {
public static void main(String[] args) {
XWPFDocument document = new XWPFDocument();
// 1. 创建一个表格,1行2列
XWPFTable table = document.createTable(1, 2);
XWPFTableRow row = table.getRow(0);
// 2. 设置第一列的宽度 (可选)
row.getCell(0).getCTTc().addNewTcPr().addNewTcW().setW(Units.toEMU(2000));
// 3. 在第一列的单元格中插入图片
XWPFTableCell cell1 = row.getCell(0);
XWPFParagraph paragraph1 = cell1.addParagraph();
XWPFRun run1 = paragraph1.createRun();
run1.setText("这是第一张图片");
try (java.io.FileInputStream is1 = new java.io.FileInputStream("logo.png")) {
run1.addPicture(is1, XWPFDocument.PICTURE_TYPE_PNG, "logo1.png", Units.toEMU(180), Units.toEMU(130));
} catch (Exception e) {
e.printStackTrace();
}
// 4. 在第二列的单元格中插入图片
XWPFTableCell cell2 = row.getCell(1);
XWPFParagraph paragraph2 = cell2.addParagraph();
XWPFRun run2 = paragraph2.createRun();
run2.setText("这是第二张图片");
try (java.io.FileInputStream is2 = new java.io.FileInputStream("logo.png")) {
run2.addPicture(is2, XWPFDocument.PICTURE_TYPE_PNG, "logo2.png", Units.toEMU(180), Units.toEMU(130));
} catch (Exception e) {
e.printStackTrace();
}
// 5. 保存文档
try (FileOutputStream out = new FileOutputStream("InsertImageToTableResult.docx")) {
document.write(out);
System.out.println("带图片的表格 Word 文档生成成功,文件名为: InsertImageToTableResult.docx");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在页眉或页脚中插入图片
有时需要在页眉或页脚添加公司 Logo。
步骤:
- 获取文档的
XWPFHeaderFooter对象。 - 从页眉/页脚中获取或创建一个段落。
- 在段落中获取或创建一个
Run。 - 使用
run.addPicture()方法添加图片。
代码示例:
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToHeader {
public static void main(String[] args) {
XWPFDocument document = new XWPFDocument();
// 1. 获取页眉
XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
// 2. 在页眉中创建一个段落,并右对齐
XWPFParagraph paragraph = header.createParagraph();
paragraph.setAlignment(ParagraphAlignment.RIGHT);
XWPFRun run = paragraph.createRun();
// 3. 在页眉中添加图片
try (java.io.FileInputStream is = new java.io.FileInputStream("logo.png")) {
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, "header_logo.png", Units.toEMU(100), Units.toEMU(50));
run.setText(" "); // 添加一些空格,使图片和文本分开
} catch (Exception e) {
e.printStackTrace();
}
// 4. 在文档主体中添加一些内容
XWPFParagraph bodyParagraph = document.createParagraph();
bodyParagraph.createRun().setText("这是文档的主体内容,页眉中已经添加了图片。");
// 5. 保存文档
try (FileOutputStream out = new FileOutputStream("InsertImageToHeaderResult.docx")) {
document.write(out);
System.out.println("带页眉图片的 Word 文档生成成功,文件名为: InsertImageToHeaderResult.docx");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
重要提示和注意事项
-
图片类型:
addPicture方法的第二个参数pictureType必须与图片的实际格式匹配,常用的有:XWPFDocument.PICTURE_TYPE_PNG(对应 .png)XWPFDocument.PICTURE_TYPE_JPEG(对应 .jpg, .jpeg)XWPFDocument.PICTURE_TYPE_EMF(对应 .emf)XWPFDocument.PICTURE_TYPE_WMF(对应 .wmf)XWPFDocument.PICTURE_TYPE_DIB(对应 .dib)
-
尺寸单位:图片的宽度和高度使用
Units.toEMU()方法进行转换。EMU(English Metric Unit) 是 POI 内部使用的单位,1英寸 = 1440 EMU,如果你习惯使用像素,可以自己转换,widthInPixels * 1440 / 96(假设 DPI 为 96)。 -
.docvs.docx:- Apache POI 不能 直接操作旧版的
.doc文件。.doc是二进制格式,处理起来非常复杂。 - POI 专门用于处理
.docx格式,这是基于 XML 的,易于读写和操作。 - 如果必须处理
.doc文件,可以考虑使用 Jacob 或其他库,但通常建议直接生成.docx,因为现在绝大多数软件都兼容。
- Apache POI 不能 直接操作旧版的
-
资源管理:代码中使用了
try-with-resources语句(try (FileOutputStream out = ...))来确保文件流和文档对象在使用后被正确关闭,防止资源泄漏,这是一个非常好的编程习惯。 -
复杂布局:对于复杂的 Word 布局(如文本环绕图片、图文混排等),使用纯 POI 会变得非常困难和繁琐,在这种情况下,可以考虑使用更高级的库,如 docx4j 或 Aspose.Words,它们提供了更强大的 API 来精确控制 Word 文档的样式和布局,但通常是商业软件(有免费试用版)。
希望这些示例和说明能帮助您成功地在 Java 中实现图片导出到 Word 的功能!
