超簡潔!利用easyExcel導出,讀入Excel

来源:https://www.cnblogs.com/ljy-1471914707/archive/2020/07/02/13226392.html
-Advertisement-
Play Games

x 深夜,在東莞,7天酒店,打開電腦,訪問國內最大的同性交友網站。 日常開發中,導出導入場景非常多,尤其是對於後臺管理更是一個列表一個導出,如果從導出的業務中抽離出復用代碼,專註於邏輯開發,對於開發者而言非常重要。前有使用POI,但作者還是更喜EasyExcel的簡潔高效不拖沓,所以特意寫篇文章記錄 ...


     
x
       
    深夜,在東莞,7天酒店,打開電腦,訪問國內最大的同性交友網站。
   

日常開發中,導出導入場景非常多,尤其是對於後臺管理更是一個列表一個導出,如果從導出的業務中抽離出復用代碼,專註於邏輯開發,對於開發者而言非常重要。前有使用POI,但作者還是更喜EasyExcel的簡潔高效不拖沓,所以特意寫篇文章記錄下。

準備工作

準備工作是看文檔瞭解EasyExcel嗎?不,我們直接上手吧!我發現最近的業務裡面,最簡單的例子已經應付下來了!所以準備工作自然只需導入EasyExcel的jar包,這裡我們由於是springboot項目,所以直接使用maven。直接上最新的版本了!pom.xml給它加上:

     
xxxxxxxxxx
       
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.5</version>
</dependency>
   

導出

準備工作已經完成,導出開始,首先需要一個Bean類,導出的欄位和Excel文件的欄位一樣即可。@Data是用了lombok,@ExcelProperty則包含了Excel首行的名稱和欄位所在位置,從0開始,不能重覆。

      x        
@Data
public class ExportVo {
  
  @ExcelProperty(value = "名稱", index = 0)
  private String name;
  @ExcelProperty(value = "時間", index = 1)
  private Date time;
  
  @NumberFormat("#.##%")
  @ExcelProperty(value = "完成率", index = 2)
  private Float rate;
  
}
   

接下來是邏輯實現:

     
xxxxxxxxxx
       
  @PostMapping("/export")
  public void export(@RequestBody ExportDto dto, HttpServletResponse response)
          throws IOException {
    String fileName = "統計表";
    ExcelUtil.download(response, fileName, ExportVo.class,
            getExportVoList());
  }
  private List getExportVoList() {
    //  這裡主要是獲取List<ExportVo>內容,不提供實現了,需要說下註意點。
      1、導出列表應該有時間之類的限制(例如最近一個月),避免導出Excel過大,過大Excel一般採用分sheet導出(尤其xls文件,有65535條數限制)、分文件打包導出,上傳文件伺服器非同步導出,不可突破的最大導出(限死5w條)。
      2、一來考慮資料庫查詢和記憶體壓力,二來分頁插件可能存在最大頁數限制,所以較多條數時必須做分頁查詢,再組合List對象。
      3、一般從資料庫直接查出數據不滿足導出欄位需要,有必要時需要做欄位轉換。
  }
   

導出的處理類:

     
xxxxxxxxxx
       
public class ExcelUtil {
  public static void download(HttpServletResponse response, String fileName,
                              Class cls, List dataList)
          throws IOException {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    String fname = URLEncoder.encode(fileName, "utf-8");
    response.setHeader("Content-disposition",
            "attachment;filename=" + fname + ExcelTypeEnum.XLSX.getValue());
    LongestMatchColumnWidthStyleStrategy longestMatchColumnWidthStyleStrategy =
            new LongestMatchColumnWidthStyleStrategy();
    EasyExcel.write(response.getOutputStream(), cls)
            .sheet("sheet1")
            .registerWriteHandler(longestMatchColumnWidthStyleStrategy)
            .doWrite(dataList);
    response.flushBuffer();
  }
   

啟動程式,使用postman試下,直接點Send的話會返回一堆亂碼,選擇Send and Download則可導出Excel,不過文件名是URL編碼過的,這個文件名編碼問題在瀏覽器則不會存在。

image-20200702002721411

導入

導入是為了減少人工錄入大量數據的煩惱,挺好的。

     
xxxxxxxxxx
       
