zoukankan      html  css  js  c++  java
  • 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 = "{ " + 8 " "fileName":"存储名称", " + 9 " "fileType":"存储方式", " + 10 " "ip":"ip地址", " + 11 " "port":"端口号", " + 12 " "file":"存放路径", " + 13 " "bangFc":"绑定文件", " + 14 " "isEnabled":"是否启用", " + 15 " "createTime":"创建时间", " + 16 " "createName":"创建人姓名", " + 17 " "updateTime":"更新时间", " + 18 " "updateName":"更新人姓名" " + 19 "}";
          // 列头2
    20 String col2String = "{ " + 21 " "fileName":"存储名称", " + 22 " "fileType":"存储方式", " + 23 " "ip":"ip地址", " + 24 " "port":"端口号", " + 25 " "file":"存放路径", " + 26 " "bangFc":"绑定文件", " + 27 " "isEnabled":"是否启用" " + 28 "}"; 29
          // 列宽 30 String colWidth = "{ " + 31 " "fileName":"15", " + 32 " "fileType":"15", " + 33 " "ip":"15", " + 34 " "port":"15", " + 35 " "file":"15", " + 36 " "bangFc":"15", " + 37 " "isEnabled":"15", " + 38 " "createTime":"20", " + 39 " "createName":"15", " + 40 " "updateTime":"20", " + 41 " "updateName":"15" " + 42 "}";
          // 列数据
    43 String data = "[ " + 44 " { " + 45 " "fileName": "测试ftp别名", " + 46 " "fileType": "ftp存储", " + 47 " "ip": "192.168.0.1", " + 48 " "port": "21", " + 49 " "file": "/archive", " + 50 " "bangFc": "电子档案", " + 51 " "isEnabled": "已启用", " + 52 " "createTime": "2020-03-09", " + 53 " "createName": "admin", " + 54 " "updateTime": "2020-03-09", " + 55 " "updateName": "zyg" " + 56 " }, " + 57 " { " + 58 " "fileName": "测试mongodb别名", " + 59 " "fileType": "mongodb存储", " + 60 " "ip": "192.168.0.2", " + 61 " "port": "27017", " + 62 " "file": "/archive", " + 63 " "bangFc": "电子档案", " + 64 " "isEnabled": "已启用", " + 65 " "createTime": "2020-03-09", " + 66 " "createName": "admin", " + 67 " "updateTime": "2020-03-09", " + 68 " "updateName": "zyg" " + 69 " } " + 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

    作者:彼岸舞

    时间:202046

    内容关于:POI

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

      

  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/flower-dance/p/12643518.html
Copyright © 2011-2022 走看看