easyExcel導入導出excel表格


一 easyExcel的導入導出

 1.導入jar包

  <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。

導入的話 配合上一篇說的MultipartFile 以表單形式提交 獲取文件

   @RequestMapping("/multipleUploadReceipt")
    public @ResponseBody CallbackResult<?> multipleUploadReceipt(@RequestParam("multipartFile") MultipartFile multipartFile, @RequestParam("detailId") int detailId){
        return taskDetailService.multipleUploadReceipt(multipartFile, detailId);
    }

  這個multipartFile能獲取到文件的流

List<Object> dataList = dataList = EasyExcelFactory.read(multipartFile.getInputStream(), new Sheet(1, 2, TaskDetail.class));

  sheet的參數 1表示excel中第一個sheet表,2表示第幾行, TaskDetail就是定義的java模型。

  如果不定義java模型 如下:

List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(1, 0));

 這里他的示例中有提到一個 建議 就是 小於1000行數據讀取使用read,大於1000 最好使用 readBySax方法。

 導出也是一樣,因為業務需求導出需要按照用戶的搜索條件獲取數據,而且需要下載到客戶端本地,這個時候沒法用ajax異步請求,他做不到下載文件,嘗試了很多方法,貌似是無法做到的,

 以前發送下載請求是這樣的

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就上面這些了

二、easyPoi

easyPoi和easyExcel比最大的好處就是,他有完善的Api, easyExcel沒有。

easyPoi的api地址 http://easypoi.mydoc.io/ ,在使用上里面說的其實很清楚,這里就不說了,

easyPoi其實在功能多樣性上更完善些,使用上更靈活些,但是在導出的性能比較上就差easyExcel很多,數據超過1萬條在內存的消耗上就會出現差距, easyExcel是很省內存的,如果導出量很大的話 還是建議使用easyExcel

 

 

 

 

  

  

 

 

 

 

 


  
    
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM