文章目录

  • 使用freemaker进行生成word文档并实现预览
  • 一、导入依赖
  • 二、导出word文件步骤
    • 1.将word文档转成ftl文件
    • 2.文件数据绑定
  • 三、导出html文件步骤
  • 四、解析文件并生成文档
  • 总结

使用freemaker进行生成word文档并实现预览

这里是有两个功能,一个是word文档生成,还有一个就实现word文档的预览,由于freemaker的原因,生成的word文档不是标准格式的word文档,所以在转换html格式时,会出现错误,无法转换,为了不浪费时间,没有深入研究,我选择了将文件先转成html,再对html进行动态数据绑定,以此来实现浏览器页面预览的效果。

!!!请仔细阅读,我这很多地方做了说明,防止查看遗漏,导致时间成本增加。

一、导入依赖

我这里使用的是springboot自带的freemaker

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>

二、导出word文件步骤

1.将word文档转成ftl文件

1.使用wps或者office打开文件,选择另存为

2.将文件改成xml格式

3.保存到桌面,将文件后缀改为 ftl

2.文件数据绑定

  1. 将刚刚生成的ftl文件使用文件编辑器打开,建议将内容格式化,方便阅读
    我这里使用的是Notepad++
  2. 对文档内容进行数据绑定,我将举例几个使用示例(如图)
    a. list循环
    b.合并单元格
    c.条件判断
    d.动态绑定
    e.判断list是否为空
 <#if testList?? && (testList?size > 0) >
<#list testList as test>                   这里是list列表循环<w:tr><w:tc><w:tcPr><#if test.isHead == 1>             合并单元格<w:vMerge w:val="restart"/>         第一行<#else><w:vMerge w:val="continue"/> 其他要合并的行</#if><w:tcBorders><#if test.isLast == 1>   通过表示来判断展示<w:bottom w:val="single"w:color="000000"w:sz="4"w:space="0"/><#else><w:bottom w:val="single"w:color="000000"w:sz="24"w:space="0"/></#if></w:tcBorders><w:p><w:r><#if test.isHead == 1><w:t>${test.number}</w:t> 动态数据</#if></w:r></w:p></w:tcPr></w:tc></w:tr>
</#list>
  1. 文件编辑好之后,将其放到项目内
    我这边的话是放到resources目录的templates文件夹下

三、导出html文件步骤

  1. 步骤与word转xml类似,这次只需将原word文件转换成html格式,并将后缀修改成 ftl 即可,这里就不详细介绍了。

  2. html文件动态数据(重点)

    list循环和条件判断是一样的
    html与xml的格式有区别所以有些地方是不一样的
    例:

    1. 单元格合并,合并第一行展示改属性,其他合并行无需展示
    2. 针对style的动态数据绑定,根据动态值来对样式进行动态展示
    3. if条件判断和数据绑定

四、解析文件并生成文档

  1. 废话不多说,直接上代码。
    类中有两个方法,一个是生成word(createWord)文档,
    一个是生成html(createHtml)文档
