java代码的freemarker模板将JSP页面转换成word文档导出

news2024/11/29 3:58:32

使用java代码的freemarker模板将JSP页面转换成word文档导出

使用java代码的freemarker模板将JSP页面转换成word文档导出

一、准备好freemarker模板,

我的模板是这样的

在这里插入图片描述

需要特别注意的是,这些名字的写法是很特殊的,这个模板是wps在进行word文档编辑的时候,

在这里插入图片描述

在点击之后,选择里面的填写数据名称

在这里插入图片描述

填写的时候,注意写法,

写法:${数据名称}

注意点:填写的时候,不能进行复制粘贴,写错了之后,就删除之后重新填写,要不人在进行后面操作会出错很难弄,只能一个一个的填写,本博主在进行模板填写时候填写了一天,所以切记**不要复制粘贴,不要走复制粘贴,不要走复制粘贴,**重要的事重复三遍。

二、xml文件格式化

在word文档的模板准备好之后,点开它,把它另保存为**Word XML文档(*.xml)类型的文件,在使用富文本进行打开,本博主使用的是nodepad++**软件打开的,复制里面的文字之后,使用浏览器搜素xml格式化,如:

在这里插入图片描述

把xml文件里面的文字赋值到这里进行格式化,复制一个xml文件副本,把这个副本后缀改为.ftl,之后,使用nodepad++文件打开之后,把格式化后的文字粘贴到后缀文件为.ftl的文件里面,这个文件就是最终的模板文件了,

三、导入依赖

导入文件需要的依赖,本博主的依赖是

<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.core</artifactId>
			<version>2.0.2</version>
		</dependency>
		<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.document</artifactId>
			<version>2.0.2</version>
		</dependency>
		<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.template</artifactId>
			<version>2.0.2</version>
		</dependency>
		<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
			<version>2.0.2</version>
		</dependency>
		<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
			<version>2.0.2</version>
		</dependency>
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.23</version>
		</dependency>

添加依赖之后,注意: 依赖的版本要适合自己的程序

模板文件的位置:

在这里插入图片描述

四、主程序:

代码:

//这个是使用map集合来保存需要进行渲染的数据集的,
Map<String,Object> map = new HashMap<>();
//使用map.put来吧需要进行渲染的数据一以及数据的名称保存起来,在进行模板渲染

//在添加数据完成之后,

//这个是在
private static Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);

//这个是获取程序里模板文件以及模板文件
//ResourceUtils.CLASSPATH_URL_PREFIX 获取程序里面得模板所在得resource路径,这是我程序里面的工具类,需要自己去找到自己程序里面模板的这个路径
 File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "template/");
			//获取模板文件并且设置给configuration
            configuration.setDirectoryForTemplateLoading(file);
			//设置编码格式
            configuration.setDefaultEncoding("utf-8");

			//获取模板文件名称
            Template free = configuration.getTemplate("SummaryExportTemplate.ftl");
			//这个是中间文件的名字,这个名字是随便取得
            String testName = "test";

            File doc = null;
            FileInputStream ist = null;
            ServletOutputStream oust =null;
			try {
                doc = createDoc(map, free, testName);
                ist = new FileInputStream(doc);
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/x-download");
                wordTitle = new String(wordTitle.getBytes(), "ISO-8859-1");
                //使用浏览器下载
                response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(wordTitle)));
                oust = response.getOutputStream();
                byte[] buffer = new byte[512];// 缓冲区
                int bytesToRead = -1;
                while ((bytesToRead = ist.read(buffer)) !=-1){
                    oust.write(buffer,0,bytesToRead);
                }
            }finally {
                if (ist !=null){
                    ist.close();
                }
                if (oust != null){
                    oust.close();
                }
                if (doc !=null){
                    doc.delete();
                }
            }

private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;

    }

