zoukankan      html  css  js  c++  java
  • FreeMarker导出复杂Excel

    最近业务需要做复杂的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

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

  • 相关阅读:
    富人和穷人的区别(转)
    asp.net主题的几种应用
    asp.net主题的几种应用
    富人和穷人的区别(转)
    SQL SERVER中一些常见性能问题的总结
    SQL SERVER中一些常见性能问题的总结
    Bind和Eval的区别详解
    优酷去广告代码
    使用jquery框架导致js功能失效解决办法
    absolute定位问题
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12550302.html
Copyright © 2011-2022 走看看