前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyPoi导出Excel

EasyPoi导出Excel

作者头像
彼岸舞
发布2020-09-30 10:31:48
2.6K1
发布2020-09-30 10:31:48
举报
文章被收录于专栏:java开发的那点事

这几天一直在忙工作中的事情,在工作中有一个问题,可能是因为刚开始接触这个EasyPoi,对其也没有太多的理解,在项目中就使用了,有一个需求,是要导出项目中所有的表格,今天就对这个需求进行分析和实现吧;

需求:导出项目中所有的表格,导出文件为Excel;

技术:EasyPoi (现在市面上非常流行的offic操作技术)

我一直在采用注解实现,就是为每个表格都实现一个ExportExcelVo这个一个后缀的实现类;

但是表格太多了,当时也没有什么好的办法,也是对EasyPoi的不熟悉吧,em...,说白了就是自己菜,在清明节放假这几天好好学习一下,

推复杂的表格推荐使用注解,实现类,可以精确到控制每个字段的格式化,样式,合并单元格等等属性;具体的去官网看;

但是这个需求并不复杂,而且表格也不复杂,本人还花费了大量时间,感觉到了知识的不足,但是每个人也不可能什么都会,最重要的不是什么都会,而是愿意花时间去学习,知识就是一点点累计的;

今天来讲一下EasyPoi导出Excel动态列,并控制列的宽度和顺序,和做的时候碰见的一些问题;

二话不说上代码

数据样例

Data.java

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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\04\06

内容关于:POI

本文属于作者原创,未经允许,禁止转发

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档