freemark模板导出word-01-简单文本内容

news2024/10/7 10:20:00

在一些项目中,会遇到导出固定格式的word文档,这个时候我们可以使用模板freemarker来实现,本文先分享简单的字符串填充。

比如现在有一个word模板的样式如下

 我们填充好内容后(重点坑点:先采用记事本类似的将${A1}编辑好,复制到word模板中,确保${A1}是一个完整的整体);然后点击word,另存为word 2003 xml文档(.xml)。业务代码中我们生成数据,最后在检查结果一列使用${xxx}来获取数据。

 

private static void test001() throws Exception{
        String word_xml_temp_01="D:\\data\\exportWord1\\tmp201.xml";
        Map<String,String> resultMap=getData01();
        String currentTime = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        String filePath = new StringBuilder(currentTime).append(".doc").toString();
        FileUtil.mkdir(wordDir);
        File outFile = new File(new StringBuilder(wordDir).append("/").append(filePath).toString());
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_20);
        configuration.setDefaultEncoding("utf-8");
        configuration.setDirectoryForTemplateLoading(new File(wordDir));
        InputStream inputStream = new FileInputStream(new File(word_xml_temp_01));
        String fileXmlPath = new StringBuilder(currentTime).append(".xml").toString();
        File xmlFile = new File(new StringBuilder(wordDir).append("/").append(fileXmlPath).toString());
        FileUtils.copyInputStreamToFile(inputStream, xmlFile);
        Template t = configuration.getTemplate(fileXmlPath, "utf-8");
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 102400);
        t.process(resultMap, out);
        out.flush();
        out.close();
    }

 private static Map<String, String> getData01() {
        Map<String,String> resultMap=new HashMap<>();
        resultMap.put("A1","A1-101");
        resultMap.put("B1","B1-101");
        resultMap.put("B2","B2-101");
        resultMap.put("B3","B3-101");
        resultMap.put("B4","B4-101");
        resultMap.put("B5","B5-101");
        resultMap.put("B6","B6-101");
        resultMap.put("B7","B7-101");
        return resultMap;
    }

这样就在wordDir下面生成一份word文档,如果需要下载使用http中response输出即可;可以参考一下代码:

@RequestMapping(value = "/xxxx")
    public void exportToWordById(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, String> resultMap = getDataMap();//获取数据
        String currentTime = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        String filePath = new StringBuilder(currentTime).append(".doc").toString();
        FileUtil.mkdir(wordDir);
        File outFile = new File(new StringBuilder(wordDir).append("/").append(filePath).toString());
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setDirectoryForTemplateLoading(new File(wordDir));

        ClassPathResource classPathResource = new ClassPathResource(XMLPATH_XML);
        InputStream inputStream = classPathResource.getInputStream();
        String fileXmlPath = new StringBuilder(String.valueOf(currentTime)).append(".xml").toString();
        File xmlFile = new File(new StringBuilder(wordDir).append("/").append(fileXmlPath).toString());
        FileUtils.copyInputStreamToFile(inputStream, xmlFile);

        Template t = configuration.getTemplate(fileXmlPath, "utf-8");
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 102400);
        t.process(resultMap, out);
        out.flush();
        out.close();
        response.setContentType("application/msword");
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        String exportFileName = filePath;
        String userAgent = request.getHeader("USER-AGENT");
        if (StringUtils.isNotEmpty(userAgent)) {
            if (userAgent.contains("MSIE")) {// IE浏览器
                exportFileName = URLEncoder.encode(exportFileName, "UTF8");
            } else if (userAgent.contains("Mozilla")) {// google,火狐浏览器
                exportFileName = new String(exportFileName.getBytes(), "ISO8859-1");
            } else {
                exportFileName = URLEncoder.encode(exportFileName, "UTF8");// 其他浏览器
            }
        }

        response.setHeader("content-disposition", "attachment;filename=" + exportFileName);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(outFile));
        OutputStream os = response.getOutputStream();
        byte[] bs = new byte[1024 * 10];
        int size = bis.read(bs);
        while (size > 0) {
            os.write(bs, 0, size);
            size = bis.read(bs);
        }
        bis.close();
        os.flush();
        if (outFile != null) {
            outFile.delete();
        }
        if (inputStream != null) {
            inputStream.close();
        }
        if (xmlFile != null) {
            xmlFile.delete();
        }
    }

