Java动态生成含有图片的word文件(插入单张和多张图片)
1,首先创建word文档,为xx.doc形式,文档要插入的图片位置在编写的时候需要用一张图片来占位,其他参数位置设定成如图所示的 ${对象.参数名} 形式(程序中将各参数值塞到对象中,在此处通过程序中设定的对象别名获取出参数值)。
2,将.doc文件另存为 xx.xml形式
3,打开.xml文件,通过写字板打开后的格式比较乱,所以可以通过“xml在线格式化”工具进行编辑
4,word中的图片转换成xml后是base64形式,这里删除转码写上自己代码中设定的参数名
此处为单张图片的替换方式
5,在转换.xml的过程中可能会出现word中设定的参数名分家的情况
将多余部分删除掉,手动拼接成word中设定的样子
6,此处为我们要动态遍历插入的图片,同理先替换base64码为程序中设定的参数名
将需循环插入的图片位置改写为如下形式
此时的xml文件已处理完成。
7,接下来保存xml文件副本,将其改为 xx.ftl形式。
此时的word文件转换已完成,下面进入项目程序。
8,将xx.ftl文件放到resources目录下的某文件夹内
9,配置图片工具类
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @program: avengers-template
* @Author: sun
* @Description:图片工具类
*/
public class ImageUtil {
/**
* 将图片内容转换成Base64编码的字符串
* @param imageFile 图片文件的全路径名称
* @return 转换成Base64编码的图片内容字符串
*/
public static String getImageBase64String(String imageFile) {
if (StringUtils.isEmpty(imageFile)) {
return "";
}
File file = new File(imageFile);
if (!file.exists()) {
return "";
}
InputStream is = null;
byte[] data = null;
try {
is = new FileInputStream(file);
data = new byte[is.available()];
is.read(data);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
/*
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);*/
return Base64.encodeBase64String(data);
}
}
10,配置word文档工具类
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import java.io.*;
import java.util.Map;
/**
* @program: avengers-template
* @Date: 2020/10/11 19:13
* @Author: sun
* @Description:word文档工具类
*/
public class WordUtil {
/**
* 使用FreeMarker自动生成Word文档
* @param dataMap 生成Word文档所需要的数据
* @param fileName 生成Word文档的全路径名称
*/
public static void generateWord(Map<String, Object> dataMap, String fileName) throws Exception {
// 设置FreeMarker的版本和编码格式
Configuration configuration = new Configuration(new Version("2.3.30"));
configuration.setDefaultEncoding("UTF-8");
// 设置FreeMarker生成Word文档所需要的模板的路径 C:\\测试word文件夹
configuration.setDirectoryForTemplateLoading(new File("C:\\测试word文件夹"));
// 设置FreeMarker生成Word文档所需要的模板
Template t = configuration.getTemplate("xx.ftl", "UTF-8");
// 创建一个Word文档的输出流
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "UTF-8"));
//FreeMarker使用Word模板和数据生成Word文档
t.process(dataMap, out);
out.flush();
out.close();
}
}
11,生成word方法:
import com.sunvua.alan.base.utils.SessionUtil;
import com.sunvua.sys.downWord.ImageUtil;
import com.sunvua.sys.downWord.WordUtil;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
@RequestMapping({"/getWord"})
@ReadAccess(
description = "生成word"
)
public JsonResult getWordPdfPng(User user){
//查询对应的数据
List<User> users= this.userService.baseFindByIdNumber(user);
String wordPath = this.wordPdfPng(users);
return new JsonResult(true,"生成word文档成功",wordPath);
}
/**
* 生成word调用的方法
* @param
* @return
*/
public String wordPdfPng(List<User> userList){
Map<String, Object> dataMap = new HashMap<>();
User user = new User();
user.set名字(userList.get(0).get名字());
user.set证件号码(userList.get(0).get证件号码());
user.setPicture(userList.get(0).getPicture());
// 生成第二种图片集合
Iterator<User> iterator = userList.iterator();
while(iterator.hasNext()){
User user= iterator.next();
//图片集合
List<User> pictureList = new ArrayList<>();
User picTea= new User();
picTea.setEveryPicture(ImageUtil.getImageBase64String(user.getPicPath()));//从数据库中获取图片路径并转换为base64码格式
pictureList.add(picTea);
}
dataMap.put("tea", user);//tea为word中对应的字段参数
dataMap.put("pictureList",pictureList);//pictureList为word中对应的图片集合
String wordPath = "C:\\fileUpload\\" + "测试word.doc";
// 服务器word访问地址
int index = wordPath.indexOf("\\");
String newStr = wordPath.substring(index + 1);
int index1 = newStr.indexOf("\\");
String newStr1 = newStr.substring(index1 + 1);
String webPath = "http://服务器ip地址"+"/file/image/"+ newStr1;
//创建文件路径
File dest1 = new File(wordPath);
//判断文件父目录是否存在
if (!dest1.getParentFile().exists()) {
dest1.getParentFile().mkdir();
}
try {
TwoWordUtil.generateWord(dataMap, wordPath);
} catch (Exception e) {
e.printStackTrace();
}
return webPath;
}
可能会用到的包
至此为止,动态生成word已完成,生成结果如下。。。。。。。。。。