之前使用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,合并单元格,单元格内换行相关推荐

  1. freemarker html 换行,java使用freemarker模板导出word,合并单元格,单元格内换行

    之前使用[XWPFDocument][]动态写入word,XWPFDocument不支持2003,word2003需要用HWPFDocument,HWPFDocument对于动态生成行效果不是很好,所 ...

  2. freemarker模板导出word循环图片表格详细教程

    前言:表哥之前已经过一篇freemarker模板导出带表格word详细教程  freemarker模板导出带表格word详细教程_Java大表哥的博客-CSDN博客,为什么现在又要写一篇呢. 因为我这 ...

  3. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  4. java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档

    前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...

  5. java通过ftl模板导出word最详细教程

    百度云链接 链接: https://pan.baidu.com/s/1OEzvsFSqAelstDtu2mo5xw 提取码: fdhq https://pan.baidu.com/s/1OEzvsFS ...

  6. 利用word的freemarker模板导出word文件

    前端请求 var url = window.webApi.business.exportYearWord; jQuery('<form action="' + url + '" ...

  7. Java 用Freemarker完美导出word文档(带图片)

    第一步:制作word模板 第二步:格式转换,将word另存为xml 第三步:找到图片base64,删除base64替换成占位符${image},只修改图片的,其余的不用动 第四步:加入依赖 <d ...

  8. java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF

    添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...

  9. 使用freemarker模板导出word文档

    1.先上模板图 2.效果图 步骤 链接:https://pan.baidu.com/s/1n204S3M-2z3slFITk6pCbw  提取码:z3s5 1.打开word模板,给需要赋值的位置先填上 ...

最新文章

  1. Login failed for user 'NT AUTHORITY\SYSTEM'. 原因: 无法打开明确指定的数据库。异常处理...
  2. 电力电子技术第五版王兆安pdf_电力电子技术笔记(考试必备)
  3. (chap2 TCP/IP基础知识) TCP/IP协议分层模型-应用层
  4. java怎么编写软键盘_安卓手机软键盘操作
  5. python 内置open()函数与os.open()函数的区别(打开文件)
  6. rocketmq官网和其它资料
  7. 参数变化_PDP驱动波形参数分析
  8. 过去的一年,哪些北大人坑死了北大?
  9. UILabel常用属性
  10. 推特称攻击者利用其 API 匹配用户名和电话号码
  11. java实现redis客户端_Java实现Redis客户端
  12. 西电操作系统:进程程序复习
  13. opencv的core组件——像素,ROI,图像混合(3)
  14. 我喜欢星期五因为我们那天有计算机课英文,高一英语作文范文4篇
  15. python 聊天机器人 中文_ 小智,又一个中文聊天机器人
  16. android 崩溃原因,Android中导致小米系列手机直接崩溃的主要原因。
  17. 2、进入缓冲区(缓存)的世界,破解一切与输入输出有关的疑难杂症(转载自C语言中文网,仅作学习笔记)
  18. 【转载】当爱只是需要
  19. CE1到9关详细教程
  20. 我的世界服务器显示未知指令,我的世界输入创造指令为什么显示未知指令

热门文章

  1. CocosCreator像素鸟小游戏实现(有源码)超详细教程 TS实现小游戏 零基础开发
  2. 撸代码更有劲了(这应该算是福利吧)
  3. Python爬虫-京东商品到货自动邮件通知
  4. 如何使用一个for循环输出九九乘法表
  5. canvas-图片的渲染
  6. 自己解决在Vue中动态渲染图片不显示的问题
  7. 如何给TSM磁带机添加新磁带
  8. 无法访问计算机请检查名称的拼写,win10系统访问共享文件夹提示“请检查名称的拼写”的修复方案...
  9. 3DMAX入门需要什么基础?中英文版本?
  10. 使用Idead的时候遇到<dependency>标红等问题