開源工具 — GridExcel支持無實體類讀寫Excel文件

GridExcel是基於Java8函數式編程和POI EventModel實現的用於Excel簡單讀寫的通用解決方案。


GridExcel基於Java8函數式編程使用Lambda表達式來處理Excel的讀寫邏輯。就像這樣:

/**
  * 業務邏輯處理方式三選一:
  * 1.啓用windowListener,並將業務邏輯放在該函數中。
  * 2.不啓用windowListener,使用get()方法取回全部數據集合,做後續處理。
  * 3.readFunction函數,直接放在函數中處理 或 使用final or effective final的局部變量存放這寫數據,做後續處理。
  * 注意:使用EventModel時readFunction函數的輸入爲每行的cell值集合List<String>。
  * @throws Exception
  */
 @Test
 public void readXlsxByEventModel() throws Exception {
     InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("2007.xlsx");
     GridExcel.readByEventModel(resourceAsStream,TradeOrder.class,ExcelType.XLSX)
             .window(2,ts -> System.out.println(JSON.toJSONString(ts)))//推薦在這裏執行自己的業務邏輯
             .process(cs ->{
                 TradeOrder tradeOrder = new TradeOrder();
                 tradeOrder.setTradeOrderId(Long.valueOf(cs.get(0)));
                 Consultant consultant = new  Consultant();
                 consultant.setConsultantName(cs.get(3));
                 tradeOrder.setConsultant(consultant);
                 tradeOrder.setPaymentRatio(cs.get(16));
                 return tradeOrder;
             },1);
 }
 /**
  * 使用Streaming UserModel寫出數據到Excel
  * @throws Exception
  */
 @Test
 public void writeExcelByStreaming() throws Exception {
     GridExcel.writeByStreaming(TradeOrder.class)
             .head(writeFunctionMap())//對象字段到Excel列的映射
             .createSheet()
             .process(MockData.data())//模擬數據。在這裏設置業務數據集合。
             .write(FileUtils.openOutputStream(new File("/excel/test.xlsx")));
 }

具體代碼可參考:

  • https://github.com/liuhuagui/gridexcel/blob/master/src/test/java/ReadTest.java
  • https://github.com/liuhuagui/gridexcel/blob/master/src/test/java/WriteTest.java

將業務邏輯寫在Lambda表達式中,像下面這樣:

(業務對象)-> {
   編寫處理邏輯...
 }
  • 這種形式很像是用匿名對象實現回調函數,但是Java8的Lambda是基於第五條字節碼指令invokeDynamic
    實現的,更加輕量,性能更高。
  • 同時,比起匿名對象沒有複雜的垂直結構,代碼更簡潔,更容易理解。
  • 解析邏輯放在代碼塊裏,允許用戶隨意操作(更加直觀,一眼就能看出處理邏輯,代碼可閱讀性更強),比如:
    • 只導出或導入某些列
    • 複雜對象處理
    • 條件判斷處理
  • 解析邏輯都直接定義在代碼塊裏了,所以使用GridExcel不需要複雜的註解沒有額外的學習成本更沒有代碼侵入
  • 同理,GridExcel不需要對實體類進行註解,無代碼侵入,同時也意味着對Excel的讀寫邏輯完全可以不需要實體類

無實體類讀寫Excel

   /**
     * No Entity無實體類讀Excel文件
     * 業務邏輯處理方式三選一:
     * 1.啓用windowListener,並將業務邏輯放在該函數中。
     * 2.不啓用windowListener,使用get()方法取回全部數據集合,做後續處理。
     * 3.readFunction函數,直接放在函數中處理 或 使用final or effective final的局部變量存放這寫數據,做後續處理。
     * 注意:使用EventModel時readFunction函數的輸入爲每行的cell值集合List<String>。
     * @throws Exception
     */
    @Test
    public void readXlsxByEventModelWithoutEntity() throws Exception {
        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("2007.xlsx");
        GridExcel.readByEventModel(resourceAsStream,Map.class,ExcelType.XLSX)
                .window(2,ts -> System.out.println(JSON.toJSONString(ts)))//推薦在這裏執行自己的業務邏輯
                .process(cs ->{
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("tradeOrderId",cs.get(0));
                    map.put("consultantName",cs.get(3));
                    map.put("paymentRatio",cs.get(16));
                    return map;
                },1);
    }

由於沒有自定義業務實體類,這裏我們可以使用Map.class來代替。上面是讀入Excel的例子,寫Excel可以參照實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章