freemaker导出word时出现值被分割的问题处理
没错,你们最爱的小工具又要出现了。博客好久没有更新了。主要吧,最近好像也没有学习什么东西。之前导出word使用的是freemaker,将编写好的word模板保存为xml格式在改成ftl。然后导出
抽取出一个工具类
import freemarker.template.Configuration;
import freemarker.template.Template;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;/*** Word工具类 <br>** @author gzm*/
public class WordUtils {/*** 下载动态生成的Word文件。只支持ftl文件模板。* @param response response* @param map 值* @param templatePath 模板路径,即模板放在哪个位置* @param templateName 模板名称。* @param downloadName 导出文件名。* @throws IOException IO异常*/public static void downloadWordByTemplate(HttpServletResponse response,Map map, String templatePath, String templateName, String downloadName) throws IOException {MapNullToSpace(map);Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8");configuration.setDirectoryForTemplateLoading(new File(templatePath));Template freemarkerTemplate = configuration.getTemplate(templateName);File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类的createDoc方法生成Word文档file = createDoc(map,freemarkerTemplate);fin = new FileInputStream(file);response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件名response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(downloadName, "UTF-8"))));out = response.getOutputStream();byte[] buffer = new byte[512]; // 缓冲区int bytesToRead = -1;// 通过循环将读入的Word文件的内容输出到浏览器中while((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}} finally {if(fin != null) {fin.close();}if(out != null) {out.close();}if(file != null) {file.delete(); // 删除临时文件}}}private static File createDoc(Map<?, ?> dataMap, Template template) {String name = "test.doc";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;}/*** Map中null值改为空字符串* @param map Map*/private static void MapNullToSpace(Map<String, Object> map) {for (String key : map.keySet()) {if (null == map.get(key)) {map.put(key, "");}}}}
导出是没有问题了,但是在使用模板的时候却发生了问题
我的word中使用这样的变量,转成ftl时候值却被分割开了
之前我的做法是找到这些值手动去调。眼睛都要瞅瞎了效率还低。所以抽时间写了段脚本,变量中的标签情况掉
public static void main(String[] args) {FileReader fileReader = new FileReader("E:\\个人基本信息表.ftl");List<String> strings = fileReader.readLines();FileAppender appender = new FileAppender(FileUtil.newFile("D:\\reslut3.ftl"), 16, true);for (String string : strings) {if (!string.contains("$")) {appender.append(string);continue;}string = string.replaceAll("\\$", "#\\$");String[] ss = string.split("#");// 同一行的内容写到同一行,文件追加自动换行了StringBuilder sb = new StringBuilder();for (int i = 0; i < ss.length; i++) {String s1 = ss[i];if (!s1.startsWith("$")) {sb.append(s1);continue;}int i1 = s1.lastIndexOf("}");String substr = s1.substring(0, i1 + 1);sb.append(substr.replaceAll("<[^>]+>", ""));sb.append(s1.substring(i1 + 1));}appender.append(sb.toString());}appender.flush();appender.toString();}
脚本中的文件操作使用的是hutool,这个工具包还是非常强大值得使用,如果没有添加hutool依赖的话,可以自己修改一下文件操作的部分
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.10</version>
</dependency>
好了,这样导出的工作就变得简单了很多。
freemaker导出word时出现值被分割的问题处理相关推荐
- Springboot 使用freemaker导出word文档
利用freemarker导出word文档,主要分为一下几部分,但是循环写入图片是其中最难的一点,尤其是从未使用freemaker导出word模板的新手.话不多说,开搞. 1 找到需要导出的word模 ...
- 今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题
结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xx ...
- wordExport导出word时关于echarts图表生成图片的解决方案
一.基本介绍 wordExport是一款基于前端处理生成word的处理方式 在对应页面引入FileSaver.js和jquery.wordexport.js 使用:需生成word的部分.wordExp ...
- poi导出word时替换的段落内容会多出一个}和逗号_办公族必备11个Word文字处理技巧,太实用了!...
Hello,各位叨友们好呀!我是叨叨君~ 在使用Word的过程中,大家经常会被一些小问题折磨到不行,这里叨叨君为大家整理了11个常见问题,专治Word疑难杂症! 01 打字时后面的字消失了 先来个简单 ...
- java web 导出word_JavaWeb Project使用FreeMaker导出Word文件
基本思路 1. 导入freemaker2.3.jar 2. 需要导出的Word模板 3. 在Word内填入值的标签 4. Word另存为xml(2003版本) 5. Coding 6. 导出Word文 ...
- Freemaker导出word文档并实现预览
文章目录 使用freemaker进行生成word文档并实现预览 一.导入依赖 二.导出word文件步骤 1.将word文档转成ftl文件 2.文件数据绑定 三.导出html文件步骤 四.解析文件并生成 ...
- poi导出word时内嵌表格场景,即开即用
poi导出word内嵌表格 设计分析部分 后端代码部分 xml文件配置 实体类 controller层 使用到的工具类 service层 前端代码部分 测试页面 设计分析部分 首先要对导出word的需 ...
- java easypoi导出word时添加空白页导出多组相同类型的数据
1.需求 导出用户信息,模板如下: 要求:导出多个用户信息时,另起一页,根据模板生成下一条用户信息. 2.模板变化 easypoi不能直接创建空白页(下一页),但可以使用apache的poi中的doc ...
- 通过freemaker导出word文档SpringBoot+idea,做成浏览器下载
为什么用freemaker呢,因为用freemarker的模板来搞比较方便,比较快捷也让人更好的可以接受 主要还是因为简单,具体的步骤如下 1.首先你要添加freemaker的相关依赖,还需要在配置类 ...
最新文章
- hdl四位二进制计数器_四位二进制计数器这样接成十进制计数器
- 《大规模web服务开发技术》阅读笔记
- css transition兼容性,CSS3 Transition详解和使用
- 用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件
- 工业级光纤收发器一般适合哪些应用环境?
- linux 内核开发_25年Linux内核开发中的9课
- 离婚算法:说不清的感情对错,但算得清的财产分割
- 评分卡模型开发(三)--数据集准备
- Docker-registry + GlusterFS
- [转] 驱动模拟键盘鼠标
- 圣思园Spring精髓-Spring的底层设计思想
- 人一生要读的60本书(经典读书计划)
- 销售书籍推荐,这本书做销售的必看!
- 复杂性研究简介——从西蒙到霍兰
- ~ 运算符和 ~~ 运算符(JS)
- erp接口,打单软件,订单管理软件,旗帜接口,备注接口,旗帜接口,打单接口,发货接口
- BJSubwayPen -- 北京地铁路线图绘制工具 开源啦~~
- 手电筒安卓_iPhone手电筒只能照明?这两个隐藏技巧一定要会,事半功倍!
- 甲骨文:“狂妄”的秘诀
- MATLAB consolas字体中文显示乱码问题