参考文档:链接
1. 修改docx文件,给要替换的内容命名
替换为文字:{{name}}
替换为图片:{{@image}}
D:/ old.docx
2. 代码部分
步骤:
- 创建map集合将要替换的内容写入
- 处理图片
- 替换docx文件
- 写到硬盘中
public class ReplaceDocx {
// 替换docx文件中的信息
private File docxReplace(String wordPath) {
// 将要替换的文字、图片写入map集合中
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("sex", "男");
map.put("address", "北京市XX区XX路");
try {
// 图片的处理
PictureRenderData pictureRenderData = Pictures.ofStream(new FileInputStream("d:\\zhangsan.jpg"), PictureType.PNG)
.size(102, 126).create();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
map.put("photo", pictureRenderData);
// 生成的新文件保存路径
File repotrFile = new File("D:\\new.docx");
try {
// 生成新的文件并写到硬盘
XWPFTemplate.compile(wordPath).render(map, new FileOutputStream(repotrFile));
} catch (IOException e) {
e.printStackTrace();
}
// Todo
// 可以对文件执行其他操作,例如:打印,在打印完毕后删除文件
// repotrFile.delete();
// 或者直接返回File
return repotrFile;
}
public static void main(String[] args) {
File file = new ReplaceDocx().docxReplace("D:\\old.docx");
}
}
3. 重点
- map集合中定义的类型:
Map<String, Object>
如果有图片则需要将vlaue值定义为Object,如果替换的内容全部是字符,则只需要定义为Map<String, String>
1.1 注意map集合key的值,只需要{{}}内的字符串即可,其他教程使用的方法,可能需要带符号。 - 图片的处理:
Pictures.ofStream(new FileInputStream("d:\\zhangsan.jpg"), PictureType.PNG).size(102, 126).create()
2.1 Pictures的构造方法有很多,此例是通过字符流构造,还可以通过BufferedImage、base64、byte[]等参数构造,详见源码。
2.2 第二个参数是创建的图片格式
2.3 size()方法,很显然是指定生成的图片大小
2.4 最重要的一点:在docx模板文件中图片的名字前要加@ - 替换模板文件并写到硬盘:
XWPFTemplate.compile(wordPath).render(map, new FileOutputStream(repotrFile));