Freemarker模板导出具有复杂样式的Excel(板子)

有时需要导出Excel格式特别复杂的文件,这时候用poi直接导出可能比较麻烦,并且可能很多需要现学,用FreeMarker可以很暴力解决这个问题,帮助我们只关注数据,而不用关注样式,当然FreeMarker也有不足,只能导出xls格式的Excel。

1.首先对Excel另存为xml,一定选择XML 2003Freemarker模板导出具有复杂样式的Excel(板子)_第1张图片

  1. 这里需要了解一下FreeMarker的语法。用notepad++之类的编辑器打开xml,然后将需要修改的数据用定义的变量来替代,多行就用list来代替。而对于格式,以及固定的表头等等就不用修改,可以做到格式透明操作。
    Freemarker模板导出具有复杂样式的Excel(板子)_第2张图片

3.修改完成,保存。修改xml文件后缀为.ftl,FreeMarker模板就制作完毕,可以扔到项目里,这里放在WEB-INF/template下面.

4.在项目中创建对应的bean,然后装入数据,用Java写一个FreeMarker导出工具类,直接导出就行了。

调用实例板子:

@Autowired
WebApplicationContext wac;

	Map root = new HashMap<>();
        root.put("itemList", detailReportBeanList);
        root.put("compareBean", basicReportBean);
        String fileUrl = System.getProperty("user.dir") + File.separator + "比对反馈文档" + File.separator + fileName;
        File file=new File(fileUrl);
        //如果父目录不存在,则创建
        if (!file.getParentFile().exists()) {
            if(!file.getParentFile().mkdirs()){
                throw new BaseException(ReturnCodeEnum.UPLOAD_ERROR.getMessage(), "创建目录失败,中止导出文件");
            }
        }
        OutputStream out = null;
        try {
            out = new FileOutputStream(fileUrl);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String prePath = wac.getServletContext().getRealPath("/WEB-INF/template");
        FreeMarkerUtil.print(out, root, prePath,"compare.ftl");

工具类:

public class FreeMarkerUtil {

    private static Template getTemplate(String name, String prePath){
        try {
            //通过Freemarker的Configuration读取相应的ftl
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);//这里是对应的你使用jar包的版本号:2.3.23

            configuration.setDirectoryForTemplateLoading(new File(prePath)); //如果是maven项目可以使用这种方式
            //另外两种初始化方法也可以使用
            //configuration.setClassForTemplateLoading(this.getClass(), wac.getServletContext().getRealPath("/") + "/WEB-INF/template");
            //configuration.setServletContextForTemplateLoading(wac.getServletContext(), "/WEB-INF/template");
            return configuration.getTemplate(name);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void print(OutputStream out, Map root, String prePath, String fileName) {
        //通过Template可以将模版文件输出到相应的文件流
        Template template = getTemplate(fileName, prePath);
        try {
            OutputStreamWriter oWriter = new OutputStreamWriter(out,"UTF-8");
            template.process(root, oWriter);//导出文件
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果导出的Excel打开出错,可以把这个ss:ExpandedRowCount="26"删除试试,或者是因为日期等数据类型,写入格式未兼容等

你可能感兴趣的:(板子)