使用FreeMarker自定义生成word文档

news2024/11/25 12:39:15

使用FreeMarker自定义生成word文档

最终生成word文档如下:
在这里插入图片描述

实现思路:
  1. 按照要生成的文档模板格式,创建一个新的word(doc)文档,将其调整成所需格式,然后处理其中需要动态填充的数据,如下:
    在这里插入图片描述
  2. 将该word文档另存为Word 2003 XML 文档(*.xml)格式,然后将其后缀改为.ftl
  3. 此时该.ftl文件里的内容格式可能不规范,规范其内容,例如:”${map.projectName}“中间可能被其他字符给分隔。所以要把中间的无用字符给删掉;
  4. 最后生成的文件可能长这样:
    在这里插入图片描述
功能实现:

模板已经写好,现在就是后端代码实现了。

	/**
     * 生成word
     * @param projectInformation	该课题信息对象
     * @param dir	要生成的word的存储路径
     * @return
     * @throws Exception
     */
    public static String exportWord(ProjectInformation projectInformation, String dir){

        File file = new File(dir);
        if (!file.exists()){
            file.mkdirs();
        }
        Configuration conf = new Configuration();
        conf.setDefaultEncoding("UTF-8");
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(dir));
        // 加载模板
        String separator = File.separator;
        Template template = conf.getTemplate("templatePrint.ftl");
        template.setEncoding("UTF-8");
        // 定义数据
        Map root = new HashMap();

        Map<String, Object> map = new HashMap<>();
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("projectName",projectInformation.getName());
        }else {
            map.put("projectName","");
        }
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("projectNumber", projectInformation.getNumber());
        }else {
            map.put("projectNumber","");
        }
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("serialNumber",projectInformation.getSerial());
        }else {
            map.put("serialNumber","");
        }

        SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
        String currentTime = sf.format(new Date());
        map.put("currentTime",currentTime);
        root.put("map",map);

        // 定义输出
        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");//设置日期格式
        String date = f.format(new Date(System.currentTimeMillis()));
        Random random = new Random();
        int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数
        String fileName = date+rannum+"标签.doc";
        //判断文件夹是否存在,不存在则创建
        File fileDir = new File(HtmlUtil.getAppDir()+separator+"Template");
        if (!fileDir.exists()){
            fileDir.mkdirs();
        }
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(HtmlUtil.getAppDir()+separator+"Template" + separator+fileName),"UTF-8"));
        template.process(root, out);
        out.flush();
        out.close();
        return fileName;
    }    
    
##### 补充:
如果要生成的文档里面包含表格,怎么循环放置数据?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stable diffusion如何确保每张图的面部一致?

可以使用roop插件&#xff0c;确定好脸部图片后&#xff0c;使用roop固定&#xff0c; 然后生成的所有图片都使用同一张脸。 这款插件的功能简单粗暴&#xff1a;一键换脸。 如图所示&#xff1a; 任意上传一张脸部清晰的图片&#xff0c;点击启用。 在其他提示词不变的情况下…

LoRA: 大模型快速训练的秘诀

本文是四两拨千斤&#xff0c;训练大模型的PEFT方法的最后一小节&#xff0c;感兴趣读者可以阅读完整版。 LoRA LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 核心思路是对模型参数做低秩分解&#xff0c;仅训练分解后的参数&#xff0c;模型部署也需额外保存低秩参数&…

SIP业务之BLF

BLF&#xff08;Busy Lamp Field&#xff09;是SIP应用中的一项重要业务&#xff0c;用来监视目标号码的状态&#xff0c;常用于调度、坐席监控等场景。 一、 BLF原理 BLF功能需要IP终端或话机与SIP服务器协同实现的&#xff0c;主要流程如下&#xff1a; IP话机向SIP服务器发…

如何使用 ChatGP在TTPU(张量处理单元)上训练模型的指令

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a;NSDT简石数字孪生. ChatGPT 作为您的专家助手 ChatGPT 可以帮助我们学习新的编程语言、课程、技术和技能。它已成为许多寻求改进工作流程或学习新事物的专业人士的首选工具。ChatGPT 专家助手提示可以减…

IntelliJ IDEA安装教程

一、下载安装包 首先进入IDEA官网下载2021.2.1版本的安装包&#xff0c;不要问我为什么不下最新版&#xff0c;后面我会说。 二、安装与配置 打开安装包&#xff0c;安装完成后选择Evaluate for free&#xff08;免费试用&#xff09;&#xff0c;创建一个项目&#xff0c;进入…

基于单片机空气质量检测二氧化碳 一氧化碳温湿度PM2.5检测系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;对空气空气中有毒有害气体进行监测&#xff1b;使用LCD1602液晶显示&#xff0c;采集到的PM2.5值通过单片机串口传输&#xff1b;通过传感器对室内PM2.5粉尘进行检查&#xff1b;通过按键设置的上限值&#xff1b;当检测到有毒气体…

5.2 基于ROP漏洞挖掘与利用

通常情况下栈溢出可能造成的后果有两种&#xff0c;一类是本地提权另一类则是远程执行任意命令&#xff0c;通常C/C并没有提供智能化检查用户输入是否合法的功能&#xff0c;同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出&#xff0c;这就给恶意代码的溢出提供了…

