JAVA根据模板生成Word文档

2023-11-13

一、需要模板word文件和document.xml模板配置文件

首先把word文件重命名后缀改为.zip然后打开,就能在word文件夹下就能找到document.xml了

 在document.xml模板中需要赋值的地方配置好占位符。

 

 二、导入依赖,编写工具类

<dependency>
     <groupId>org.freemarker</groupId>
     <artifactId>freemarker</artifactId>
     <version>2.3.28</version>
</dependency>

GenerateWordUtils 工具类(对应路径自己修改) 

package com.example.rabbitmq.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;


public class GenerateWordUtils {
    private static Logger logger = LoggerFactory.getLogger(GenerateWordUtils.class);
    public static Configuration getConfiguration() throws IOException {
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
        //设置编码
        configuration.setDefaultEncoding("utf-8");
        //相对路径
        //configuration.setClassForTemplateLoading(GenerateWordUtils.class, "/templates");//此处设置模板存放文件夹名称
        //绝对路径
        configuration.setDirectoryForTemplateLoading(new File("D:\\S\\CMS\\rabbitmq\\src\\main\\resources\\templates"));//此处设置模板存放文件夹名称
        return configuration;
    }

    /**
     * 获取模板字符串输入流
     * @param dataMap 参数,键为绑定变量名,值为变量值
     * @param templateName 模板名称
     * @return
     */
    public static ByteArrayInputStream getFreemarkerContentInputStream(Map dataMap, String templateName) {
        ByteArrayInputStream in = null;
        try {
            Template template = getConfiguration().getTemplate(templateName);
            StringWriter swriter = new StringWriter();
            template.process(dataMap, swriter);
            //这里一定要设置utf-8编码 否则导出的word中中文会是乱码 
            in = new ByteArrayInputStream(swriter.toString().getBytes("utf-8"));
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("模板生成错误!");
        }
        return in;
    }
    //outputStream 输出流可以自己定义 浏览器或者文件输出流
    public static void createDocx(Map dataMap, OutputStream outputStream) {
        ZipOutputStream zipout = null;
        String docxPath="D:\\S\\CMS\\rabbitmq\\src\\main\\resources\\templates\\";
        try {
            //内容模板,传值生成新的文件输入流documentInput
            ByteArrayInputStream documentInput = GenerateWordUtils.getFreemarkerContentInputStream(dataMap, "document.xml");//xml模板文件名
            //最初设计的模板,原word文件生成File对象
            File docxFile = new File(docxPath+"demo1.docx");//word文件名称
            System.out.println(docxFile.exists());
            if (!docxFile.exists()) {
                docxFile.createNewFile();
            }
            ZipFile zipFile = new ZipFile(docxFile);//获取原word文件的zip文件对象,相当于解压缩了word文件
//            ZipFile zipFile = new ZipFile(docxPath+"demo1.zip");//获取原word文件的zip文件对象,相当于解压缩了word文件
            System.err.println(zipFile);
            Enumeration< ? extends ZipEntry> zipEntrys = zipFile.entries();//获取压缩文件内部所有内容
            zipout = new ZipOutputStream(outputStream);
            //开始覆盖文档------------------
            int len = -1;
            byte[] buffer = new byte[1024];
            while (zipEntrys.hasMoreElements()) {//遍历zip文件内容
                ZipEntry next = zipEntrys.nextElement();
                InputStream is = zipFile.getInputStream(next);
                if (next.toString().indexOf("media") < 0) {
                    zipout.putNextEntry(new ZipEntry(next.getName()));//这步相当于创建了个文件,下面是将流写入这个文件
                    if ("word/document.xml".equals(next.getName())) {//如果是word/document.xml由我们输入
                        if (documentInput != null) {
                            while ((len = documentInput.read(buffer)) != -1) {
                                zipout.write(buffer, 0, len);
                            }
                            documentInput.close();
                        }
                    } else {
                        while ((len = is.read(buffer)) != -1) {
                            zipout.write(buffer, 0, len);
                        }
                        is.close();
                    }
                }else{//这里设置图片信息,针对要显示的图片
                    zipout.putNextEntry(new ZipEntry(next.getName()));
                    while ((len = is.read(buffer)) != -1) {
                        zipout.write(buffer, 0, len);
                    }
                    is.close();
                }
            }
    } catch (Exception e) {
        e.printStackTrace();
        logger.error("word导出失败:"+e.getStackTrace());
    }finally {
        if(zipout!=null){
            try {
                zipout.close();
            } catch (IOException e) {
                logger.error("io异常");
            }
        }
        if(outputStream!=null){
            try {
                outputStream.close();
            } catch (IOException e) {
                logger.error("io异常");
            }
        }
    }
}

    public static void main(String[] args) throws FileNotFoundException {
        Map map=new HashMap<>();
        map.put("outWarehouseNo","1111");
        map.put("num","20");
        map.put("billLadingNo","20150200133");
        map.put("productName","小类");
        map.put("parentName","(大类)");
        map.put("quantityUnit","方");
        map.put("outQuantityNum","4543.56");
        map.put("clientName","客户1");
        map.put("repertoryName","zhongwen");
        map.put("year","2022");
        map.put("month","08");
        map.put("day","09");
        createDocx(map,new FileOutputStream("D:\\S\\CMS\\rabbitmq\\src\\main\\resources\\templates\\demo.docx"));
    }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA根据模板生成Word文档 的相关文章

随机推荐