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

使用 EasyPoi 生成 Word 时循环插入多张图片,需要注意依赖版本要在 4.3.0+,因为该版本才支持多图片循环导出。以下是具体实现步骤及示例: ### 1. 添加依赖 在项目的 `pom.xml` 中添加必要的依赖: ```xml <!-- word导出 方式:easypoi --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.3.0</version> </dependency> <!--注意:word中要使用循环等标签必须单独导入以下依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.4</version> </dependency> ``` ### 2. 创建 Word 模板 事先定义好 Word 模板,放入项目的指定位置,建议在 `resources` 下新建一个目录,例如 `exportTemplate` [^2]。 ### 3. 编写代码 使用 `WordExportUtil.exportWord07` 方法生成 `.docx` 格式的 Word 文档,该方法的第一个参数为 Word 模板文件名,第二个参数是一个 `Map` 对象,其中包含了模板中所有的占位符对应的数据 [^1]。 以下是一个简单的示例代码: ```java import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class EasyPoiWordExport { public static void main(String[] args) { // 准备图片数据 List<String> imagePaths = new ArrayList<>(); imagePaths.add("path/to/image1.jpg"); imagePaths.add("path/to/image2.jpg"); imagePaths.add("path/to/image3.jpg"); // 准备数据模型 Map<String, Object> data = new HashMap<>(); data.put("images", imagePaths); // 模板文件路径 String templatePath = "exportTemplate/wordTemplate.docx"; // 输出文件路径 String outputPath = "output.docx"; try { // 生成 Word 文档 XWPFDocument document = WordExportUtil.exportWord07(templatePath, data); // 保存文档 FileOutputStream fos = new FileOutputStream(outputPath); document.write(fos); fos.close(); System.out.println("Word 文档生成成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 4. 模板设置 在 Word 模板中,使用相应的标签来标识图片循环的位置,例如使用 `{{$fe:images}}` 来表示图片列表的循环。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值