@Override
    public Results<?> companyDeclareSummaryWord(CompanyDeclareQuery query, HttpServletResponse response) {

        try {

            Map<String, Object> args = new HashMap<String, Object>();
            args.put("id", query.getId());
            //初审3
            args.put("scoreField", "q.ass1_score");
            
            CompanyDeclareTatalScoreVo tatal = companyDeclareMapper.getScoreTatalByDeclareIdAndScoreField(args);

            Map<String,Object> arge = new HashMap<>();
            arge.put("id",query.getId());
            CompanyDeclare declare = companyDeclareMapper.selectCompanyDeclare(arge);
            //文件名字
            String wordTitle = declare.getCompanyName()+"优秀企业评选主要指标计分表"+".docx";
            

            //查询资质得分信息
            CompanyDeclareQualQuery qualQuery = new CompanyDeclareQualQuery();
            qualQuery.setDeclareId(query.getId());
            List<CompanyDeclareQual> declareQualList = companyDeclareQualService.selectCompanyDeclareQuals(qualQuery).getData();
            tatal.setDeclareQualList(declareQualList);
            //保存数据得集合
            Map<String,Object> map = new HashMap<>();
            map.put("tatalqual2",tatal.getQualScore());
            Double tatalqual1 = (tatal.getQualScore() > 3 ? 3 :tatal.getQualScore());
            //保存数据
            map.put("tatalqual1",tatalqual1);




            File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "template/");
            configuration.setDirectoryForTemplateLoading(file);
            configuration.setDefaultEncoding("utf-8");


            Template free = configuration.getTemplate("SummaryExportTemplate.ftl");
            String testName = "test";
            File doc = null;
            FileInputStream ist = null;
            ServletOutputStream oust =null;
            try {

                doc = createDoc(map, free, testName);
                ist = new FileInputStream(doc);
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/x-download");
                wordTitle = new String(wordTitle.getBytes(), "ISO-8859-1");
                //使用浏览器下载
                response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(wordTitle)));
                oust = response.getOutputStream();
                byte[] buffer = new byte[512];// 缓冲区
                int bytesToRead = -1;
                while ((bytesToRead = ist.read(buffer)) !=-1){
                    oust.write(buffer,0,bytesToRead);
                }
            }finally {
                if (ist !=null){
                    ist.close();
                }
                if (oust != null){
                    oust.close();
                }
                if (doc !=null){
                    doc.delete();
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    private static Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);

	//创建word文件以及编码
    private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;

    }

模板文件的路径:

在这里插入图片描述
**如果测试无效的可以联系博主进行寻求帮助!

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

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

相关文章

100种思维模型之放大关键行动思维模型-75

很多时候&#xff0c;决定结果大小的是 关键行动的执行程度&#xff0c; 所以我们要适时 放大关键行动 &#xff01; 放大关键行动思维模型&#xff0c;一个 告诉我们 事前思考寻找能够破局的关键点&#xff0c;落实时要放大关键点上的行动 的思维模型。 01、何谓放大关键行动…

《Kali渗透基础》06. 主动信息收集(三)

kali渗透 1&#xff1a;服务识别1.1&#xff1a;NetCat1.2&#xff1a;Socket1.3&#xff1a;dmitry1.4&#xff1a;nmap 2&#xff1a;操作系统识别2.1&#xff1a;Scapy2.2&#xff1a;nmap2.3&#xff1a;p0f 3&#xff1a;SNMP 扫描3.1&#xff1a;onesixtyone3.2&#xff…

AI初体验 - 最初的两次AI辅助开发

1.第一个尝试&#xff1a;物理公式 2023年6月7日&#xff0c;是我第一次在 AI(ChatGPT)的帮助下&#xff0c;完成了一个数据分析工作。当时手里有一些数据&#xff0c;我大致知道物理原理&#xff0c;但是无法给出一个合适的公式。我大概工作了5个小时&#xff0c;没有进展&am…

RTP介绍

一、简介 Real-time Transport Protocol(实时传输协议) 具体参考rfc3350介绍 可负载H264、H265、G711A、AAC、PS、私有流等各种数据。 二、格式 RTP 固定头部格式如下 version (V): 2bits RTP协议版本号 目前协议版本为2 padding (P): 1bit 填充位 设置成1&#xff…

无线led显示屏的优势

无线LED显示屏是一种利用无线技术进行数据传输和控制的LED显示屏&#xff0c;相比传统有线连接的LED显示屏&#xff0c;具有以下优势&#xff1a; 灵活性和便捷性&#xff1a;无线LED显示屏无需使用复杂的有线连接&#xff0c;可以通过无线网络进行数据传输和控制。这使得安装和…

Linux内核中内存管理相关配置项的详细解析1

本文基于kernel 6.1.0&#xff0c;针对于“Linux/x86 6.1.0 Kernel Configuration”中的“Memory Management options”项下的各个子配置项&#xff08;如下图所示&#xff09;进行详细解析。 一、Support for paging of anonymous memory (swap) 这个选项以前位于“General S…

deepin 安装 MySQL

1.下载网址&#xff1a;MySQL :: Begin Your Downloadhttps://dev.mysql.com/downloads/file/?id519241 不用注册&#xff0c;直接下载 2. 打开下载文件&#xff1a;mysql ......deb 文件 3 选择步骤&#xff1a;选ubuntu bionic 4 ->MySQL Server&Cluster->mysq…

钢铁废水除氟

钢铁工业废水含多种污染物&#xff0c;包括大量的挥发酚、氟化物、石油类、悬浮物、砷、铅等有害物质。其中含氟工业废水的大量排放&#xff0c;不仅污染环境&#xff0c;还会危害到农作物和牲畜的生长发育&#xff0c;并且可以通过食物链影响到人体健康。所以对含氟废水需降氟…