  @Autowired
  private ImportService importService;
  @PostMapping("/import")
  public void import(
          @RequestParam(value = "file") MultipartFile file,
          @Min(1) @RequestParam("type") int type
  ) throws IOException {
    ImportQueryDto dto = new ImportQueryDto();
    dto.setType(type);
    // ImportDto是導入對應類,UploadDataListener是處理類,邏輯處理服務需要以參數形式傳入
    EasyExcel.read(file.getInputStream(), ImportDto.class,
            new UploadDataListener(importService)).sheet().doRead();
  }
   

導入Excel對應類,ExcelProperty對應導入欄位的首部。

     
xxxxxxxxxx
       
@Data
public class ImportDto {
  @ExcelProperty("名稱")
  private String name;
  @ExcelProperty("數量")
  private Integer num;
}
   

導入處理:

     
xxxxxxxxxx
       
public class UploadDataListener
        extends AnalysisEventListener<ImportDto> {
  //  一次導入多少便入庫,避免大量入庫
  private static final int BATCH_COUNT = 50;
  //  存放導入列表
  List<ImportDto> list = new ArrayList<>();
  private ImportService importService;
  public UploadDataListener(ImportService importService) {
    this.importService = importService;
  }
  @Override
  public void invoke(ImportDto importDto, AnalysisContext analysisContext) {
    list.add(importDto);
    if (list.size() >= BATCH_COUNT) {
      saveData();
      list.clear();
    }
  }
  @Override
  public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    saveData();
  }
  private void saveData() {
    List<ImportModel> importModelList = new ArrayList<>();
    for (ImportDto dto : list) {
      ImportModel model = new ImportModel();
      model.setName(dto.getName());
      model.setNum(dto.getNum())
      importModelList.add(model);
    }
    importService.saveBatch(importModelList);
  }
}
   

實際上,導入文件的內容是需要校驗的,數據格式校驗等,需要詢問產品是否忽略錯誤的數據,只導入正常的數據,然後怎麼友好提示錯誤的內容,通過返回一個包含錯誤信息Excel或提示框,更進一步的提示,則是提示到哪一個格子有問題。

睡覺。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下麵試題來自騰訊、阿裡、網易、餓了麽、美團、拼多多、百度等等大廠綜合起來常考的題目。 如何寫一個漂亮的簡歷 簡歷不是一份記流水賬的東西,而是讓用人方瞭解你的亮點的。平時有在做一些修改簡歷的收費服務,也算看過蠻多簡歷了。很多簡歷都有如下特征 喜歡說自己的特長、優點,用人方真的不關註你的性格是否陽光等 ...
  • 從webpack打包結構中我們知道,vue中有一個存放外部資源的文件夾static,它裡面的文件是不會被打包編譯的,所以我們就可以利用外部引入js的方式將我們的想要的數據在index.html中以js文件的方式引入,然後就可以全局使用。 具體的方法如下: 1.在項目中找到static文件夾,在裡面創 ...
  • 單例模式 線程安全的Singleton 會破壞Singleton的情況 線程級Singleton 單例模式是幾個創建型模式中最獨立的一個,它的主要目標不是根據客戶程式調用生成一個新的實例,而是控制某個類型的實例數量只有一個。 GOF對單例的描述為: Ensure a class only has o ...
  • 創建型模式 簡單工廠模式 工廠方法模式 IOC與工廠方法模式的結合 泛型工廠 委托工廠 創建型模式 創建型模式可以隔離客戶程式對需要實例化類型的依賴關係,這類模式一般通過將實例化具體對象的職責委托給第三方對象的方式,使得客戶程式或者外部系統在獲得所需的具體類型實例的同時,而不必對其發生直接的引用。 ...
  • 譯者前言:相信凡是用過 zip() 內置函數的人,都會贊同它很有用,但是,它的最大問題是可能會產生出非預期的結果。PEP-618 提出給它增加一個參數,可以有效地解決大家的痛點。 這是 Python 3.10 版本正式採納的第一個 PEP,「Python貓」一直有跟進社區最新動態的習慣,所以翻譯了出 ...
  • 上次講了微服務的前世今生(五):CAP 原則與 BASE 理論,這次我們再說微服務架構的前世今生(六):微服務架構帶來的問題。 一、客戶端如何訪問服務? 傳統的開發方式,所有的服務都是本地的,客戶端可以直接調用,現在按功能拆分成獨立的服務,客戶端如何訪問? 後臺有 N 個服務,前臺就需要管理 N 個 ...
  • 我認為,代碼優化的最重要的作用應該是:避免未知的錯誤。在代碼上線運行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最後往往是一個非常小的原因。 ...
  • 【SpringCloud】Gateway 配置全局過濾器獲取請求參數和響應值 實現Ordered介面getOrder()方法,數值越小越靠前執行,記得這一點就OK了。 獲取請求參數RequestBody @Component @Slf4j @AllArgsConstructor public cla ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...