原文參考:https://blog.csdn.net/H900302/article/details/109726240
今天嘗試使用easypoi做Excel導出,首先如它的名字一樣,導出相比之前使用的poi確實簡單了不少,但是它的官方文檔是真的不詳細,有待完善,拿我導出的文件來說吧(圖如下),這個標題合並單元格的效果是@Excel注解的groupName屬性實現的,但是在官方文檔中說明@Excel注解的時候並沒有對groupName屬性做說明,而且源碼中雖然有這個屬性,但是沒有對這些屬性做一點注釋說明,直到我看到文檔的這一節2.12 groupname和ExcelEntity的name屬性才對groupname屬性進行說明,還有錯別字真是太多了。
雖然感覺什么都有,但是就是源碼的注釋太少了,根本不知道這些方法是干啥的,雖然抱怨不是個好現象,但是沒忍住。。。吐槽到此結束,說歸說,入門還是離不開它的官方文檔,計划接下來幾篇記錄一下使用easypoi完成常用的表格操作。
首先,准備下測試表和數據:
實體類、Mapper接口啥的就不貼了,xml中也只有一個簡單的查詢:
<select id="selectUsers" resultType="com.example.springbootmp.dto.user.UserMobileDto"> select * from t_user_excel </select>
先看下導出的文件樣子和生成導出文件的實體類:
對比上面兩張圖說明一下使用easypoi導出的實體UserExcelDto,按照官方的使用說明,簡單的使用@Excel注解標記一下字段就好,name屬性為導出表格的列明,數據庫中性別存的字符串類型的man/woman,如果我們導出的時候想顯示為男/女,@Excel注解有一個replace屬性可以替換值,當然也可以使用枚舉,easypoi也有對枚舉處理的說明,這個以后再測試,暫且使用replace屬性,replace值的寫法形如:replace = {"A_a","B_b"},它的意思就是假如實體字段的值為a,那么導出的時候列值替換為A,其它參數同理;@Excel注解還有一個參數groupName可以很容易的實現雙行表頭的樣子,如圖中的時間一列,使用groupName可以將多個字段歸並到一列。
貼一下controller導出方法代碼:
@GetMapping public void export(HttpServletResponse response) throws IOException { List<UserExcelDto> userExcelDtos = userExcelService.selectUsers(); String fileName = "下載的文件名"; String sheetName = "sheet名字"; String title = "sheet頁的title"; ExportParams exportParams = new ExportParams(title,sheetName); ExcelUtil.exportExcel(userExcelDtos,UserExcelDto.class,fileName,exportParams,response); }
雖然easypoi提供了導出方法ExcelExportUtil.exportExcel(),不過我這里自定義了一個導出工具類,便於設置參數,從上面的截圖可以知道,title、sheetName的作用不啰嗦了,看下導出工具類代碼:
/** * excel 導出 * * @param list 要導出的數據 * @param pojoClass pojo類型 * @param fileName 文件名稱 * @param exportParams 導出表格參數 * @param response */ public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException { Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); downLoadExcel(fileName, response, workbook); } /** * 下載文件 * * @param fileName 文件名稱 * @param response * @param workbook excel數據 */ private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8")); workbook.write(response.getOutputStream()); } catch (Exception e) { throw new IOException(e.getMessage()); } }
easypoi的體驗到此結束,很明顯有很多待優化完善的地方,就像是時間顯示、枚舉類使用、可能一個用戶有多筆訂單這種需要合並展示的,接下來幾天慢慢補充。
補充一下:
ExportParams exportParams = new ExportParams(title,sheetName);
通常我們並不需要導出的表格中帶這個這個標題(sheet頁的title),那么可以將title設置為null即可,都不傳使用空構造器也可以,但是sheetName也會變為默認的sheet0、sheet1這種
還可以用設置二級標題。如:new ExportParams("sheet也title", "日期:2020-11-18","sheet名字");
看下title為null的效果(new ExportParams(null,sheetName)):
看下二級標題的效果:
總結:經測試,groupName是好用的