去掉字符串中的空格,通过正则根据不同的需求分别能去掉前、后、前后、中间的空格。

正则小tips&#xff1a; 正则表达式 - 修饰符 gglobal - 全局匹配 正则表达式 - 元字符 ^匹配输入字符串的开始位置。*匹配前面的子表达式零次或多次。$匹配输入字符串的结束位置。\s 匹配任何空白字符&#xff0c;包括空格、制表符、换页符等等。 匹配前面的子表达式一次…

【计算机组成与体系结构Ⅰ】章节测试(5-7)

在CPU中跟踪指令后继地址的寄存器是___。 A 主存地址寄存器 B 程序计数器 &#xff08;我的答案&#xff09; C 指令寄存器 D 状态条件寄存器 下面描述的RISC机器基本概念中&#xff0c;正确的表述是 __。 A. RISC机器不一定是流水CPU. B. RISC机器一定是流水CPU. &#…

基于Tensorflow+SDD+Python人脸口罩识别系统(深度学习)含全部工程源码及模型+视频演示+图片数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Anaconda 环境搭建 模块实现1. 数据预处理2. 模型构建及算法实现3. 模型生成 系统测试1. 训练准确率2. 运行结果 工程源代码下载其它资料下载 前言 在当今全球范围内&#xff0c;新冠疫情对我们的生活方式带来了…

单核 CPU 支持 Java 多线程吗?我们来一起看看吧

1 前言 由于现在大多计算机都是多核CPU&#xff0c;多线程往往会比单线程更快&#xff0c;更能够提高并发&#xff0c;但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁&#xff0c;你的程序反而不能支持更高的TPS。 2 时间…

超图使用问题汇总

超图使用问题汇总 切地图栅格瓦片的时候&#xff0c;必须确认生成地图的源数据坐标系已经被识别&#xff0c;否则无法进行全球剖分 下图就是未识别坐标系的情况 切地图矢量瓦片的时候&#xff0c;需要使用idesktopx来切&#xff0c;idesktop无法生成矢量瓦片。 矢量瓦片切片时…

Ubuntu安装docker-compose

官网 Install Compose standalone curl -SL https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose离线 下载文件 开启vpn浏览器https://github.com/docker/compose/releases/download/v2.18.1/dock…

第九篇:强化学习Q-learning算法 通俗介绍

你好&#xff0c;我是郭震&#xff08;zhenguo) 今天介绍强化学习第九篇&#xff1a;Q-learning算法 前面我们介绍强化学习基本概念&#xff0c;马尔科夫决策过程&#xff0c;策略迭代和值迭代&#xff0c;这些组成强化学习的基础。 从今天开始逐步介绍常用强化学习算法&#x…

QT调用linux外部命令或者shell script

目录 原文链接&#xff1a;https://blog.csdn.net/YMGogre/article/details/128973098 0、本文使用的环境配置&#xff1a; 1、新建一个简单的Shell脚本&#xff1a; 2、在Qt中启动外部Shell脚本&#xff1a; 2.1、使用标准库中提供的方法 —— system() 2.2、使用Qt提供…

接口抓包分析与Mock实战

这里写目录标题 一、知识点梳理1、接口抓包需要具备的能力2、接口抓包原理 二、Charles 基础使用三、charles抓包分析四、Charles 使用1、过滤&#xff1a;Filter、Focus2、重发&#xff1a;Repeat、Repeat Advanced3、修改请求&#xff1a;Compose4、弱网&#xff1a;Throttle…

实验3 Tomasulo算法【计算机系统结构】

实验3 Tomasulo算法【计算机系统结构】 前言推荐实验3 Tomasulo算法1 实验目的2 实验平台3 实验内容和步骤4 实验总结与心得 最后 前言 2023-6-9 9:19:50 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 实验2 指令调度和延迟分支【计算机系统结构】 实验3 To…

webgpu之旅03

19854902 319854902 319854902 319854902 webgpu交Q流群我们找个例子看看别人的renderer three.js v152 首先init函数 看见中间有个对象 WebGPURenderPipelines 跟进去看看 这个构造函数里可以看见有这么些数据 get( renderObject ) {const device this.device;const cache …

Meetup 报名|06.17 StarRocks Friends 与你相约上海

StarRocks & Friends 是由 StarRocks 社区发起的城市线下 meetup&#xff0c;旨在联合社区与行业的专家小伙伴们分享基于 StarRocks 的最佳实践、大数据分析的前沿技术和 StarRocks 生态融合等热门话题。 不远千里奔赴&#xff0c;只为与你相聚。这个夏天&#xff0c;让我们…