EasyExcel使用記錄,與讀取xlsx中數據寫入到數據庫失敗問題的斷點調試心得


EasyExcel使用心得,與讀取xlsx中數據寫入到數據庫失敗問題記錄(斷點調試)

首先記錄一下對Excel工具的使用心得

業務需要使用讀excel文件來進行數據庫寫入操作,這里使用了EasyExcel工具進行操作

EasyExcel工具可以用java對excel文件進行讀寫。

導入相關依賴,然后創建和Excel文件對應的實體類,使用注解標記對應列關系。

在Controller中建立上傳文件接口,接口參數使用MultipartFile,這樣便可以使用Swagger進行測試文件上傳。然后在Controller中調用service中定制的業務方法。

  	InputStream inputStream = file.getInputStream();

        // 第一個參數是從controller過來的文件流,第二個參數是與excel對應的實體類,第三個參數為創建的監聽器
	EasyExcel.read(inputStream, ExcelEntity.class, new SubjectExcelListener(subjectService)).sheet().doRead();

讀操作需要創建監聽器,監聽器類繼承AnalysisEventListener 類,並實現此抽象類的方法.

EasyExcel會對Excel文件進行一行一行的讀取,每次讀取的數據都放到對應的實體類中。我們可以在進行讀操作時候的監聽器中對讀數據需求進行進一步定制。

其中invoke方法會一行一行讀取excel數據並將其放進excel對應實體類中,可以使用get方法對其進行獲取,然后使用mp語句將其添加到與數據庫表中對應的實體類字段中。

doAfterAllAnalysed方法會在讀取完畢之后運行。暫時沒有用到。

上傳excel文件出現錯誤

使用Swagger測試上傳文件,發現出現id字段類型不匹配的報錯。

我當時的解決問題思路是:

​ 1.查看excel使用流程,看看是否某個固定流程出現了錯誤。查看之后沒有發現錯誤。

​ 2.打斷點調試檢查,發現方法執行到save之前一直沒有問題,而且save之前上一句,顯示id值已經自動生成,其他值均有,沒有null存在。於是進一步收束問題空間,開始懷疑是否為mp設置出現了問題,導致id類型不匹配。

  1. 我傻了,發現實體類中
  @ApiModelProperty(value = "課程類別ID")
    @TableId(value = "id", type = IdType.ID_WORKER)
    private String id;

此處TableId注解的type值應該為ID_WORKER_STR,按理來講代碼生成器所生成的代碼應該直接與表屬於逆向工程關系 ,沒有問題,但是我當時好像糾結了一下id的int和string的問題,改回string后type = IdType.ID_WORKER沒有改為對應的ID_WORKER_STR。導致了插入id時候值與類型不匹配的問題。

總結心得

遇見bug的主要思路是收束問題空間。並且要根據報錯信息指向問題大概模塊。

此次我耗費較長時間來排查這個小問題,主要的原因在於沒有沒有特別重視報錯的指示范圍,反而自己先思考是不是使用插件的流程出現了問題。這是不應該的。

應該首先根據報錯信息收束問題范圍,然后聯想什么樣的模塊與此次報錯有關。

實在不行可以寫幾個測試用例進行針對性的排查,或者打斷點調試,觀察數據的流向,看看是不是哪塊的數據流沒有照顧好。

希望能記住此次經驗,以后debug速度能快一些。


免責聲明!

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



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