FreeMarker导出复杂Excel

孤人 提交于 2020-03-23 09:59:13

最近业务需要做复杂的Excel导出功能,由于Execl样式复杂,本来想做基于标签占位符的导出,由于时间有限,没有时间预言和写demo,最后还是选择了基于POI的导出,就是样式复杂了点。

现在有时间研究了一下使用freemarker导出复杂的excel表格(word也是可以的)。

一、首先根据最终需要导出的excel表格的格式,用假数据填充后生成一个excel模板。

例如下面使我们要导出的人员信息。
在这里插入图片描述

二、Execl另存为.xml文件

如果报以下错误

在这里插入图片描述

请选择

在这里插入图片描述

三、通过Freemarker进行xml文件编辑

在这里插入图片描述
四、Java代码开发

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

实体类:

public class UserInfo {
    private String username;
    private Integer age;
    private String phone;

    private String sex;
    private String address;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

核心代码

 public static void main(String[] args) throws IOException, TemplateException {
        Configuration config = new Configuration(Configuration.VERSION_2_3_0);
        //模板所在文件夹
        config.setDirectoryForTemplateLoading(new File("D:/execltest"));
        config.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_0));
        //模板名称
        Template template = config.getTemplate("name2.xml");

        FileOutputStream fileOutputStream = new FileOutputStream("D:/execltest/name.xls");
        OutputStreamWriter out = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
        List<UserInfo> list = Lists.newArrayListWithCapacity(5);
        for (int i = 0; i < 5; i++) {
            UserInfo userInfo = new UserInfo();
            userInfo.setUsername("张三" + i);
            userInfo.setAge(22 + i);
            userInfo.setPhone("15094037899");
            userInfo.setSex("男");
            userInfo.setAddress("北京");
            list.add(userInfo);
        }
        Map<String, Object> map = Maps.newHashMap();
        map.put("personList",list);

        template.process(map,out);


    }

五.效果

在这里插入图片描述

遇到的问题:

我是用wps生成的xml,最后生成的excel,在office excel打开,报如下错误,但是用wps打开是没问题的,可能是兼容性问题:
在这里插入图片描述

但是点击也是能打开的。这个问题用office excel生成xml进行验证,还是报上面的错误,网上的方法都试了没用。

打开excel文件,会出现上面的弹框,这个问题一直不好解决,因为我们生成的是xml标记语言,只是将后缀改为xls显示而已,但实际上不是xls文件,如果有好的解决方案(不是修改注册表的掩耳盗铃的方式),期待留言!

导出word也是提示上面错误

六:建议

excel右键导出xml(最好利用excel microsoft导出,不要用wps导出xml,因为microsoft导出的xml格式简单)

ss:ExpandedRowCount="3" wps可以不改,microsoft设置越大越好(例如999999),或者用freemarker来传值,不能小于实际行数

excel(最好导出的格式都是*.xls,不要生成*.xlsx,踩过坑的都知道,由xml生成的xlsx microsoft打不开)

word(最好导出的格式是.doc,不要生成.docx)

参考来自: https://blog.csdn.net/m0_38106299/article/details/80830161

微信公众号
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!