一 easyExcel的導入導出java
1.導入jar包ajax
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beat1</version>
</dependency>
1.導入與導出
這裏分兩種 一種是有模板的,一種是無Java模板的,先說有Java模板的
有Java模板的就是先定義一個實體類,繼承BaseRowMode,再加上@ExcelProperty註解
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class TaskDetail extends BaseRowModel implements Serializable { private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 用戶id */ private String userId; /** * 商品名稱 */ @ExcelProperty(value = {"商品名稱"},index = 2) private String wareName; /** * 收貨人手機號 */ @ExcelProperty(value = {"收貨人手機號"},index = 3) private String mobile; /** * 收貨人姓名 */ @ExcelProperty(value = {"收貨人姓名"},index = 4) private String name; /** * 省 */ @ExcelProperty(value = {"省份"},index = 5) private String province; /** * 市 */ @ExcelProperty(value = {"城市"},index = 6) private String city; /** * 區縣 */ @ExcelProperty(value = {"區縣"},index = 7) private String county; /** * 詳細地址 */ @ExcelProperty(value = {"詳細地址"},index = 8) private String address; /** * 運單號 */ @ExcelProperty(value = {"運單號"},index = 1) private String waybill; }
其中value對應的就是excel表頭標題 ,index就是第幾列, 這裏有兩點須要注意 這個bean必須繼承 BaseRowModel,另外一個是我這裏這個類直接就是對應數據庫表的實體類,在使用lombok省去get、set方法的@Data註解時,再繼承BaseRowModel,致使了使用jdbc模板插入數據時出現異常,因此若是要用同一個bean類,最好本身寫插入的sql。sql
導入的話 配合上一篇說的MultipartFile 以表單形式提交 獲取文件數據庫
@RequestMapping("/multipleUploadReceipt") public @ResponseBody CallbackResult<?> multipleUploadReceipt(@RequestParam("multipartFile") MultipartFile multipartFile, @RequestParam("detailId") int detailId){ return taskDetailService.multipleUploadReceipt(multipartFile, detailId); }
這個multipartFile能獲取到文件的流api
List<Object> dataList = dataList = EasyExcelFactory.read(multipartFile.getInputStream(), new Sheet(1, 2, TaskDetail.class));
sheet的參數 1表示excel中第一個sheet表,2表示第幾行, TaskDetail就是定義的java模型。app
若是不定義java模型 以下:異步
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
這裏他的示例中有提到一個 建議 就是 小於1000行數據讀取使用read,大於1000 最好使用 readBySax方法。
性能
導出也是同樣,由於業務需求導出須要按照用戶的搜索條件獲取數據,並且須要下載到客戶端本地,這個時候無法用ajax異步請求,他作不到下載文件,嘗試了不少方法,貌似是沒法作到的,url
之前發送下載請求是這樣的spa
var url = Global.contextPath + "/industry/exportData?date="+date+"&cid3="+cid3; openNewWin({ url : url, target : "_self" });
可是我這裏因爲參數太多,用get方法比較麻煩,就用form表單提交請求了,js中使用 $("#form-condition").submit();
Controller:
1 @RequestMapping("/exportOrderBatch") 2 public void exportOrderBatch(ListTaskDetialDTO listTaskDetialDTO, HttpServletResponse response){
3 service.exportOrderBatch(listTaskDetialDTO, response); 4 }
其中listTaskDetialDTO就是表單提交上來的查詢參數,會自動實例化,
Service:
1 public void exportOrderBatch(ListTaskDetialDTO listTaskDetialDTO, HttpServletResponse response) { 2 3 int pageSize = 1000; 4 listTaskDetialDTO.getPage().setSize(pageSize); 5 //查詢導出數據 6 IPage<TaskDetail> detailPage = listTaskDetail(listTaskDetialDTO); 7 List<TaskDetail> records = detailPage.getRecords(); 8 int pages = ((Long)detailPage.getPages()).intValue(); 9 Integer exportType = listTaskDetialDTO.getPlatform(); 10 11 String name = ""; 12 if(exportType == 1){ 13 name = "淘寶-" ; 14 }else if(exportType == 3){ 15 name = "京東-"; 16 }else{ 17 name = "拼多多-"; 18 } 19 name += System.currentTimeMillis() + ".xlsx"; 20 21 try (OutputStream out = response.getOutputStream()){ 22 response.setContentType("application/octet-stream;charset=utf-8"); 23 response.setContentType("application/vnd.ms-excel"); 24 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name,"utf-8") + ".xlsx"); 25 response.setHeader("Pragma", "public"); 26 27 ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true); 28 29 // 設置SHEET 30 Sheet sheet; 31 if(exportType == 1){ 32 sheet = new Sheet(1, 0, ExportExcelJd.class); 33 }else if(exportType == 2){ 34 sheet = new Sheet(1, 0, ExportExcelTaobao.class); 35 }else{ 36 sheet = new Sheet(1, 0, ExportExcelPin.class); 37 } 38 sheet.setSheetName("sheet1"); 39 sheet.setAutoWidth(true); 40 List<ExportExcelJd> excelData = getExcelData(records); 41 writer.write(excelData, sheet);//導出 42 43 for (int i = 2; i < pages; i++) { 44 listTaskDetialDTO.getPage().setCurrent(i); 45 records = listTaskDetail(listTaskDetialDTO, mobile).getRecords(); 46 excelData = getExcelData(records); 47 writer.write(excelData, sheet); 48 } 49 writer.finish(); 50 out.flush(); 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 }
這裏值得說的是31行,設置表頭,由於一樣的數據要導出3種不一樣的格式的excle表格,下面write方法用的實體類 是哪個 都無所謂,關鍵是new Sheet的時候的參數,決定了導出excel採用哪一種表頭格式。
而無模型的 須要多作一件事情,設置表頭
1 Table table = new Table(1); 2 List<List<String>> titles = new ArrayList<>(); 3 titles.add(Arrays.asList("用戶ID")); 4 titles.add(Arrays.asList("名稱")); 5 titles.add(Arrays.asList("年齡")); 6 titles.add(Arrays.asList("生日")); 7 table.setHead(titles);
導出時數據集合不能用List<ExportExcelJd> 而是List<List<String>> userList
裏面的List<String>表明一行數據,把你的數據按照順序放到集合中
userList.add(Arrays.asList("ID_" + i, "小明" + i, String.valueOf(i), new Date().toString()));
最後導出
writer.write0(userList, sheet, table);
writer.finish();
他也能夠用循環方式分批 操做
這裏再說寬度設置
//設置列寬 設置每列的寬度 Map columnWidth = new HashMap(); columnWidth.put(0,10000); columnWidth.put(1,40000); sheet.setColumnWidthMap(columnWidth);
有模型導出時能夠經過註解 進行合拼單元格表頭的,記住是表頭
java模型寫法以下:
1 public class MultiLineHeadExcelModel extends BaseRowModel { 2 3 @ExcelProperty(value = {"表頭1","表頭1","表頭31"},index = 0) 4 private String p1; 5 6 @ExcelProperty(value = {"表頭1","表頭1","表頭32"},index = 1) 7 private String p2; 8 9 @ExcelProperty(value = {"表頭3","表頭3","表頭3"},index = 2) 10 private int p3; 11 12 @ExcelProperty(value = {"表頭4","表頭4","表頭4"},index = 3) 13 private long p4; 14 15 @ExcelProperty(value = {"表頭5","表頭51","表頭52"},index = 4) 16 private String p5; 17 18 @ExcelProperty(value = {"表頭6","表頭61","表頭611"},index = 5) 19 private String p6; 20 21 @ExcelProperty(value = {"表頭6","表頭61","表頭612"},index = 6) 22 private String p7; 23 24 @ExcelProperty(value = {"表頭6","表頭62","表頭621"},index = 7) 25 private String p8; 26 27 @ExcelProperty(value = {"表頭6","表頭62","表頭622"},index = 8) 28 private String p9; 29 }
easyExcel就上面這些了
2、easyPoi
easyPoi和easyExcel比最大的好處就是,他有完善的Api, easyExcel沒有。
easyPoi的api地址 http://easypoi.mydoc.io/ ,在使用上裏面說的其實很清楚,這裏就不說了,
easyPoi其實在功能多樣性上更完善些,使用上更靈活些,可是在導出的性能比較上就差easyExcel不少,數據超過1萬條在內存的消耗上就會出現差距, easyExcel是很省內存的,若是導出量很大的話 仍是建議使用easyExcel