使用freemarker模板导出word文档

简介: 使用freemarker模板导出word文档

最近项目中要使用到导出word这项功能,参考了许多导出的方法,发现使用freemarker模板导出word的效果最好可以保持原样。

导入freemarker的架包

1.首先我们需要用word制作一份模板,打开word编辑我们想要的word样式。

如图:

20180820214047904.png

2.在需要填写的地方用变量来代替。如果有图片需要先用图片来填充。然后另存为xml文件,然后再把后缀名改为.ftl的格式

20180820211623249.png

3.处理ftl文件,把图片替换成变量。

20180820212751917.png

20180820213036263.png

4.word表格的填充,ftl也要做修改。找到自己表格所在的那行,word中<w:tr>表示一行,我们找到表头的下一行。

20180820213939851.png

从这行开始修改studengList表示待会代码要放进去的List <w:tr>,缩起来了

20180820214342922.png

5.java代码

package com.smxy.lq.utils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;
/**
 * 
 * @Description :使用freemark模板生成word文档
 * @author Bush罗
 * @date 2018年8月20日
 *
 */
public class WordFreemark {
  private Configuration configuration = null;
  public WordFreemark() {
    configuration = new Configuration();
    configuration.setDefaultEncoding("UTF-8");
  }
  public static void main(String[] args) {
    WordFreemark test = new WordFreemark();
    test.createWord();
  }
  public void createWord() {
    Map<String, Object> dataMap = new HashMap<String, Object>();
    getData(dataMap);
    configuration.setDefaultEncoding("utf-8");//设置编码
    configuration.setClassicCompatible(true);
    configuration.setClassForTemplateLoading(
        this.getClass(),
        "/ftl/word");// FTL文件所存在的位置
    Template t = null;
    try {
      t = configuration.getTemplate("word.ftl"); // ftl模板名称
    } catch (IOException e) {
      e.printStackTrace();
    }
    File outFile = new File("D:/word" + Math.random() * 10000
        + ".doc");
    Writer out = null;
    try {
      out = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream(outFile)));
    } catch (FileNotFoundException e1) {
      e1.printStackTrace();
    }
    try {
      t.process(dataMap, out);
    } catch (TemplateException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  private void getData(Map<String, Object> dataMap) {
    dataMap.put("name", "Bush罗");
    dataMap.put("number", "2015089879");
    //填充图片
    dataMap.put("image", getImageStr());
    //表格填充
    List<Student> studentList=new ArrayList<Student>();;
    for(int i=0;i<10;i++){
      Student student=new Student();
      student.setName("小明");
      student.setPhone("1234567");
      student.setSex("男");
      studentList.add(student);
    }
    dataMap.put("studentList", studentList);
  }
  //图片转码
    public String getImageStr() {  
        String imgFile = "E:/AAA.png";  
        InputStream in = null;  
        byte[] data = null;  
        try {  
            in = new FileInputStream(imgFile);  
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);  
    }  
}

6.生成样式

20180820215324890.png

相关文章
|
1月前
|
人工智能 并行计算 语音技术
魔搭社区模型速递(8.23-8.30)
🙋魔搭ModelScope本期社区进展:📟4924个模型,📁357个数据集,🎨99个创新应用,📄 9篇内容:
245 3
|
7月前
|
人工智能 自然语言处理 程序员
产品测评 | AI编程界的集大成者——通义灵码AI程序员
通义灵码AI程序员是阿里云推出的一款基于先进自然语言处理和深度学习技术的编程助手,集成于VS Code和JetBrains IDEs中。它覆盖从前端到后端的开发流程,支持多文件级别的代码修改、单元测试生成、多版本快照管理等高级功能,显著提升开发效率和项目管理能力。开发者可通过对话式交互完成需求理解到产品发布的全过程,实现高效敏捷开发。最新2.0版本在代码生成、跨语言编程、单元测试自动生成及图生代码等方面有显著提升,进一步优化了用户体验。
|
XML JavaScript 前端开发
springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】
springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】
776 2
|
11月前
|
Java 数据格式
Java“EOFException”解决
Java中的“EOFException”通常在读取文件或网络流时遇到意外的文件结束符时抛出。解决方法包括检查输入源是否为空、确保数据格式正确以及增加异常处理逻辑。
1141 3
|
Linux Python
linux之安装python3
linux之安装python3
|
开发者 Python
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
|
XML Java 数据格式
基于Java+freemarker实现动态赋值以及生成Word文档
使用Java和Freemarker技术实现动态数据填充到Word文档模板并生成新的Word文档。
1022 0
基于Java+freemarker实现动态赋值以及生成Word文档
|
Java Linux 测试技术
Maven命令大全:从安装到部署,一篇文章带你玩转Maven
本文由木头左介绍Maven,一个用于Java项目管理的工具,涉及Maven的安装配置(Windows和Linux)及核心命令,包括install、package、compile、clean、deploy、test、verify和site。通过这些命令,可以实现构建、打包、编译、测试、部署和生成项目站点等操作。
|
数据库 测试技术 Java
阿里技术专家详解DDD系列 第二弹 - 应用架构
应用架构,指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步,因为一个好的架构能让系统安全、稳定、快速迭代。但是今天我们在做业务研发时,更多会关注一些宏观的架构,而忽略了应用内部的架构设计,希望能通过案例分析和重构,推演出一套高质量的DDD架构。
57736 24
阿里技术专家详解DDD系列 第二弹 - 应用架构
|
JavaScript
vue3 实现电子签名
vue3 实现电子签名