【造輪子】打造一個簡單的萬能Excel讀寫工具

你們工做或者平時是否是常常遇到要讀寫一些簡單格式的Excel?java

shit!~很蛋疼,由於以前吹牛,就搞了個這東西,還算是挺實用,和你們分享下。git

厭煩了每次搞簡單類型的Excel讀寫?不怕~來,喜歡流式操做?來~,喜歡用lambda(雖然java的比較蛋疼~),來~看這個~github

哈哈,若是你用的不是java8~~沒問題,那就默默地用老方式匿名類來實現這些功能吧,可是這並不妨礙您的使用哈哈~~~正則表達式

更新屢次~但願你們也可以集思廣益~數據庫

github地址:https://github.com/MatrixSeven/ExcelReads

歡迎你們fork,歡迎你們Star,更歡迎你們多提意見or建議,提供更好的想法~~數組

ExcelReads(簡單Excel通用讀寫器)

ExcelReads是什麼?

  • 這是一個通用的簡單的Excel讀取器
  • 支持自定義JavaBean實體讀取和HashMap自動讀取
  • 支持自定義擴展
  • 支持自定義Sheet範圍,數據開始行數
  • 支持數據庫查詢直接導出Excel(Map/Object)
  • 支持正則過濾數據格式
  • JavaBean實體支持使用註解添加正則規則校驗,HashMap支持數組規則校驗
  • 依賴POI,使用Maven構建

更新紀錄

更新2017/01/05

  • 修復據庫查詢的導出(Object)遞歸越棧問題
  • 增長新的xxx.Class定義類型導出,操做更簡單
  • 導出註解支持(本身使用seven.savewapper.anno.ExcelAnno類型註解)

更新2017/01/04

  • 修復據庫查詢的導出(Map)空指針&下標越界問題
  • 修復在Filter數據後出現空行問題
  • 丟入Result參數後的操做就如同操做Map/Object同樣

更新2017/01/01

  • 增長ResExprotDBMap&ResExprotDBObj用於支持數據庫導出
  • 支持基於數據庫查詢的導出(Map),直接放入Result對象便可
  • 支持基於數據庫查詢的導出(Object),直接放入Result對象便可

更新2016/11/30

  • 增長了簡單類型得寫入,生成xls/xlsx
  • 直接JavaBean類型寫入,註解命名
  • 支持Map key-value類型寫入
  • 寫入時支持和讀取同樣得過濾加工排序等寫法

更新2016/11/29

  • 增長CreateMap By Key
  • 去除無用泛型
  • 增長xlsx支持

更新2016/11/8

  • 支持數據過濾和處理是轉換,基於事件模式
  • 更新爲Build模式建立實例
  • 增長數據過濾、數據轉換和數據排序回調接口
  • 採用鏈式set方式進行

其餘

  • 自定義讀取支持出簡單的規範化數據格式,即典型的表頭格式
  • 能夠繼承 WapperMap 和 WapperObj進行擴展
  • 直接使用ExcelFactory.getBeans進行獲取,WapperObj則本身添加泛型
  • 註解Value對應列標題,Required對應正則,可本身寫正則表達式或者直接使用RegHelper
  • 實體bean數據要比hashMap慢,7w條數據慢800ms,加入正則減慢速度(測試中加入了正則)

使用方法說明

  1. 本程序只能讀取簡單格式的xls文件,文件佈局以下(標準的行列結構):
標題1 標題2 標題3
foo foo foo
bar bar bar
baz baz baz

數據庫導出自定義Bean類型寫法(xxx.Class類型)

1 ExcelFactory.saveExcel(
2         UNPOOLED_DATA_SOURCE.getConnection().
3                 prepareStatement("select * FROM  users_info limit 1000").executeQuery(),
4         "\u5317\u4eac__Excel.xlsx",
5          AS.class)
6     .FilterCol(() -> new String[]{"updatetime"})
7     .Filter((AS o) ->o.getA().length() > 3)
8     .Save();

 

數據庫導出自定義Bean類型寫法(本身實現包裝)

ExcelFactory.saveExcel(
        UNPOOLED_DATA_SOURCE.getConnection().
                prepareStatement("select * FROM  users_info limit 1000").executeQuery(),
        "\u5317\u4eac__Excel.xlsx",
            res -> {
                AS a = new AS();
                a.setA(res.getString("name"));
                return a;
            })
    .FilterCol(() -> new String[]{"updatetime"})
    .Filter((AS o) ->o.getA().length() > 3)
    .Save();

 

數據庫直接導出到Excel例子

ExcelFactory.saveExcel(
        UNPOOLED_DATA_SOURCE.getConnection().
                prepareStatement("select * FROM  users_info limit 10000").
                executeQuery(), "知乎導出Excel.xlsx")
        //過濾字段
   .FilterCol(() -> new String[]{"updatetime"})
        //過濾數據條件
   .Filter((HashMap<String, String> o) ->
            o.get("address").equals("\u5317\u4eac"))
   .Save();

 

自定義類型導出到Excel例子

List<A> aa = new ArrayList<>();
aa.add(new A("a", "b"));
aa.add(new A("aa", "bb"));
ExcelFactory.saveExcel(aa,
    System.getProperty("user.dir").concat("\\Save.xlsx"))
        ///這裏可以處理每一行數據
        .Process((A a) -> a.setA("xxxxxxx"))
        //過濾列
        .FilterCol(() -> new String[]{"B"})
        //根據某個字段來處理數據時候丟棄
        .Filter((A a) -> a.getA().length() > 1)
        //排序
        .Sort((A o1,A o2 ) -> o1.getAge()>o2.getAge()?1:o1.getAge()==o2.getAge()?0:-1)
        .Save();

 

讀取Excel到Map例子

 1 List<Map<String,String>> data=ExcelFactory.getBeans(System.getProperty("user.dir").concat("\\測試.xls"),
 2                 new ResWrapperMap() {
 3                     @Override//配置Excel屬性
 4                     protected void LoadConfig(Config config) {
 5                         config.setContent_row_start(3);
 6                         config.setTitle_row(2);
 7                     }
 8                 }).//這裏可以處理每一行數據
 9                 Process((HashMap<String, String> o) -> System.out.println(o + "\n")
10                 //這裏可以處理時候過濾某一列
11                 ).FilterCol(() -> new String[]{}
12                 //這裏能根據某一行的某一列的內容來取捨這行數據
13         ).Filter((HashMap<String, String> o) -> o.get("建立人") != null && o.get("建立人").length() > 5
14                 //排序
15         ).Sort((o1, o2) -> o1.hashCode()>o2.hashCode()?1:hashCode()==o2.hashCode()?0:-1).Create();
16 
17 //使用 .CreateMap(key_v) 生成Map<Key,Map>類型數據

 

讀取Excel到自定義類型的例子

 1 Map<String,Seven> map=new ResWrapperObj(Seven) {
 2                     @Override
 3                     protected void LoadConfig(Config config) {
 4                         config.setContent_row_start(3);
 5                         config.setTitle_row(2);
 6                     }
 7                 }).
 8                 Process((HashMap<String, String> o) -> {}
 9                 ).FilterCol(() -> new String[]{}
10         ).Filter((HashMap<String, String> o) -> o.get("建立人") != 
11         null &&o.get("建立人").length() > 4).<Map>CreateMap("建立人"));

 

 

相關文章
相關標籤/搜索