EasyPoi导出Excel
这几天一直在忙工作中的事情,在工作中有一个问题,可能是因为刚开始接触这个EasyPoi,对其也没有太多的理解,在项目中就使用了,有一个需求,是要导出项目中所有的表格,今天就对这个需求进行分析和实现吧;
需求:导出项目中所有的表格,导出文件为Excel;
技术:EasyPoi (现在市面上非常流行的offic操作技术)
我一直在采用注解实现,就是为每个表格都实现一个ExportExcelVo这个一个后缀的实现类;
但是表格太多了,当时也没有什么好的办法,也是对EasyPoi的不熟悉吧,em...,说白了就是自己菜,在清明节放假这几天好好学习一下,
推复杂的表格推荐使用注解,实现类,可以精确到控制每个字段的格式化,样式,合并单元格等等属性;具体的去官网看;
但是这个需求并不复杂,而且表格也不复杂,本人还花费了大量时间,感觉到了知识的不足,但是每个人也不可能什么都会,最重要的不是什么都会,而是愿意花时间去学习,知识就是一点点累计的;
今天来讲一下EasyPoi导出Excel动态列,并控制列的宽度和顺序,和做的时候碰见的一些问题;
二话不说上代码
数据样例
Data.java
1 package ExcelExport;
2
3 /**
4 * Excel动态列导出 测试数据样例
5 */
6 public interface Data {
// 列头1
7 String col1String = "{n" +
8 " "fileName":"存储名称",n" +
9 " "fileType":"存储方式",n" +
10 " "ip":"ip地址",n" +
11 " "port":"端口号",n" +
12 " "file":"存放路径",n" +
13 " "bangFc":"绑定文件",n" +
14 " "isEnabled":"是否启用",n" +
15 " "createTime":"创建时间",n" +
16 " "createName":"创建人姓名",n" +
17 " "updateTime":"更新时间",n" +
18 " "updateName":"更新人姓名"n" +
19 "}";
// 列头2
20 String col2String = "{n" +
21 " "fileName":"存储名称",n" +
22 " "fileType":"存储方式",n" +
23 " "ip":"ip地址",n" +
24 " "port":"端口号",n" +
25 " "file":"存放路径",n" +
26 " "bangFc":"绑定文件",n" +
27 " "isEnabled":"是否启用"n" +
28 "}";
29
// 列宽
30 String colWidth = "{n" +
31 " "fileName":"15",n" +
32 " "fileType":"15",n" +
33 " "ip":"15",n" +
34 " "port":"15",n" +
35 " "file":"15",n" +
36 " "bangFc":"15",n" +
37 " "isEnabled":"15",n" +
38 " "createTime":"20",n" +
39 " "createName":"15",n" +
40 " "updateTime":"20",n" +
41 " "updateName":"15"n" +
42 "}";
// 列数据
43 String data = "[n" +
44 " {n" +
45 " "fileName": "测试ftp别名", n" +
46 " "fileType": "ftp存储", n" +
47 " "ip": "192.168.0.1",n" +
48 " "port": "21",n" +
49 " "file": "/archive",n" +
50 " "bangFc": "电子档案",n" +
51 " "isEnabled": "已启用",n" +
52 " "createTime": "2020-03-09",n" +
53 " "createName": "admin",n" +
54 " "updateTime": "2020-03-09",n" +
55 " "updateName": "zyg"n" +
56 " },n" +
57 " {n" +
58 " "fileName": "测试mongodb别名",n" +
59 " "fileType": "mongodb存储",n" +
60 " "ip": "192.168.0.2",n" +
61 " "port": "27017",n" +
62 " "file": "/archive",n" +
63 " "bangFc": "电子档案",n" +
64 " "isEnabled": "已启用",n" +
65 " "createTime": "2020-03-09",n" +
66 " "createName": "admin",n" +
67 " "updateTime": "2020-03-09",n" +
68 " "updateName": "zyg"n" +
69 " }n" +
70 "]";
71 }
上面的就是定义的列头,列宽,数据
工具类ExcelExport
1 package ExcelExport.utils;
2
3 import cn.afterturn.easypoi.excel.ExcelExportUtil;
4 import cn.afterturn.easypoi.excel.entity.ExportParams;
5 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
6 import com.alibaba.fastjson.JSONArray;
7 import com.alibaba.fastjson.JSONObject;
8 import org.apache.poi.ss.usermodel.Workbook;
9
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.io.OutputStream;
13 import java.util.ArrayList;
14 import java.util.LinkedHashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 /**
19 * @Description Excel工具类
20 * @ClassName ExcelUtils
21 * @Author mr.zhang
22 * @Date 2020/4/6 15:57
23 * @Version 1.0.0
24 **/
25 public class ExcelUtils {
26
27 /**
28 * 导出Excel 动态列
29 * @param colTitle 动态列头
30 * @param colWidth 对应列宽
31 * @param dataList 数据集合
32 * @param tableTitle 表头
33 * @param sheetTitle sheet头
34 * @param response response
35 * @param downLoadName 下载文件名
36 * @throws IOException
37 */
38 public static void exportDynamicExportExcel(String colTitle, String colWidth, String dataList, String tableTitle, String sheetTitle, HttpServletResponse response, String downLoadName) throws IOException {
39
40 // 解析列头 在这里用LinkedHashMap 做有序列 因为HashMap是没有顺序的
41 Map colTitleMap = JSONObject.parseObject(colTitle, LinkedHashMap.class);
42 // 列宽就不需要有序了
43 Map colWidthMap = JSONObject.parseObject(colWidth, Map.class);
44
45 // 列头容器
46 List<ExcelExportEntity> colList = new ArrayList<>();
47 // 列头遍历 采用Foreach
48 colTitleMap.forEach((k, v) -> {
// 创建列对象 name k width
49 ExcelExportEntity excelExportEntity = new ExcelExportEntity(v.toString(), k, Integer.valueOf(colWidthMap.get(k).toString()));
50 colList.add(excelExportEntity);
51 });
52
53 // 解析数据
54 JSONArray jsonArray = JSONObject.parseArray(dataList);
55 List<JSONObject> maps = jsonArray.toJavaList(JSONObject.class);
56 // 调用EasyPoi 返回workbook
57 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(tableTitle, sheetTitle), colList, maps);
58 if (workbook != null) {
59 writeToWeb(workbook, response, downLoadName);
60 }
61
62 }
63
// 返回到Web
64 private static void writeToWeb(Workbook sheets, HttpServletResponse response, String fileName) throws IOException {
65 response.setContentType("application/vnd.ms-excel;charset=UTF-8");
66 response.setCharacterEncoding("UTF-8");
67 response.setHeader("Content-Disposition", "attachment;fileName=" +
68 java.net.URLEncoder.encode(fileName + ".xls", "UTF-8"));
69 OutputStream outputStream = response.getOutputStream();
70 sheets.write(outputStream);
71 outputStream.flush();
72 outputStream.close();
73 }
74
75 }
最后安装到Maven的本地库就可以用了,如果公司存在Maven库可以发布到公司的Maven库中.
碰见的问题:
在Spring-boot项目中请采用easypoi场景启动器,防止依赖问题
列头顺序的问题,之前在解析列头的时候采用的是接口Map.class,发现导出之后列的顺序不可控,后来绝顶用LinkedHashMap.class,这样列的顺序就是你定义的顺序;
用到的依赖:
easypoi 场景启动器,servlet,fastJson
作者:彼岸舞
时间:2020 4 6
内容关于:POI
本文属于作者原创,未经允许,禁止转发
- 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
- 3097: Hash Killer I
- 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复
- 1684: [Usaco2005 Oct]Close Encounter
- 算法模板——Dinic最小费用最大流
- 算法模板——Dinic网络最大流 1
- SQL Server 使用全文索引进行页面搜索
- 2764: [JLOI2011]基因补全
- 1000: A+B Problem(NetWork Flow)
- 博弈论进阶之Multi-SG
- 2929: [Poi1999]洞穴攀行
- SQL Server 执行计划缓存
- 1081: [SCOI2005]超级格雷码
- 1715: [Usaco2006 Dec]Wormholes 虫洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法