【造轮子】打造一个简单的万能Excel读写工具
生活随笔
收集整理的這篇文章主要介紹了
【造轮子】打造一个简单的万能Excel读写工具
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
大家工作或者平時(shí)是不是經(jīng)常遇到要讀寫一些簡(jiǎn)單格式的Excel?
shit!~很蛋疼,因?yàn)橹按蹬?#xff0c;就搞了個(gè)這東西,還算是挺實(shí)用,和大家分享下。
厭煩了每次搞簡(jiǎn)單類型的Excel讀寫?不怕~來,喜歡流式操作?來~,喜歡用lambda(雖然java的比較蛋疼~),來~看這個(gè)~
哈哈,如果你用的不是java8~~沒問題,那就默默地用老方式匿名類來實(shí)現(xiàn)這些功能吧,但是這并不妨礙您的使用哈哈~~~
更新多次~希望大家也能夠集思廣益~
github地址:https://github.com/MatrixSeven/ExcelReads
歡迎大家fork,歡迎大家Star,更歡迎大家多提意見or建議,提供更好的想法~~
ExcelReads(簡(jiǎn)單Excel通用讀寫器)
ExcelReads是什么?
- 這是一個(gè)通用的簡(jiǎn)單的Excel讀取器
- 支持自定義JavaBean實(shí)體讀取和HashMap自動(dòng)讀取
- 支持自定義擴(kuò)展
- 支持自定義Sheet范圍,數(shù)據(jù)開始行數(shù)
- 支持?jǐn)?shù)據(jù)庫查詢直接導(dǎo)出Excel(Map/Object)
- 支持正則過濾數(shù)據(jù)格式
- JavaBean實(shí)體支持使用注解添加正則規(guī)則校驗(yàn),HashMap支持?jǐn)?shù)組規(guī)則校驗(yàn)
- 依賴POI,使用Maven構(gòu)建
更新紀(jì)錄
更新2017/01/05
- 修復(fù)據(jù)庫查詢的導(dǎo)出(Object)遞歸越棧問題
- 增加新的xxx.Class定義類型導(dǎo)出,操作更簡(jiǎn)單
- 導(dǎo)出注解支持(自己使用seven.savewapper.anno.ExcelAnno類型注解)
更新2017/01/04
- 修復(fù)據(jù)庫查詢的導(dǎo)出(Map)空指針&下標(biāo)越界問題
- 修復(fù)在Filter數(shù)據(jù)后出現(xiàn)空行問題
- 丟入Result參數(shù)后的操作就如同操作Map/Object一樣
更新2017/01/01
- 增加ResExprotDBMap&ResExprotDBObj用于支持?jǐn)?shù)據(jù)庫導(dǎo)出
- 支持基于數(shù)據(jù)庫查詢的導(dǎo)出(Map),直接放入Result對(duì)象即可
- 支持基于數(shù)據(jù)庫查詢的導(dǎo)出(Object),直接放入Result對(duì)象即可
更新2016/11/30
- 增加了簡(jiǎn)單類型得寫入,生成xls/xlsx
- 直接JavaBean類型寫入,注解命名
- 支持Map key-value類型寫入
- 寫入時(shí)支持和讀取一樣得過濾加工排序等寫法
更新2016/11/29
- 增加CreateMap By Key
- 去除無用泛型
- 增加xlsx支持
更新2016/11/8
- 支持?jǐn)?shù)據(jù)過濾和處理是轉(zhuǎn)換,基于事件模式
- 更新為Build模式創(chuàng)建實(shí)例
- 增加數(shù)據(jù)過濾、數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)排序回調(diào)接口
- 采用鏈?zhǔn)絪et方式進(jìn)行
其他
- 自定義讀取支持出簡(jiǎn)單的規(guī)范化數(shù)據(jù)格式,即典型的表頭格式
- 可以繼承 WapperMap 和 WapperObj進(jìn)行擴(kuò)展
- 直接使用ExcelFactory.getBeans進(jìn)行獲取,WapperObj則自己添加泛型
- 注解Value對(duì)應(yīng)列標(biāo)題,Required對(duì)應(yīng)正則,可自己寫正則表達(dá)式或者直接使用RegHelper
- 實(shí)體bean數(shù)據(jù)要比hashMap慢,7w條數(shù)據(jù)慢800ms,加入正則減慢速度(測(cè)試中加入了正則)
使用方法說明
| foo | foo | foo |
| bar | bar | bar |
| baz | baz | baz |
數(shù)據(jù)庫導(dǎo)出自定義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();?
數(shù)據(jù)庫導(dǎo)出自定義Bean類型寫法(自己實(shí)現(xiàn)包裝)
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();?
數(shù)據(jù)庫直接導(dǎo)出到Excel例子
ExcelFactory.saveExcel(UNPOOLED_DATA_SOURCE.getConnection().prepareStatement("select * FROM users_info limit 10000").executeQuery(), "知乎導(dǎo)出Excel.xlsx")//過濾字段.FilterCol(() -> new String[]{"updatetime"})//過濾數(shù)據(jù)條件.Filter((HashMap<String, String> o) ->o.get("address").equals("\u5317\u4eac")).Save();?
自定義類型導(dǎo)出到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"))///這里能夠處理每一行數(shù)據(jù).Process((A a) -> a.setA("xxxxxxx"))//過濾列.FilterCol(() -> new String[]{"B"})//根據(jù)某個(gè)字段來處理數(shù)據(jù)時(shí)候丟棄.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("\\測(cè)試.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 }).//這里能夠處理每一行數(shù)據(jù) 9 Process((HashMap<String, String> o) -> System.out.println(o + "\n") 10 //這里能夠處理時(shí)候過濾某一列 11 ).FilterCol(() -> new String[]{} 12 //這里能根據(jù)某一行的某一列的內(nèi)容來取舍這行數(shù)據(jù) 13 ).Filter((HashMap<String, String> o) -> o.get("創(chuàng)建人") != null && o.get("創(chuàng)建人").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>類型數(shù)據(jù)?
讀取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("創(chuàng)建人") != 11 null &&o.get("創(chuàng)建人").length() > 4).<Map>CreateMap("創(chuàng)建人"));?
?
- 郵件(hacker.kill07@gmail.com)
- QQ: 985390927
- weibo:?@Alden_情緒控
- Blog:?http://sweets.cf
轉(zhuǎn)載于:https://www.cnblogs.com/seven007/p/6252403.html
總結(jié)
以上是生活随笔為你收集整理的【造轮子】打造一个简单的万能Excel读写工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python venv下安装mysql出
- 下一篇: [算法]——归并排序(Merge Sor