java中freemarker使用FTL模版导出word文档

1.word模板转xml文件再换ftl文件(可参考网上教程,再格式化一下)

2.将文件放入resource目录

3.使用${}替换原有的数据

列如:${(weatherReportDto.propertyRightUnitName)}

4.添加依赖

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

5.创建工具类

package com.thinkgem.jeesite.modules.weather.utils;

import cn.afterturn.easypoi.word.WordExportUtil;
import com.google.common.collect.Lists;
import com.thinkgem.jeesite.common.pdf.component.PDFHeaderFooter;
import com.thinkgem.jeesite.common.pdf.component.PDFKit;
import com.thinkgem.jeesite.common.pdf.component.chart.model.XYLine;
import com.thinkgem.jeesite.common.pdf.component.chart.model.XYScatter;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FileCopyUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * @Description: ftl工具类
 * @Author: xiaohui
 * @Date: 2022-12-17 10:07
 * @Version: 1.0
 */

@Slf4j
public class PdfBeanUitl {
    @Value("${userfiles.basedir.linux}")
    private String prefix;
    @Autowired
    private PDFKit pdfKit;
    private static final String ENCODING = "UTF-8";
    private static Configuration cfg = new Configuration();


    public  String createPDF(String template,String templatePath,Object data, String fileName){
        //pdf保存路径
        try {

            //设置自定义PDF页眉页脚工具类
            PDFHeaderFooter headerFooter=new PDFHeaderFooter();
            PDFKit kit=new PDFKit();
            kit.setHeaderFooterBuilder(headerFooter);
            //设置输出路径
//            kit.setSaveFilePath("D:\\"+fileName);
//            String classpath = this.getClass().getResource("/").getPath().replaceFirst("/", "");
//            String filePath = classpath.replaceAll("WEB-INF/classes/", "static/pdf");
//            String filePath=docRoot+ "/" + fileName;
//            getRealPath("/WEB-INF/db.xml");
            String filePath = templatePath +"/pdf/"+fileName;
//            String filePath=pdfKit.getDefaultSavePath(fileName);
            kit.setSaveFilePath(filePath);
            String saveFilePath=kit.exportToFile(template,filePath,fileName,data);
            return  saveFilePath;
        } catch (Exception e) {
            log.error("PDF生成失败{}", ExceptionUtils.getFullStackTrace(e));
            return null;
        }

    }