ClassPathResource classPathResource = new ClassPathResource(XMLPATH_XML);模板文件放置在maven项目源码的src\main\resources目录下;

重点:xml文件中${xxx}必须是一个整体;取值的key必须存在,可以设置初始化为空字符串;docker环境下读取路径使用ClassPathResource来读取模板文件

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

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

相关文章

简易画笔效果

使用代码创建纯白图片&#xff0c;图片大小要与image组件大小相同 使用OnDrag触摸的时候将触摸点周围的像素都改为透明 使用shader判断两张图&#xff0c;只要有一张图像素点透明的地方就都透明 shader代码 Shader "Hidden/Draw" {Properties{_MainTex ("Textu…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、执行完这段程序后,可以在舞台上画出一个正方形 答案:错 考点分析:考查积木综合使用,重点考查画笔积木的使用,从程序中可以看出落笔是在最后,所以在落笔之前绘制的图形是不会显示出来,没…

机器学习服务语音合成,解锁智能养娃新趋势

从翻阅图书绘本到捧着电子书&#xff0c;再到点开手机里的音频APP&#xff0c;随着“互联网阅读”的逐步深入&#xff0c;儿童有声读物越来越受95后父母的欢迎&#xff0c;它的出现令年轻父母摆脱了为孩子讲故事的辛苦&#xff0c;而且有声读物配音发音更加标准&#xff0c;有助…

每日学术速递5.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Not All Languages Are Created Equal in LLMs: Improving Multilingual Capability by Cross-Lingual-Thought Prompting 标题&#xff1a;并非所有语言在 LLM 中都是平等的&#…

直流电机 PID 控制系统仿真研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

openGauss数据库3.0.0升级5.0.0操作实践

文章目录 1.1 前言1.2 升级须知升级流程升级方式升级约束 1.3 升级前准备1.4 升级操作1.5 升级验证1.6 提交升级 1.1 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。之前基于3.0.0版本进行了一些实践&#xff0c;本篇就详细介绍如何将o…

Win7/Win10/Win11系统怎么显示文件后缀

在不同版本的Windows系统中&#xff0c;如Win7/Win10/Win11&#xff0c;显示文件的后缀名可能会有所不同。为了方便用户在进行文件管理时更加方便和高效&#xff0c;本文整理了Win7/Win10/Win11系统中显示文件后缀的具体方法&#xff0c;希望能帮助大家更加轻松地管理自己的文件…

展会进行时!5月16-18日箱讯与您相约中国航交会

宁波国际会展中心7、8号馆 第五届中国&#xff08;宁波&#xff09;国际航运物流交易会 暨2023全球物流企业合作博览会 火爆进行中 箱讯与您相约 8号馆 C033K-C036展位 期待您的光临&#xff01; 2023年5月16-18日&#xff0c;第五届中国&#xff08;宁波&#xff09;国际…

Grafana系列-统一展示-11-Logs Traces无缝跳转

系列文章 Grafana 系列文章 概述 如前文 Grafana 系列 - 统一展示 -1- 开篇所述, Grafana 可以了解所有相关的数据--以及它们之间的关系--对于尽快根治事件和确定意外系统行为的真正来源非常重要。Grafana 允许团队在一个地方对所有的数据进行无缝的可视化和跳转。 最典型的…

MySQL8.0 优化器介绍(四)

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 奥特曼爱小怪兽文章来源&#xff1a;GreatSQL社区原创 往期回顾 MySQL8.0 优化器介绍&#xff08;一&#x…

Midjourney|文心一格prompt教程[基础篇]:注册使用教程、风格设置、参数介绍、隐私模式等

