java根据模板导出word

文章介绍了如何利用Java结合FreeMarker模板来导出Word文档。首先,制作Word模板并将其转换为XML,然后格式化XML并替换为FTL模板。在Java代码中,使用FreeMarker库读取模板,结合数据模型生成动态内容,最终输出为Word文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java中,根据模板导出Word文档通常涉及到使用某种库或框架来处理Word文件的格式和内容。Apache POI是一个流行的选择,它提供了一套完整的API来读写Microsoft Office文档,包括Word(.doc和.docx格式)。

java根据模板导出word

  • 提高效率和准确性‌:
    通过使用模板,可以预先定义好Word文档的结构、样式和格式。在需要生成文档时,只需填充模板中的占位符或变量即可,大大减少了手动编辑文档的时间和出错率。
  • 实现自动化和批量化处理‌:
    在很多业务场景中,需要生成大量格式相同的Word文档,如报告、合同、发票等。通过Java代码根据模板自动导出文档,可以实现这些任务的自动化和批量化处理,提高工作效率。
  • 增强灵活性和可定制性‌:
    使用模板并不意味着文档的内容是固定的。相反,通过Java代码可以动态地修改模板中的内容,如添加、删除或替换文本、图片、表格等。这使得生成的文档具有很高的灵活性和可定制性。
  • 保证文档的一致性和规范性‌:
    通过模板导出的Word文档可以保持一致的风格和格式,避免了因手动编辑而导致的格式混乱或不一致的问题。这对于维护企业形象、提升文档的专业性具有重要意义。
  • 便于集成和扩展‌:
    Java作为一种强大的编程语言,具有丰富的库和工具支持。使用Java根据模板导出Word文档可以方便地与其他系统进行集成,如从数据库获取数据、调用Web服务等。同时,也可以根据需要扩展功能,如添加水印、加密保护等。
  • 降低成本‌:
    通过自动化和批量化处理,可以减少对人力资源的依赖,降低企业的人力成本。同时,使用模板也可以减少因购买或定制专业文档生成软件而产生的费用。

1. 制作word模版

1.1. 模版编写 内容替换

目标下面模版进行多页展示

在这里插入图片描述

1.2. 将word转换成xml

在这里插入图片描述

1.3. 将xml格式化 再将xml改成ftl

xml格式化地址

在这里插入图片描述

1.4. list找到起始位置和结束位置

起始位置插入<#list list as l>
结束位置插入</#list>

在这里插入图片描述

2.java代码

2.1. 引入pom

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

2.2. ExportWordFtl.java

package com.liuhm.utils;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.junit.platform.commons.util.StringUtils;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *  
 *  @ClassName:ExportWordFtl
 *  @Description: TODO
 *  @Author: liuhaomin
 *  @Date: 2023/7/21 16:02
 */
public class ExportWordFtl {
    /**
     * 生成word文件
     * @param dataMap word中需要展示的动态数据,用map集合来保存
     * @param templateName word模板名称,例如:test.ftl
     * @param filePath 文件生成的目标路径,例如:D:/wordFile/
     * @param fileName 生成的文件名称,例如:test.doc
     */
    @SuppressWarnings("unchecked")
    public static File createWord(Map dataMap, String templateName, String filePath, String fileName){
        try {
            //创建配置实例
            Configuration configuration = new Configuration();
            //设置编码
            configuration.setDefaultEncoding("UTF-8");

            //ftl模板文件
            configuration.setClassForTemplateLoading(ExportWordFtl.class,"/");

            //获取模板
            Template template = configuration.getTemplate(templateName);

            //输出文件
            File outFile ;
            if(StringUtils.isBlank(filePath)){
                outFile = new File(fileName);
            }else {
                outFile = new File(filePath+ File.separator+fileName);
                //如果输出目标文件夹不存在,则创建
                if (!outFile.getParentFile().exists()){
                    outFile.getParentFile().mkdirs();
                }
            }

            //将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));

            //生成文件
            template.process(dataMap, out);

            //关闭流
            out.flush();
            out.close();
            return outFile;
        } catch (Exception e) {
            e.printStackTrace();

        }
        return null;
    }
    public static void main(String[] args) {
        List<Map<String, Object>> list = new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            Map<String, Object> map = new HashMap<>();
            map.put("datasubmit_updated_time","2023-07-02 12:12:12");
            Date date = new Date();
            map.put("nyliq",date);
            map.put("yhorq","单位名称"+i);
            map.put("xiikv","隐患类型"+i);
            map.put("kuzjg","隐患整改通知书类型"+i);
            map.put("hnvld","隐患详情"+i);
            map.put("gnbcv",date);
            map.put("malio",date);
            map.put("skpfm","整改情况告知书编号"+i);
            map.put("vgnje","整改状态"+i);
            map.put("vutap","备注"+i);
            list.add(map);
        }
        Map<String,Object> dataMap = new HashMap<String, Object>();
        dataMap.put("list", list);

        try {
            String path = "C:\\Users\\Administrator\\Desktop\\";
//            path = URLDecoder.decode(Test.class.getClassLoader().getResource("").getPath(), "UTF8");
            File file = ExportWordFtl.createWord(dataMap, "template/demo.ftl", path, "demo-t.doc");
            System.out.println("文档生成成功,路径为" + file.getAbsolutePath() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.3. 测试

执行main方法

生成文件

在这里插入图片描述

在这里插入图片描述

所有的文件格式正确
模版里面的参数 修改 防止字段为空或者字段不存在 如

${l.jfwor?string('yyyy-MM-dd')} 改成${(l.jfwor?string('yyyy-MM-dd'))!}
${l.jfwor} 改成${(l.jfwor)!}

博客地址

代码下载

下面的export-template-word

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuhm~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值