這幾天一直在忙工作中的事情,在工作中有一個問題,可能是因為剛開始接觸這個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
本文屬於作者原創,未經允許,禁止轉發