EasyExcel之不使用對象靈活生成Excel,並且調整行高、自動列寬與自由合並


最近小秋熊看了阿里的開源項目將EasyExcel,發現它是個很強大的工具,但是官方介紹中大部分都是使用對象,變量增加注解的方式。

本文介紹一下SpringBoot中,簡單通過List生成excel並下載的方法,大家可以直接CV大法。還可以實現通過自己寫樣式策略來自由調整行高、自由合並。

一、將List直接導出為Excel下載

1.controller內接口寫法:

 @PostMapping("export")
 public void export(@RequestBody Map<String,Object> param, HttpServletResponse response){
     String[] head = {"用戶賬戶名稱","版本","購買時間","購買時長(天)","支付金額"};
     List<Map<String,Object>> dataList = userPayDetailService.selectExportList(param);
     EasyExcelUtils.write(head,dataList,"用戶支付明細","用戶支付明細",response);
 }

此處head變量為excel的一行表頭。

dataList 為整理好的表格內容

2.EasyExcelUtils.write 方法如下:

public static void write(String[] head, List<Map<String,Object>> dataList, String sheetName, String fileName, HttpServletResponse response){
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    try {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).head(getHeadList(head)).autoCloseStream(Boolean.FALSE)
                .sheet(sheetName).doWrite(getDataList(dataList));
    } catch (Exception e) {
        // 重置response
        response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        MsgResponse msgResponse = new MsgResponse();
        msgResponse.setEnum(CodeEnum.EXPORT_ERROR);
        try {
            response.getWriter().println(JSON.toJSONString(msgResponse));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

這里核心就是EasyExcel.write方法,此處紫色部分我使用了easyExcel中默認的 LongestMatchColumnWidthStyleStrategy()方法,即自動設置列寬。也可以不加。

若不需要表頭,就不用加.head()

以上就可以快速將查詢結果寫入excel並下載了。

二、設置合並、行高等樣式

要知道,EasyExcel中的寫,不僅可以使用EasyExcel.write方法,直接創建一個ExcelWriter對象也一樣,代碼如下:

OutputStream out = response.getOutputStream();
ExcelWriter writer = EasyExcelFactory.write(out)
        .registerWriteHandler(new MyMergeStrategy(mergeMap))
        .registerWriteHandler(new MySimpleRowHeightStyleStrategy((short)20, (short)73))
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .build();
WriteSheet writeSheet = EasyExcel.writerSheet(1, "sheet1").needHead(false).build();
writer.write(retBody, writeSheet);
writer.finish();
out.close();

這里我把Excel文件寫入了輸出流中,瀏覽器可以直接下載文件。

其中MyMergeStrategy、MySimpleRowHeightStyleStrategy、LongestMatchColumnWidthStyleStrategy為EasyExcel原本默認的寫入策略,這些我們自己都可以重寫。

這里我的My開頭的都是小秋熊根據自己的需要重寫的。

例如MyMergeStrategy,可以合並很多個單元格,將要合並的單元格變成一個Map。官方的合並策略為:OnceAbsoluteMergeStrategy(),只能傳輸一組合並信息,顯然是不夠的,需要改造成多組合並單元格的信息。

MyMergeStrategy代碼如下:

public class MyMergeStrategy extends AbstractSheetWriteHandler {

    private List<Map<String, Integer>> rowColumnIndex;
    public MyMergeStrategy(List<Map<String, Integer>> index) {
        if (index == null || index.size() == 0){
            throw new IllegalArgumentException("All parameters must be greater than 0");
        }

        this.rowColumnIndex = index;
    }
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
     //這里循環將每組合並信息插入
for (Map<String, Integer> map : rowColumnIndex){ if (map.get("firstRowIndex") < 0 || map.get("lastRowIndex") < 0 || map.get("firstColumnIndex") < 0 || map.get("lastColumnIndex") < 0){ throw new IllegalArgumentException("All parameters must be greater than 0"); } CellRangeAddress cellRangeAddress = new CellRangeAddress(map.get("firstRowIndex"), map.get("lastRowIndex"), map.get("firstColumnIndex"), map.get("lastColumnIndex")); writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress); } } }

是不是很簡單呢?如果不是用對象生成,這樣已經足夠靈活使用了!有什么疑問大家可以在下面給小秋熊留言,互相交流!

本文作者:小秋熊

轉載請注明出處

 


免責聲明!

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



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