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

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

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

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

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

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

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

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

二话不说上代码

数据样例

Data.java

 package ExcelExport;

 /**
* Excel动态列导出 测试数据样例
*/
public interface Data {
      // 列头1
String col1String = "{\n" +
" \"fileName\":\"存储名称\",\n" +
" \"fileType\":\"存储方式\",\n" +
" \"ip\":\"ip地址\",\n" +
" \"port\":\"端口号\",\n" +
" \"file\":\"存放路径\",\n" +
" \"bangFc\":\"绑定文件\",\n" +
" \"isEnabled\":\"是否启用\",\n" +
" \"createTime\":\"创建时间\",\n" +
" \"createName\":\"创建人姓名\",\n" +
" \"updateTime\":\"更新时间\",\n" +
" \"updateName\":\"更新人姓名\"\n" +
"}";
      // 列头2
String col2String = "{\n" +
" \"fileName\":\"存储名称\",\n" +
" \"fileType\":\"存储方式\",\n" +
" \"ip\":\"ip地址\",\n" +
" \"port\":\"端口号\",\n" +
" \"file\":\"存放路径\",\n" +
" \"bangFc\":\"绑定文件\",\n" +
" \"isEnabled\":\"是否启用\"\n" +
"}";

      // 列宽
String colWidth = "{\n" +
" \"fileName\":\"15\",\n" +
" \"fileType\":\"15\",\n" +
" \"ip\":\"15\",\n" +
" \"port\":\"15\",\n" +
" \"file\":\"15\",\n" +
" \"bangFc\":\"15\",\n" +
" \"isEnabled\":\"15\",\n" +
" \"createTime\":\"20\",\n" +
" \"createName\":\"15\",\n" +
" \"updateTime\":\"20\",\n" +
" \"updateName\":\"15\"\n" +
"}";
      // 列数据
String data = "[\n" +
" {\n" +
" \"fileName\": \"测试ftp别名\", \n" +
" \"fileType\": \"ftp存储\", \n" +
" \"ip\": \"192.168.0.1\",\n" +
" \"port\": \"21\",\n" +
" \"file\": \"/archive\",\n" +
" \"bangFc\": \"电子档案\",\n" +
" \"isEnabled\": \"已启用\",\n" +
" \"createTime\": \"2020-03-09\",\n" +
" \"createName\": \"admin\",\n" +
" \"updateTime\": \"2020-03-09\",\n" +
" \"updateName\": \"zyg\"\n" +
" },\n" +
" {\n" +
" \"fileName\": \"测试mongodb别名\",\n" +
" \"fileType\": \"mongodb存储\",\n" +
" \"ip\": \"192.168.0.2\",\n" +
" \"port\": \"27017\",\n" +
" \"file\": \"/archive\",\n" +
" \"bangFc\": \"电子档案\",\n" +
" \"isEnabled\": \"已启用\",\n" +
" \"createTime\": \"2020-03-09\",\n" +
" \"createName\": \"admin\",\n" +
" \"updateTime\": \"2020-03-09\",\n" +
" \"updateName\": \"zyg\"\n" +
" }\n" +
"]";
}

上面的就是定义的列头,列宽,数据

工具类ExcelExport

 package ExcelExport.utils;

 import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.ss.usermodel.Workbook; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; /**
* @Description Excel工具类
* @ClassName ExcelUtils
* @Author mr.zhang
* @Date 2020/4/6 15:57
* @Version 1.0.0
**/
public class ExcelUtils { /**
* 导出Excel 动态列
* @param colTitle 动态列头
* @param colWidth 对应列宽
* @param dataList 数据集合
* @param tableTitle 表头
* @param sheetTitle sheet头
* @param response response
* @param downLoadName 下载文件名
* @throws IOException
*/
public static void exportDynamicExportExcel(String colTitle, String colWidth, String dataList, String tableTitle, String sheetTitle, HttpServletResponse response, String downLoadName) throws IOException { // 解析列头 在这里用LinkedHashMap 做有序列 因为HashMap是没有顺序的
Map colTitleMap = JSONObject.parseObject(colTitle, LinkedHashMap.class);
// 列宽就不需要有序了
Map colWidthMap = JSONObject.parseObject(colWidth, Map.class); // 列头容器
List<ExcelExportEntity> colList = new ArrayList<>();
// 列头遍历 采用Foreach
colTitleMap.forEach((k, v) -> {
          // 创建列对象 name k width
ExcelExportEntity excelExportEntity = new ExcelExportEntity(v.toString(), k, Integer.valueOf(colWidthMap.get(k).toString()));
colList.add(excelExportEntity);
}); // 解析数据
JSONArray jsonArray = JSONObject.parseArray(dataList);
List<JSONObject> maps = jsonArray.toJavaList(JSONObject.class);
// 调用EasyPoi 返回workbook
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(tableTitle, sheetTitle), colList, maps);
if (workbook != null) {
writeToWeb(workbook, response, downLoadName);
} }

    // 返回到Web
private static void writeToWeb(Workbook sheets, HttpServletResponse response, String fileName) throws IOException {
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" +
java.net.URLEncoder.encode(fileName + ".xls", "UTF-8"));
OutputStream outputStream = response.getOutputStream();
sheets.write(outputStream);
outputStream.flush();
outputStream.close();
} }

最后安装到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. 一文搞定Python正则表达式

    本文对正则表达式和 Python 中的 re 模块进行详细讲解 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  2. Java中的不可变集合,我们换个方式理解!!!

    不可变集合例: public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red" ...

  3. SCHP代码中的问题

    1.subprocess.CalledProcessError: Command ‘[‘where’, ‘cl’]’ returned non-zero exit status 1. 这个问题是因为电 ...

  4. 06 大数据CentOS6.5mini安装与网络配置

    1. CentOS6.5mini安装 文件>>新建虚拟机 选择自定义,下一步 默认,下一步 选择稍后安装操作系统,下一步 选择CentOS版本,下一步 给虚拟机命名,这个是在VMWare中 ...

  5. 【Java】AES加机解密工具类代码

    import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypt ...

  6. Go 语言中,有时 nil 并不是一个 nil

    今天,我遇到了一个 Go FAQ.首先,作为一个小小的 Go 语言测验,看看您是否在 Go playground 中运行该程序之前就能推断出它应该打印出的内容(我已经将程序放在侧边栏中,以防它在 Go ...

  7. CTFhub-WEB前置-http协议闯关

    前情提要: 在渗透学习过程中,web的基础知识很重要,在这里通过long long ago之前学习的http基础,并结合网上的CTFhub--WEB前置之http协议闯关,对web基础知识进行加固并查 ...

  8. Jsp内置对象application之统计浏览网页的次数

    <% Object obj = application.getAttribute("count"); if(obj !=null){ Integer sum = (Integ ...

  9. Spring Security报异常 Encoded password does not look like BCrypt

    控制台报错: Encoded password does not look like BCrypt 意思是前端传回去的密码格式与数据库里的密码格式不匹配,这样即使密码正确也无法校验.自然也就无法登录. ...

  10. NOSQL基础

    一.mongoDB介绍和使用 1.分布式文件储存数据库,使用C++开发的,可以存储任意数据(文件),允许在服务器端执行脚本,使用JSON形式储存数据{key:value} 2.支持的编程语言有:PHP ...