Midjourney|文心一格prompt教程[基础篇]&#xff1a;注册使用教程、风格设置、参数介绍、隐私模式等 开头讲一下为什么选择Midjourney和文心一格&#xff0c;首先Midjourney功能效果好不多阐述&#xff1b;其次文心一格再多次迭代优化后效果也不错&#xff0c;重点也免费&…

【Kubernetes】| K8s基础组件分析

目录 一. &#x1f981; 前言二. &#x1f981; K8s vs Docker三. &#x1f981; K8s基础组件3.1 Master组件3.1.1 api server3.1.2 controller manager3.1.3 scheduler3.1.4 etcd 3.2 Node组件3.2.1 kublet3.2.2 kube-proxy 四. &#x1f981; 最后 一. &#x1f981; 前言 Ku…

antd-vue-admin——通过链接跳过登录页直接进入系统内部——基础积累

最近在写后台管理系统&#xff0c;遇到一个需求&#xff0c;就是从系统A带参数可以直接进入到系统B内部。不通过系统B的登录页面进行登录。 一般系统的登录&#xff0c;都需要用户名和密码等参数&#xff0c;然后获取到token信息&#xff0c;最后进入到系统内部。 下面介绍具…

5-16SQL每日一题

如下两张表&#xff0c;G0516A和G0516B 要求G0516B按顺序与G0516A的第一个WEEK1依次有序的组合&#xff0c;直到依次组合完毕&#xff0c;预计结果如下&#xff1a; 测试数据&#xff1a; CREATE TABLE G0516A ( WEEKS VARCHAR(10) ) INSERT INTO G0516A VALUES (‘WEEK1…

Socket请求和Http请求区别和场景

我们在开发过程中遇到http请求和socket请求。大部分前后交互都是通过http请求的方式&#xff0c;那socket请求怎么使用&#xff0c;什么情况下使用呢&#xff1f; 基本概念 http请求&#xff1a;基于http协议的soap协议&#xff0c;常见的http数据请求方式有get和post&#xf…

OpenCV实现图像的缩放几何变换,图像金字塔,高斯不同

1.前言 实现图像的放大&#xff08;zoom in&#xff09;和缩小&#xff08;zoom out&#xff09;主要通过两种途径&#xff1a; 几何变换。图像金字塔。 2.几何变换 通过几何变换实现图像放大和缩小功能主要是通过OpenCV的resize函数&#xff1a; 1 2 3 4 5 6 7 8void resi…

二.深度学习yolov5 比特家异构计算 训练与转模型01

(备份笔记 仅记录) 走国产化路上 要离开老黄的NVIDIA了&#xff0c;现在摸索下比特家的异构计算 yolo还停在v3的阶段 因为之前v3就已经够产品化去用了。这次也走下yolov5吧&#xff01; 1.yolov5环境搭建 2.yolov5模型训练 3.yolov5模型测试 4.模型做truck 5.模型转换为…

【六袆 - Design Pattern】Strategy Pattern;策略模式;

JDK8源码使用的策略模式列举 java.util.comparator接口用于对对象进行排序。Comparator接口的compare()方法将两个对象作为参数&#xff0c;并返回一个整数值&#xff0c;表示这两个对象的相对顺序。比较器接口有许多不同的实现&#xff0c;每个实现都有不同的排序算法。例如&a…

OpenPCDet系列 | 5.4 PointPillars算法——AnchorHeadSingle模型预测头模块

文章目录 AnchorHeadTemplate模块1. AnchorGenerator2. ResidualCoder3. AxisAlignedTargetAssigner AnchorHeadSingle模块1. AnchorHeadSingle初始化2. AnchorHeadSingle训练前向传播3. AnchorHeadSingle测试前向传播 OpenPCDet的整个结构图&#xff1a; PointPillars算法属…

人人可用的开源数据可视化分析工具

大家好&#xff0c;我是互联网架构师&#xff01; 在互联网数据大爆炸的这几年&#xff0c;各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具&#xff0c;我们能够大幅提升数据分析效率、生成更高质量的项目报告&#xff0c;让用…