Java动态生成含有图片的word文件(插入单张和多张图片)

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已完成,生成结果如下。。。。。。。。。。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值