这几天一直在忙工作中的事情,在工作中有一个问题,可能是因为刚开始接触这个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\04\06

内容关于:POI

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

  

EasyPoi导出Excel的更多相关文章

  1. SpringBoot使用Easypoi导出excel示例

    SpringBoot使用Easypoi导出excel示例 https://blog.csdn.net/justry_deng/article/details/84842111

  2. 关于EasyPoi导出Excel

    如果你觉得Easypoi不好用,喜欢用传统的poi,可以参考我的这篇博客:Springmvc导出Excel(maven) 当然了,万变不离其宗.Easypoi的底层原理还是poi.正如MyBatis ...

  3. 使用easypoi导出excel

    EasyPOI是在jeecg的poi模块基础上,继续开发独立出来的,可以说是2.0版本,EasyPoi封装的目的和jeecg一致,争取让大家write less do more ,在这个思路上easy ...

  4. easyPOI导出excel报错

    http-nio--exec- at :: - excel cell export error ,data is :com.jn.ssr.superrescue.web.qc.dto.Automati ...

  5. EasyPoi 导出Excel(ExcelExportEntity生成表头)

    [引入依赖] <!--easypoi--> <dependency> <groupId>cn.afterturn</groupId> <artif ...

  6. 使用EasyPOI导出excel示例

    package com.mtoliv.sps.controller; import java.io.IOException; import java.io.OutputStream; import j ...

  7. Vue+EasyPOI导出Excel(带图片)

    一.前言 平时的工作中,Excel 导入导出功能是非常常见的功能,无论是前端 Vue (js-xlsx) 还是 后端 Java (POI),如果让大家手动编码实现的话,恐怕就很麻烦了,尤其是一些定制化 ...

  8. java导出excel(easypoi)

    介绍 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 ...

  9. easypoi导出单个sheet和多个sheet

    今天有时间研究了一下easypoi,感觉使用了easypoi导出excel方便了很多,不用写很多复杂的反射,只需要使用注解和一些工具类就可以实现常用的excel的导出,接下来介绍一下easypoi如何 ...

随机推荐

  1. 3、Java 对象和类

    1.理解Java中的类和对象 对象: 作为学习计算机专业的很有意思,跟朋友开玩笑说,我有很多对象,没有就new一个.对象可以说是类的实例,通过类的构造方法得到的一个对象实例.它拥有此对象应有的行为与方 ...

  2. 刚体验完RabbitMQ?一文带你SpringBoot+RabbitMQ方式收发消息

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 这篇是消息队列RabbitMQ的第二弹. 上一篇的结尾我也预告了本篇的内容:利用RabbitTemplate和注解进行收发消息,还有一个我 ...

  3. Visual Studio 2019预览,净生产力

    本文章为机器翻译. https://blogs.msdn.microsoft.com/dotnet/2018/12/13/visual-studio-2019-net-productivity/ 该文 ...

  4. 使用Tensorflow搭建自编码器(Autoencoder)

    自编码器是一种数据压缩算法,其中数据的压缩和解压缩函数是数据相关的.从样本中训练而来的.大部分自编码器中,压缩和解压缩的函数是通过神经网络实现的. 1. 使用卷积神经网络搭建自编码器 导入MNIST数 ...

  5. windows下mongoDB的下载和安装

    1.进入mongoDB官网,官网地址:https://www.mongodb.com 2.  点击Try free按钮,进入下载页面 3.点击download进行下载:下载完成如下图: 4.点击下载的 ...

  6. 基于OpenSIPS 实现分机注册服务服务器

    呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机.通常情况下我们通过软交换平台FreeSWITCH.Asterisk即可搭建分机注册服务. 但单台FreeSWITCH或Asteri ...

  7. linux驱动之内核空间几种长延时的实现策略的优劣评估

    本文转载自http://blog.chinaunix.net/uid-23769728-id-3084737.html 这里所谓的长延时,是指其实现时间延时的粒度可以在HZ这一水准上.<深入Li ...

  8. 将composer切换到国内镜像

    composer config -g repo.packagist composer https://packagist.phpcomposer.com

  9. Mybatis入门(四)------联表查询

    Mybatis联表查询 一.1对1查询 1.数据库建表 假设一个老师带一个学生 CREATE TABLE teacher( t_id INT PRIMARY KEY, t_name VARCHAR(3 ...

  10. python 基础-文件读写'r' 和 'rb'区别

    原文链接: python基础-文件读写'r' 和 'rb'区别 一.Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r ...