网络ping丢包什么原因(附解决方案)

​  数据包丢失是一种网络问题&#xff0c;当通过网络(或设备之间或通过 Internet)传输的数据包在传输过程中丢失或丢弃并且无法到达目的地时&#xff0c;就会发生这种情况。简单来说&#xff0c;数据包丢失是指数据包无法通过互联网从发送者成功传输到接收者。 如何检测数据…

阿里云RockMQ与SpringBoot的整合

前言&#xff1a; 开源版本Rocket和商业版本的RocketMQ有些不同&#xff0c;研究的是商业版本的RocketMQ&#xff0c;阿里云的官方文档&#xff0c;感觉有点乱。看不咋明白&#xff0c;网上虽然有教程&#xff0c;大都还是有点缺少&#xff0c;有时候会突然跳了步骤&#xff0c…

微信小程序开发1

这里写目录标题 一、结构1.项目结构页面结构 3.小程序的通信模型4.小程序运行机制 二、组件视图容器组件 : 一、结构 1.项目结构 页面结构 2.语言结构 WXML与HTML区别 : WXSS与CSS区别 : .Js文件的分类 3.小程序的通信模型 ①他是由渲染层与逻辑层 根据微信客户端进行转…

RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

文章目录 一、使用Zookeeper的意义二、Zookeeper基础1 文件系统2 通知机制3 原生zkclient API存在的问题4 服务配置中心Zookeeper模块 三、Zk类实现Start方法创建节点、get节点值方法 四、框架应用rpc提供端框架rpc调用端&#xff08;客户端&#xff09;框架 总结 一、使用Zook…

平均精度 (mAP):常见定义、误区和误解

我们分解并揭开了常见对象检测指标的神秘面纱,包括平均精度 (mAP) 和平均平均召回率 (mAR)。 这篇文章深入介绍了如何正确计算和使用平均平均精度 (mAP) 和平均平均召回率 (mAR) 进行对象检测,同时消除对 AP、mAP 和第三方库(例如 TorchMetrics 或 pycocotools)的常见误解。…

基于冻土水文模拟的松花江流域水资源演变规律

原文信息 题目&#xff1a;基于冻土水文模拟的松花江流域水资源演变规律 作者&#xff1a;刘水清 周祖昊 刘佳嘉 李佳 谢新民 贾仰文 王浩 期刊&#xff1a;《南水北调与水利科技&#xff08;中英文&#xff09;》23年1期 摘要 为分析松花江流域水资源的演变规律&#…

基于SpringCloud微服务图书管理系统设计与实现

一、引言 本次设计基于JavaEE和SpringCloud微服务的图书馆管理系统。利用当前计算机技术的快速发展来构建图书馆管理系统。 随着计算机技术和网络的飞速发展,互联网与互联网加的程序应用在世界范围内越来越流行,当今社会正迅速进入信息社会,信息自动化的作用也日益增强。…

MySQL基础篇第7章(单行函数)

文章目录 1、函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数分类 2、数值函数2.1 基本函数2.2 角度与弧度互转函数2.3 三角函数2.4 指数和对数2.5 进制间的转换 3、字符串函数4、日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星…

815. 打印字符串

链接&#xff1a; 链接 题目&#xff1a; 给定一个字符串&#xff0c;请你编写一个函数&#xff0c;void print(char str[])&#xff0c;将这个字符串打印出来。 输入格式 共一行&#xff0c;包含一个字符串。 输出格式 共一行&#xff0c;表示打印出的字符串。 数据范围 1≤字…

STM32 Proteus仿真ili9341 TFT2048小游戏 -0067

STM32 Proteus仿真ili9341 TFT2048小游戏 -0067 Proteus仿真小实验&#xff1a; STM32 Proteus仿真ili9341 TFT2048小游戏 -0067 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 ili9341 TFT显示器上下左右方向键赢了按键输了按键 1.标准2048经典游戏玩法&#…

LayUI之动态选项卡Tabiframe使用

目录 一.LayUI之动态选项卡 1.什么是LayUI之选项卡&#xff1f; 1.2layui选项卡使用语法 2. 在企业中LayUI选项卡的使用 二.将layui选项卡部署在web项目中 1.首先查看layui官方文档 2.加入Jsp 3.加入数据&#xff0c;并进行bug修复 3.1首先在我们的二级菜单添加一个点击…

GPT-4的详细信息已经泄露

这位作者说GPT-4的详细信息已经泄露&#xff0c;不知道可信度如何。一些关键信息&#xff1a;- GPT-4的大小是GPT-3的10倍以上。我们认为它在120层中总共有大约1.8万亿个参数。- GPT-4是多个专家模型混合在一起&#xff0c;但不是之前说的8个专家&#xff0c;而是16个。研究人员…

Linux获取文件夹下的所有文件名称

用shell脚本的方式实现 新建脚本文件 fapiao.sh [rootiZbp1bjm0o6frv1c7pp8uaZ home]# vim fapiao.sh编写脚本内容 #!/bin/bash# path文件夹路径 path/home/发票文件 #列出文件名 files$(ls $path)for filename in $files do#将文件名打印至filename.txt 或者路径文件 /hom…