package cn.hzreal.lqm.util;import cn.hzreal.lqm.model.vo.VZxCqBaseVo;
import cn.hzreal.lqm.model.vo.ZxRenVO;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.dom4j.Document;
import org.dom4j.io.*;import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class WordUtil {private Configuration configuration = null;/**** 模板文件名称*///word-ftl文件private static final String  templateFile = "test.ftl";//html-ftl文件private static final String  templateFileHtml = "toHtml2.ftl";/**** word生成的输出目录*///线上下载目录(自定义目录即可)private static final String  outputDir = "/templates/";//本地下载地址
//    private static final String  outputDir = "D:/files/";public WordUtil(){configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");}public static void main(String[] args) {WordUtil test = new WordUtil();test.createWord();}/******* Project Name: maventest* <p>转换成word<br>*/public void createWord() throws Exception {Map<String,Object> dataMap=new HashMap<>();//构造参数getData(dataMap);//模板文件所在路径configuration.setClassForTemplateLoading(this.getClass(), "/templates/");Template t=null;try {t = configuration.getTemplate(templateFile);} catch (IOException e) {e.printStackTrace();}//导出文件File outFile = new File(outputDir+Math.random()*10000+".doc");Writer out = null;response.setContentType("application/x-msdownload;");response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode("文档名称", "UTF-8") + ".doc");try {//本地下载
//            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));//响应到浏览器out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));} catch (FileNotFoundException e1) {e1.printStackTrace();}try {//将填充数据填入模板文件并输出到目标文件t.process(dataMap, out);System.out.println("生成成功...");} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/******* Project Name: maventest* <p>转换成html<br>*/public void createHtml() throws Exception {Map<String,Object> dataMap=new HashMap<>();//构造参数getData(dataMap);//由于html的编码问题,我在这里做了编码转换configuration.setDefaultEncoding("GBK");//模板文件所在路径configuration.setClassForTemplateLoading(this.getClass(), "/templates/");Template t=null;try {//            configuration.setDirectoryForTemplateLoading(new File(baseDir));t = configuration.getTemplate(templateFileHtml);} catch (IOException e) {e.printStackTrace();}//导出文件
//        File outFile = new File(outputDir+Math.random()*10000+".html");Writer out = null;response.setContentType("application/x-msdownload;");response.addHeader("Content-Disposition", "attachment;filename="+ "test.html");try {//            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"UTF-8"));} catch (FileNotFoundException e1) {e1.printStackTrace();}String content="";try {//将填充数据填入模板文件并输出到目标文件t.process(dataMap, out);content=t.getRootTreeNode().getTemplate().toString();System.out.println("生成成功...");} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/****** Project Name: maventest* <p>初始化数据map <br>*/private void getData(Map<String, Object> dataMap) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//根据自己的数据进行添加即可dataMap.put("number", 1);dataMap.put("nowDate", formatter.format(new Date()));}
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

Freemaker导出word文档并实现预览相关推荐

  1. 今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题

    结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xx ...

  2. java通过POI和jacob实现word文档的在线预览和下载

    通过POI和jacob可以实现word文档的在线预览和下载. 首先,引入以下maven依赖. <dependency><groupId>org.apache.poi</g ...

  3. Springboot 使用freemaker导出word文档

    利用freemarker导出word文档,主要分为一下几部分,但是循环写入图片是其中最难的一点,尤其是从未使用freemaker导出word模板的新手.话不多说,开搞. 1  找到需要导出的word模 ...

  4. 通过freemaker导出word文档SpringBoot+idea,做成浏览器下载

    为什么用freemaker呢,因为用freemarker的模板来搞比较方便,比较快捷也让人更好的可以接受 主要还是因为简单,具体的步骤如下 1.首先你要添加freemaker的相关依赖,还需要在配置类 ...

  5. 用JAVA如何实现word文档在线编辑预览的功能?

    免费方案: ①采用dsoframer. dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.缺点:只支持IE浏览器,由于dso ...

  6. SpringBoot实现本地上传Word文档并在线预览

    所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</art ...

  7. java word在线预览_java 生成word文档并且在线预览的问题

    富文本? 用iText或者PD4ML直接转换为pdf [code="java"] String outputFile = "D:/Test/demo_3.pdf" ...

  8. java导出word表格_使用PowerDesigner16.5 逆向数据库 导出word文档

    在上一篇<使用PowerDesigner16.5 逆向数据库生产表结构或导出word文档二>中,我们学会了使用PowerDesigner16.5怎么连接数据库,逆向生成表结构.有时候,我们 ...

  9. jQuery表格导出Excel文件以及网页内容导出Word文档

    前言: 我在这里给大家介绍一下我们能用代码实现的最简单的两种转换为Excel文件以及Word文档的方法. jQuery表格导出Excel文件 先来看看我们的层级划分: 如图所示: demo.css 代 ...

最新文章

  1. .Net精简版数据类型
  2. POJ - 2400 Supervisor, Supervisee(KM+打印方案)
  3. lr中winsock协议的脚本(转载51testing)
  4. python中grid函数_python tkinter中的grid布局是什么?
  5. 技能系统设计笔记 3
  6. pytorch制作test和train下面还有类别的文件(从一个图片文件中复制)
  7. MATLAB FFT与fftshift
  8. 什么是多道程序设计技术,试述多道程序运行的特征。
  9. 着色缓存器_新的缓存着色器预处理器(实验性)可加快构建速度
  10. GBASE 8s UDR内存管理_03_mi_realloc
  11. 【20210305期AI简报】基于TensorRT完成NanoDet模型部署、Google AI发布TensorFlow 3D
  12. 天眼查、企查查APP的Authorized值和sign值破解思路记载
  13. 可视化学习第三周-对比型和分布型数据
  14. 从一循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo“,在5的倍数行打印biz,在7的倍数行打印baz
  15. 如何了解用户和需求?
  16. 记一次拆机除尘换硅脂的经历,第一次拆机幸好没拆坏,心真大-_-!
  17. 螺栓与螺栓组联接实验测试分析装置,QY-JXSX26
  18. JavaScript高级编程设计(第三版)——第四章:变量作用域和内存问题
  19. [安卓逆向]android adb常用命令及使用案例
  20. 数字信号处理的MATLAB实现——快速傅里叶变换

热门文章

  1. win7卡在正在启动windows界面_一键还原怎么用董哥教你win7一键还原怎么用
  2. 想免像控?RTK/PPK无人机 vs GCP 测绘精度对比
  3. 解决暴风影音播放rmvb的插件
  4. 自制作的一个手机平衡球游戏!
  5. sybase常见语句
  6. 2022年电赛信号类模块准备
  7. 微信公众号怎么管理粉丝用户-微信公众号使用教程13
  8. 如何手动设置文件关联(超详细)
  9. 【C++】求解一元二次方程的根
  10. 如何估算机柜服务器的功耗与重量?