java使用freemarker模板导出word,合并单元格,单元格内换行
之前使用XWPFDocument动态写入word,XWPFDocument不支持2003,word2003需要用HWPFDocument,HWPFDocument对于动态生成行效果不是很好,所以使用freemarker动态生成,生成的支持所有格式。
一、使用officeword建一个需要的表格,需要动态替换的可以先写上字母
二、另存为word2003xml格式
三、把后缀修改为ftl
四、把word xml格式化,可以使用notepad++的xml tool插件,或者使用在线格式化
格式化前
格式化后
五、把之前所有要替换的字母加${}
改为
六、需要动态添加的找到<w:tr>,在<w:tr>上加<#list postdutyNormList as postdutyNormObj>
循环里面的字母加上${postdutyNormObj.}
七、合并单元格
例合并5行的第一列,第一行的第一列有值,增加<w:vmerge w:val="restart"/>;第二、三、四、五行的第一列没值把<w:r></w:r>去掉,增加<w:vmerge/>
第一行:
第二、三、四、五行:
动态判断如下:其中index是行号
八、内容相同的上下行合并,其中preContent是上一行的值,可以在java里添加需要判断列的值
九、单元格内换行
在java里循环,trs就是替换的count
for (int i = 0; i < count; i++) {VPersonalWorkDailyChild tr = list_p.get(i);VPersonalWorkDaily parent = baseInfoService.getObjectById(VPersonalWorkDaily.class, tr.getId_personal_work_daily());String data = i+1+". "+gfnull(tr.getTime())+" "+gfnull(parent.getName_place())+gfnull(tr.getPlace())+" "+gfnull(tr.getContent());trs += "<w:p wsp:rsidR=\"00000000\" wsp:rsidRDefault=\"008F1A6A\">"+"<w:pPr>"+"<w:jc w:val=\"left\"/>"+"<w:rPr>"+"<w:sz w:val=\"20\"/>"+"</w:rPr>"+"</w:pPr>"+"<w:r>"+"<w:rPr>"+"<w:rFonts w:hint=\"fareast\"/>"+"<w:sz w:val=\"20\"/>"+"</w:rPr>"+"<w:t>"+data+"</w:t>"+"</w:r>"+"</w:p>";
}
十、Controller代码,map是所有要替换的内容
/**** @Date 2019年2月25日 下午17:30:23* @Description 考核成绩汇总导出考核表具体条目* @Fcunction exportWordForSpecific* @param response* @return ReturnDatas**/@ResponseBody@SystemControllerLog(description="考核成绩汇总导出考核表具体条目")@RequestMapping(value="exportWordForSpecific")public ReturnDatas exportWordForSpecific(HttpServletResponse response, String id){ReturnDatas returnDatas = ReturnDatas.getSuccessReturnDatas();try {Map<String, Object> map = assessGradeSumService.exportWordForSpecific(id);String org_name = (String) map.get("org_name");String user_name = (String) map.get("user_name");String month_ = (String) map.get("month_");response.setCharacterEncoding("UTF-8");response.setContentType("application/msexcle");response.setHeader("content-disposition", "attachment;filename="+new String((org_name+"-"+user_name+month_+"履职考核表").getBytes("utf-8"),"ISO8859-1")+".doc");OutputStream outputStream = response.getOutputStream();WordGenerator.createDoc(map, "AssessMonthTable2.ftl", outputStream);outputStream.flush();outputStream.close();returnDatas.setStatus(ReturnDatas.SUCCESS);return returnDatas;} catch (Exception e) {e.printStackTrace();LogUtil.error("考核成绩汇总导出考核表具体条目异常:"+e.getMessage(),e);returnDatas.setStatus(ReturnDatas.ERROR);returnDatas.setMessage("考核成绩汇总导出考核表具体条目异常。");}return returnDatas;}
十一、WordGenerator 工具类
package com.enter.net.util;import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;public class WordGenerator {/*** 生成doc文件* @param dataMap word中需要展示的动态数据* @param templateName word模板名称* @param output 输出流* @return* @throws IOException * @throws TemplateException */public static void createDoc(Map<?, ?> dataMap,String templateName,OutputStream output) throws TemplateException, IOException {//创建配置实例 Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);//设置编码configuration.setDefaultEncoding("UTF-8");//空值configuration.setClassicCompatible(true);//ftl模板文件统一放至 com.fh.template 包下面configuration.setClassForTemplateLoading(WordGenerator.class,"/templates/");//获取模板 Template template = configuration.getTemplate(templateName);//将模板和数据模型合并生成文件 Writer out = new BufferedWriter(new OutputStreamWriter(output,"UTF-8"));// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
// Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8"); //生成文件template.process(dataMap, out);//关闭流out.flush();out.close();} }
十二、参考
注:若动态替换的内容里有特殊符号,如"<>",可以是用?html转义。在freemarker模板里把${content}改成${content?html}
标签相关
<w:tr></w:tr>:每一行;
<w:tc></w:tc>:是每一列;
<w:p></w:p>:控制单元格内换行;
<w:tcPr></w:tcPr>:里面添加合并;
<w:r></w:r>:里面是内容样式及内容;
<w:t></w:t>:里面是内容;
${assessAllObj.content?html}:如果替换的内容里有<>会报错,可以加上?html进行转义
常用到的语句
<#list postdutyNormList as postdutyNormObj>
</#if>
<#if postdutyNormObj.index==1><w:vmerge w:val="restart"/>
<#else><w:vmerge/>
</#if>
java使用freemarker模板导出word,合并单元格,单元格内换行相关推荐
- freemarker html 换行,java使用freemarker模板导出word,合并单元格,单元格内换行
之前使用[XWPFDocument][]动态写入word,XWPFDocument不支持2003,word2003需要用HWPFDocument,HWPFDocument对于动态生成行效果不是很好,所 ...
- freemarker模板导出word循环图片表格详细教程
前言:表哥之前已经过一篇freemarker模板导出带表格word详细教程 freemarker模板导出带表格word详细教程_Java大表哥的博客-CSDN博客,为什么现在又要写一篇呢. 因为我这 ...
- 【Apache POI】Java Web根据模板导出word文件
最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...
- java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档
前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...
- java通过ftl模板导出word最详细教程
百度云链接 链接: https://pan.baidu.com/s/1OEzvsFSqAelstDtu2mo5xw 提取码: fdhq https://pan.baidu.com/s/1OEzvsFS ...
- 利用word的freemarker模板导出word文件
前端请求 var url = window.webApi.business.exportYearWord; jQuery('<form action="' + url + '" ...
- Java 用Freemarker完美导出word文档(带图片)
第一步:制作word模板 第二步:格式转换,将word另存为xml 第三步:找到图片base64,删除base64替换成占位符${image},只修改图片的,其余的不用动 第四步:加入依赖 <d ...
- java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF
添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...
- 使用freemarker模板导出word文档
1.先上模板图 2.效果图 步骤 链接:https://pan.baidu.com/s/1n204S3M-2z3slFITk6pCbw 提取码:z3s5 1.打开word模板,给需要赋值的位置先填上 ...
最新文章
- Login failed for user 'NT AUTHORITY\SYSTEM'. 原因: 无法打开明确指定的数据库。异常处理...
- 电力电子技术第五版王兆安pdf_电力电子技术笔记(考试必备)
- (chap2 TCP/IP基础知识) TCP/IP协议分层模型-应用层
- java怎么编写软键盘_安卓手机软键盘操作
- python 内置open()函数与os.open()函数的区别(打开文件)
- rocketmq官网和其它资料
- 参数变化_PDP驱动波形参数分析
- 过去的一年,哪些北大人坑死了北大?
- UILabel常用属性
- 推特称攻击者利用其 API 匹配用户名和电话号码
- java实现redis客户端_Java实现Redis客户端
- 西电操作系统:进程程序复习
- opencv的core组件——像素,ROI,图像混合(3)
- 我喜欢星期五因为我们那天有计算机课英文,高一英语作文范文4篇
- python 聊天机器人 中文_ 小智,又一个中文聊天机器人
- android 崩溃原因,Android中导致小米系列手机直接崩溃的主要原因。
- 2、进入缓冲区(缓存)的世界,破解一切与输入输出有关的疑难杂症(转载自C语言中文网,仅作学习笔记)
- 【转载】当爱只是需要
- CE1到9关详细教程
- 我的世界服务器显示未知指令,我的世界输入创造指令为什么显示未知指令
热门文章
- CocosCreator像素鸟小游戏实现(有源码)超详细教程 TS实现小游戏 零基础开发
- 撸代码更有劲了(这应该算是福利吧)
- Python爬虫-京东商品到货自动邮件通知
- 如何使用一个for循环输出九九乘法表
- canvas-图片的渲染
- 自己解决在Vue中动态渲染图片不显示的问题
- 如何给TSM磁带机添加新磁带
- 无法访问计算机请检查名称的拼写,win10系统访问共享文件夹提示“请检查名称的拼写”的修复方案...
- 3DMAX入门需要什么基础?中英文版本?
- 使用Idead的时候遇到<dependency>标红等问题