最近业务需要做复杂的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
微信公众号
来源:https://www.cnblogs.com/niugang0920/p/12550302.html