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

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

      

  • 相关阅读:
    Android通过流播放声音
    Android 凑热闹的MusicPlay
    ANDROID开发之SQLite详解
    Android中Bitmap和Drawable
    java synchronized详解
    android 使用广播监听网络状态
    你想不到的!CSS 实现的各种球体效果【附在线演示】
    18(19).迭代器协议和生成器
    18.函数复习,文件处理b模式(二进制处理),文件处理其他高级玩法
    17.python文件处理
  • 原文地址:https://www.cnblogs.com/flower-dance/p/12643518.html
Copyright © 2011-2022 走看看