freemarker导出定制excel

之前我们导excel大部分用的是jxl和poi,JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止更新和维护

POI是apache的项目,可对微软的Word,Excel,ppt等进行操作,包括office2003和2007,Excl2003和2007。poi现在一直有更新。所以现在主流使用POI

如果只是简单的excel,用上述工具导出没有任何问题,但如果导出定制化复杂的excel或word,就会显得很繁琐,代码也有一定难度,所以我尝试用freemarker

来导出

先制作一个定制的excel

新建一个excel,在里面写上点数据并将后缀改为.xml

将下图的 1和张三改一下以接收数据,将excel复制到项目的resource目录中将后缀名改为.ftl

到这一步excel已经好了,接下来就是代码

 需要的maven包

<!--word;excel导出包-->
 <dependency>
   <groupId>org.freemarker</groupId>
   <artifactId>freemarker</artifactId>
   <version>2.3.20</version>
 </dependency>

导出的方法

复制代码
package com.pskj.GSLZ.utils.word;


import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * word,excel导出
 */
public class FreemarkerWord {

    private Configuration configuration = null;



    public FreemarkerWord() {

        configuration = new Configuration();

        configuration.setDefaultEncoding("utf-8");

    }

    /**
     * dataMap为要装载的数据
     * @param dataMap
     */
    public void createDoc(Map dataMap) {

        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,

        // 这里我的模板是放在resources/ftl包下(放在其它位置总会报文件找不到)

        configuration.setClassForTemplateLoading(this.getClass(),

                "/ftl");

        Template t = null;

        try {

            // test2.ftl为要装载的模板

            t = configuration.getTemplate("test2.ftl");

            t.setEncoding("utf-8");

        } catch (IOException e) {

            e.printStackTrace();

        }

        // 输出文档路径及名称

        File outFile = new File("E:/test2.xls");

        Writer out = null;

        try {

            out = new BufferedWriter(new OutputStreamWriter(

                    new FileOutputStream(outFile), "utf-8"));



        } catch (Exception e1) {

            e1.printStackTrace();

        }

        try {

            t.process(dataMap, out);

            out.close();

        } catch (TemplateException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    public static void main(String[] args) {
        Map map=new HashMap();
        map.put("id", "1");//添加数据
        map.put("name", "光头权");
        FreemarkerWord fw=new FreemarkerWord();
        fw.createDoc(map);//调用导出方法
    }



}
复制代码

运行之后

再就是导出多条数据,修改之后的可循环遍历数据

查询数据库后调用导出方法,数据也能正常导出

复制代码
 /**
     * 根据excel模板导出数据
     */
    @RequestMapping("listAll")
    @ResponseBody
    public void listAll() {
        PageData pd=this.getPageData();//用于接受参数的封装类
        FreemarkerWord fw=new FreemarkerWord();//实例化该导出类
        Map dataMap = new HashMap();
        try{
            List<Map> list=fhlogService.listAll(pd);//获取多组数据
            dataMap.put("list",list);//将数据装进Map
            fw.createDoc(dataMap);//调用导出方法
        }catch (Exception e){
            e.printStackTrace();

        }

    }
复制代码

 参考链接: https://blog.csdn.net/guangcigeyun/article/details/78769704

 参考链接: https://www.jianshu.com/p/66645b71942f

 

posted @   马革皮  阅读(4455)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示