   /**
    * @description:
    * @author: xiaoHui
    * @create: 2022/11/17
    *  @param data 数据
     * @param templateFileName 模板名字 ftl
     * @param outFilePath 输出路径
     * @param fileName  输出名
     * @param response  响应
    * @return String 输出名
    **/
    public  String createWord(Object data,String templateFileName, String outFilePath,
                              String fileName, HttpServletResponse response) throws IOException {
        Writer out = null;
        File outFile = new File(outFilePath);
        try {

            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
            // 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
            Template template = getTemplate(templateFileName);
            //下载到本地
            template.process(data, out);
            out.flush();
            log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
        } catch (Exception e) {
            log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
        } finally {
            out.close();
        }
        // 获取服务器本地的文件位置
        File file = new File(outFilePath);
        if (file.exists()) {
            BufferedInputStream bufferedInputStream = null;
            BufferedOutputStream bufferedOutputStream = null;
            try {
                // 清除buffer缓存
                response.reset();
                // 指定下载的文件名
                response.setHeader("Content-Disposition",
                        "attachment;filename=" + new String(fileName.getBytes("utf-8"),"iso-8859-1"));
                response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8");
                response.setHeader("Pragma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setCharacterEncoding("UTF-8");
                FileInputStream inputStream = new FileInputStream(file);
//                FileCopyUtils.copy(inputStream, response.getOutputStream());
                bufferedInputStream = new BufferedInputStream(inputStream); //缓冲流加速读
                OutputStream outputStream = response.getOutputStream();
                bufferedOutputStream = new BufferedOutputStream(outputStream);  //缓冲流加速写
                int n;
                while ((n = bufferedInputStream.read()) != -1) {
                    bufferedOutputStream.write(n);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bufferedOutputStream.close();
                    bufferedInputStream.close();
                    file.delete();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            throw new RuntimeException("文件在本地服务器不存在");
        }
        return fileName;
    }

    // 初始化cfg
    static {
        // 设置模板所在文件夹
        cfg.setClassForTemplateLoading(FtlUtils.class, "/template");
        // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
        cfg.setEncoding(Locale.getDefault(), ENCODING);
        // 设置对象的包装器
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

    }

    // 获取模板对象
    public static Template getTemplate(String templateFileName) throws IOException {
        return cfg.getTemplate(templateFileName, ENCODING);
    }

    public static void main(String[] args) {

        PdfBeanUitl kit=new PdfBeanUitl();
        TemplateBO templateBO=new TemplateBO();
        templateBO.setReportName("freemarker! 测试模板");
        templateBO.setStationCode("ABCDDNDNFEFNEFEN");
        templateBO.setStationName("成都市XXX值");
        templateBO.setCreateDate("2018-10-22");
        templateBO.setImageUrl("https://bkimg.cdn.bcebos.com/pic/9825bc315c6034a852660f9dc513495409237621");
        List<TemplateBO> scores=new ArrayList<TemplateBO>();
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);
        scores.add(templateBO);

        templateBO.setScores(scores);
        //折线图
//        List<XYLine> lineList=getTemperatureLineList();
//        DefaultLineChart lineChart=new DefaultLineChart();
//        lineChart.setHeight(500);
//        lineChart.setWidth(300);
//        String picUrl=lineChart.draw(lineList,0);
//        templateBO.setPicUrl(picUrl);

        //散点图
//        String scatterUrl= ScatterPlotChart.draw(getData(),1,"他评得分(%)","自评得分(%)");
//        templateBO.setScatterUrl(scatterUrl);
//        String templatePath="/Users/fgm/workspaces/fix/pdf-kit/src/test/resources/templates";
        String templatePath="weather_station/src/main/webapp/test";
        String path= kit.createPDF("",templatePath,templateBO,"hello.pdf");
        System.out.println(path);



    }


}

6.初始化cfg

    // 初始化cfg
    static {
        // 设置模板所在文件夹
        cfg.setClassForTemplateLoading(FtlUtils.class, "/template");
        // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
        cfg.setEncoding(Locale.getDefault(), ENCODING);
        // 设置对象的包装器
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

    }

7.获取模板对象

 // 获取模板对象
    public static Template getTemplate(String templateFileName) throws IOException {
        return cfg.getTemplate(templateFileName, ENCODING);
    }

8.封装方法,下载文件

工具类中 createWord

9.数据封装(数据库查询),调用封装方法

工具类中方法可以自己封装 也可以一个类中使用,核心调用createWord方法

注意:模板文件目录

// 设置模板所在文件夹

cfg.setClassForTemplateLoading(FtlUtils.class, "/templates/report");

FTL基本语法

附:ftl基本语法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Freemarker通过FTL模板导出带有表格的Word文档。在模板,可以使用Freemarker的语法来定义表格的结构和内容。然后,使用Java代码将模板和数据合并,生成Word文档。在生成Word文档时,可以使用Apache POI或其他类库来操作Word文档的格式和内容。 ### 回答2: 在搭建Web应用程序时,我们通常会使用一些模板引擎来设计和生成页面。其一个非常常见的模板引擎就是Freemarker,它的最大特点就是支持导出Word带有表格的操作。 首先,我们需要了解Freemarker是如何工作的。简单来说,Freemarker是一种基于模板的代码生成器,它将模板和数据结构组合起来,并生成具有特定文本格式的结果。在生成过程,我们可以通过使用模板的标签来定义输出的格式和样式,从而达到实现特定需求的目的。因此,如果我们想导出Word带有表格的文档,就需要在Freemarker模板设置表格的格式和内容。 下面是一个示例代码片段,展示了如何使用Freemarker生成带有表格的Word文档: ``` <#import "jodconverter.ftl" as jodconverter> <#import "office.ftl" as office> <#assign tableData = [ ["Name", "Age", "Gender"], ["Tom", 25, "Male"], ["Lucy", 23, "Female"], ["Jack", 29, "Male"] ]> <#assign tableStyle = office.createTableStyle("tableStyle", { "border-width" : "1", "border-color" : "#000000", "background-color" : "#f0f0f0" })> <#assign tableModel = office.createTableModel("tableModel", { "data" : tableData, "columns" : [{ "width" : "100px" }, { "width" : "50px" }, { "width" : "50px" }] })> <#assign document = jodconverter.convert(inputStream, outputStream)> <#assign table = office.createTable("table", tableModel, tableStyle)> ${table} <#assign outputStream = document.getOutputStream()> ``` 在上述代码,我们首先定义了一个表格数据和一个表格样式。然后,我们使用`office.createTableModel()`方法创建一个表格模型,并将表格数据和样式传入。接着,我们使用`office.createTable()`方法根据表格模型和样式创建实际的表格。最后,我们将表格输出到Word文档。 需要注意的是,在上述代码,我们使用了JODConverter来实现将Freemarker生成的文档转换为Word格式的操作。这是因为Freemarker本身并不能直接生成Word文档,而是需要将生成的内容通过其他工具转换为Word格式。JODConverter正是其一种常用的工具,它可以将生成的文档转换为多种格式,包括Word、Excel、PDF等。 综上所述,通过使用Freemarker模板引擎和JODConverter工具,我们可以实现将带有表格的文档导出Word格式的操作。这一过程需要仔细设置表格的格式和内容,以确保生成的文档符合预期的要求。 ### 回答3: FreeMarker是一种Java模板引擎,它通过模板文件生成输出文件。其ftlFreeMarker模板文件的扩展名。通过使用FreeMarker,我们可以在模板定义标记和变量来生成各种格式的文本文件,如HTML、XML、JSON、CSV,甚至Word文档。而在这篇文章,我将着重讲述如何使用FreeMarker生成带有表格的Word文档。 首先,我们需要引入FreeMarker的依赖。由于FreeMarker是一种Java模板引擎,因此我们需要在Java项目添加FreeMarker的依赖。具体方法可以查看FreeMarker官方文档:http://freemarker.apache.org/docs/api/。 接下来,我们需要准备一个FTL模板文件。模板可以包含Word文档的各种元素,例如标题、段落、文本、图片等,并且可以用表达式调用Java程序定义的方法和变量。我们需要在模板定义一个表格,并设置好表格的列数和行数,以及表格内容的格式和位置。 下面是一个简单的示例,用于生成一个带有两行两列的表格: ``` <#list tableData as tr> <#if tr_index == 0> <table> <tr> <th>ID</th> <th>Name</th> </tr> </#if> <tr> <td>${tr.id}</td> <td>${tr.name}</td> </tr> <#if tr_index == tableData?size-1> </table> </#if> </#list> ``` 在这个示例,我们使用了`<#list>`标签来遍历数据集合(在本例为`tableData`),并使用`<#if>`标签来判断是否需要添加表头和表尾。在表格,我们用`${}`表达式来输出数据,其`${tr.id}`和`${tr.name}`是Java数据模型的属性或者方法。 最后,我们需要编写Java程序来将数据插入到FTL模板,并导出Word文档。首先,我们需要创建一个Configuration对象,并指定模板文件的路径: ``` Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); configuration.setDefaultEncoding("UTF-8"); configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // 模板文件的路径 configuration.setDirectoryForTemplateLoading(new File("template")); // 加载模板文件 Template template = configuration.getTemplate("table.ftl"); ``` 然后,我们需要创建一个Map来存储需要导出Word文档的数据,并将Map传递给模板: ``` Map<String, Object> data = new HashMap<>(); data.put("tableData", tableData); // 将Map传递给模板 Writer writer = new FileWriter(new File("table.doc")); template.process(data, writer); ``` 在这个示例,我们将数据存储在一个Map,并以`tableData`为键名,将数据传递给模板。模板将使用`${tr.id}`和`${tr.name}`来获取数据,并将数据填充到相应的位置。最后,我们使用`template.process()`方法将Map传递给模板,并将要导出的文件写入到文件。 总之,通过FreeMarker模板引擎的强大功能,我们可以轻松地生成各种格式的文本文件,包括带有表格的Word文档。在实际应用,我们可以根据需求编写不同样式的模板,并使用Java程序将数据填充到模板,生成符合要求的文本文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值