使用freemarker 对数据进行导入导出生成excel报表

对于导入导出这个功能,真的是研究了好久,最后终于学会使用。现在讲导入导出的具体操作方法进行整理,方便以后使用。

我所做的web项目使用的框架是springboot+shiro+mybatis+layui+jsp

现在先看看项目架构是如何搭建:

首先先建好 entity、dao、service、serviceImpl、controller、common、architect 等包名

现在先进行导出操作:

1 在pom.xml 文件中引入freemarker的依赖

<!-- freemarker 依赖包-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.22</version>
</dependency>
<!-- test类 依赖包-->
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.10</version>
</dependency>

2 在architect包下建立子包 utils包   然后在utils包中建立导入导出所使用的工具类 类名为:TemplateParseUtil

  可以忽略其他类,只看 TemplateParseUtil类

代码附录如下:

package com.wlsj.fgw.architect.utils;


import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.junit.Test;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: kdafang[[email protected]]
 * @Date: 2018-8-9 10:11
 */
public class TemplateParseUtil {
    /**
     * 解析模板生成Excel
     * @param templateDir  模板目录
     * @param templateName 模板名称
     * @param excelPath 生成的Excel文件路径
     * @param data 数据参数
     * @throws IOException
     * @throws TemplateException
     */
    public static void parse(String templateDir,String templateName,String excelPath,Map<String,Object> data) throws IOException, TemplateException {
        //初始化工作
        Configuration cfg = new Configuration();
        //设置默认编码格式为UTF-8
        cfg.setDefaultEncoding("UTF-8");
        //全局数字格式
        cfg.setNumberFormat("0.00");
        //设置模板文件位置
        cfg.setDirectoryForTemplateLoading(new File(templateDir));
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        //加载模板
        Template template = cfg.getTemplate(templateName,"utf-8");
        OutputStreamWriter writer = null;
        try{
            //填充数据至Excel
            writer = new OutputStreamWriter(new FileOutputStream(excelPath),"UTF-8");
            template.process(data, writer);
            writer.flush();
        }finally{
            writer.close();
        }
    }


    /**
     * 解析模板返回字节数组
     * @param templateDir  模板目录
     * @param templateName 模板名称
     * @param data 数据参数
     * @throws IOException
     * @throws TemplateException
     */
    public static byte[] parse(String templateDir,String templateName,Map<String,Object> data) throws TemplateException, IOException{
        Configuration cfg = new Configuration();
        cfg.setDefaultEncoding("UTF-8");
        cfg.setNumberFormat("0.00");
        cfg.setDirectoryForTemplateLoading(new File(templateDir));
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        Template template = cfg.getTemplate(templateName,"utf-8");
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        Writer out = new OutputStreamWriter(outStream,"UTF-8");
        template.process(data, out);
        return outStream.toByteArray();
    }

    /**
     * 自定义模板字符串解析
     * @param templateStr  模板字符串
     * @param data 数据
     * @return 解析后的字符串
     * @throws IOException
     * @throws TemplateException
     */
    public static String parse(String templateStr, Map<String, Object> data)
            throws IOException, TemplateException {
        Configuration cfg = new Configuration();
        cfg.setNumberFormat("#.##");
        //设置装载模板
        StringTemplateLoader stringLoader = new StringTemplateLoader();
        stringLoader.putTemplate("myTemplate", templateStr);
        cfg.setTemplateLoader(stringLoader);
        //加载装载的模板
        Template temp = cfg.getTemplate("myTemplate", "utf-8");
        Writer out = new StringWriter();
        temp.process(data, out);
        return out.toString();
    }

    @Test
    public void excelTest(){

        //测试Excel文件生成
        Map<String,Object> data = new HashMap<String, Object>();
        try {
            parse("C:\\Users\\kdafang\\Desktop\\qqq", "town1.ftl", "C:\\Users\\kdafang\\Desktop\\qqq\\11.xls", data);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TemplateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

3 因为我使用的是layui前端框架,所以 前端代码使用layui 的格式来描写 现在就以这个前端页面的导出为例:

4 在jsp页面 创建一个按钮 代码如下:


<a class="layui-btn excel_btn" id="excel_btn">数据导出</a>

js 代码如下:

   $(".excel_btn").click(function()
                { //获取选中数据

                    var checkStatus = table.checkStatus('TableId')
                        , data = checkStatus.data;

                    if (data.length == 0) {
                        $.post("/project/excelProject", {"pIds[]": null}, function (data) {

                            if (data.code == 200) {
                                window.location.href = "/upload/excel/project.xls";
                                layer.msg('下载全部数据成功!', {
                                    time: 500,
                                });

                            } else {
                                layer.msg('下载失败,请联系管理员', {
                                    time: 5000,
                                });
                            }
                        })
                        return;
                    } else {
                        var excelList = [];
                        for (var i in data) {
                            excelList.push(data[i].projectCreateId);
                        }
                        layer.confirm('是否要导出选择项?', {
                            btn: ['确定', '取消'] //按钮
                        }, function () {
                            $.post("/project/excelProject", {"pIds[]": excelList}, function (data) {

                                if (data.code == 200) {
                                    window.location.href = "/upload/excel/project.xls";
                                    layer.msg('下载成功!', {
                                        time: 500,
                                    });

                                } else {
                                    layer.msg('下载失败,请联系管理员', {
                                        time: 5000,
                                    });
                                }
                            })
                        }, function () {
                            layer.msg('关闭', {
                                time: 1000, //1秒后自动关闭
                            });
                        });

                    }

                });
            });

controller 代码如下:

 /**
       * @function: 数据导出
       * @author: [email protected] lyz
       * @date: 2018/9/11 15:37
       */
    @ResponseBody
    @RequestMapping("excelProject")
    public Map<String,Object> excelProject(@RequestParam("pIds[]") int pIds[], HttpServletRequest request){
        Map<String,Object> map = new HashMap<String, Object>();
        List<Project> list=new ArrayList<>();
        if(pIds.length==0){
            list =  projectService.findProjectById(null);
        }else {
            for (Integer pids : pIds) {
                List<Project> tmpList=  projectService.findProjectById(Integer.toString(pids));
                list.add(tmpList.get(0));
            }
        }
        //生成excel
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("listData",list);
        data.put("size",list.size());
        Calendar date = Calendar.getInstance();
        String year = String.valueOf(date.get(Calendar.YEAR));
        data.put("year",year);
        String path = request.getSession().getServletContext().getRealPath("/") + "upload/freemarker/";
        String  ftlName="project.ftl";
        String fileName= request.getSession().getServletContext().getRealPath("/")+ "upload/excel/project.xls";
        try {
            TemplateParseUtil.parse(path, ftlName, fileName, data);
            map.put("code","200");
        }catch (Exception e){
            map.put("msg","excel生成失败");
        }
        return  map;
    }

因为 代码实在太多,如果有想深入了解的朋友 可以联系我的QQ 759057893 进行详细咨询  

猜你喜欢

转载自blog.csdn.net/weixin_38201936/article/details/82664804