一、概述
在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片在文档中合理显示。
二、环境准备
在开始编写代码之前,需要确保项目中已经添加了 poi-ooxml
依赖。如果你使用的是 Maven 项目,可以在 pom.xml
文件中添加以下依赖:
java
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
三、代码详细解释
java
package cn.com.weisoft;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
//创建一个document对象,相当于新建一个word文档(后缀名为.docx)。
XWPFDocument document = new XWPFDocument();
//创建一个段落对象。
XWPFParagraph paragraph = document.createParagraph();
//创建一个run。run具体是什么,我也不知道。但是run是这里面的最小单元了。
XWPFRun run = paragraph.createRun();
//插入图片
try {
String imgpath = "/Users/admin/Downloads/6.jpg";
for(int i=1;i<10;i++) {
int[] wh = getImageWidthAndHeight(imgpath);
int[] afwh = transWidthAndHeight(wh);
run.setText(i+"、Hello World");
run.addBreak();
run.setText("https://www.escdns.com");
run.addBreak();
run.addPicture(Files.newInputStream(Paths.get(imgpath)),
XWPFDocument.PICTURE_TYPE_PNG,
imgpath,
Units.toEMU(afwh[0]),
Units.toEMU(afwh[1]));
}
//创建一个输出流 即是该文档的保存位置
OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/admin/Downloads/1.docx"));
document.write(outputStream);
outputStream.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
//取得图片宽度和高度
public static int[] getImageWidthAndHeight(String imgPath) {
int[] wh = new int[]{0, 0};
if (imgPath.isEmpty()) {
return wh;
}
// 读取图片文件
try {
File imageFile = new File(imgPath);
BufferedImage bufferedImage = ImageIO.read(imageFile);
if (bufferedImage != null) {
wh[0] = bufferedImage.getWidth();
wh[1] = bufferedImage.getHeight();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return wh;
}
//等比缩放
public static int[] transWidthAndHeight(int[] wh) {
int w = 410;
int h = 0;
int rh = w * wh[1] / wh[0];
int[] r = new int[]{w, rh};
return r;
}
}
四、功能说明:
4.1、包导入
org.apache.poi.util.Units
:用于单位转换,在插入图片时会将像素单位转换为 EMU(English Metric Unit)单位。
org.apache.poi.xwpf.usermodel
下的类:用于操作 Word 文档,如创建文档、段落、运行对象等。
javax.imageio.ImageIO
和 java.awt.image.BufferedImage
:用于读取图片文件并获取图片的宽度和高度。
java.io.File
、java.io.OutputStream
、java.nio.file.Files
和 java.nio.file.Paths
:用于文件操作,包括读取图片文件和创建 Word 文档输出流。
4.2、main
方法
java
XWPFDocument document = new XWPFDocument();
创建一个新的 .docx
格式的 Word 文档对象。
4.3、创建段落和运行对象
java
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
创建一个段落对象,然后在段落中创建一个运行对象。运行对象是操作文本和图片的最小单元,可以在其中设置文本、插入图片等。
4.4、循环插入文本和图片
java
for(int i=1;i<10;i++) {
int[] wh = getImageWidthAndHeight(imgpath);
int[] afwh = transWidthAndHeight(wh);
run.setText(i+"、Hello World");
run.addBreak();
run.setText("https://www.escdns.com");
run.addBreak();
run.addPicture(Files.newInputStream(Paths.get(imgpath)),
XWPFDocument.PICTURE_TYPE_PNG,
imgpath,
Units.toEMU(afwh[0]),
Units.toEMU(afwh[1]));
}
循环 9 次,每次插入编号、"Hello World" 文本、网址和一张图片。在插入图片前,先调用 getImageWidthAndHeight
方法获取图片的原始宽度和高度,再调用 transWidthAndHeight
方法进行等比缩放。
4.5、保存文档
java
OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/admin/Downloads/1.docx"));
document.write(outputStream);
outputStream.close();
创建一个输出流,将文档内容写入指定的文件路径,最后关闭输出流。
getImageWidthAndHeight
方法:
java
public static int[] getImageWidthAndHeight(String imgPath) {
int[] wh = new int[]{0, 0};
if (imgPath.isEmpty()) {
return wh;
}
try {
File imageFile = new File(imgPath);
BufferedImage bufferedImage = ImageIO.read(imageFile);
if (bufferedImage != null) {
wh[0] = bufferedImage.getWidth();
wh[1] = bufferedImage.getHeight();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return wh;
}
该方法用于获取指定路径图片的宽度和高度。如果图片路径为空,则返回 [0, 0]
。读取图片文件时,如果出现异常会打印异常信息。
transWidthAndHeight
方法:
java
public static int[] transWidthAndHeight(int[] wh) {
int w = 410;
int h = 0;
int rh = w * wh[1] / wh[0];
int[] r = new int[]{w, rh};
return r;
}
该方法用于对图片进行等比缩放。将图片的宽度固定为 410 像素,根据原始图片的宽高比计算出缩放后的高度。
五、注意事项
5.1、文件路径
代码中的图片路径和文档保存路径是硬编码的,需要根据实际情况进行修改。确保路径存在且程序有读写权限。
5.2、图片格式
代码中指定图片类型为 XWPFDocument.PICTURE_TYPE_PNG
,如果实际图片是其他格式(如 JPEG),需要相应修改。
5.3、异常处理
代码中使用了 try-catch
块捕获异常,但只是简单地打印异常信息。在实际开发中,可以根据具体需求进行更详细的异常处理。
通过以上内容便可轻轻松松完成wod导出.是不是超级简单.有任何问题欢迎留言哦!!!
重点!重点!重点!
遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!
易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)