【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel?
shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下。
厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式操作?来~,喜欢用lambda(虽然java的比较蛋疼~),来~看这个~
哈哈,如果你用的不是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,加入正则减慢速度(测试中加入了正则)
使用方法说明
- 本程序只能读取简单格式的xls文件,文件布局如下(标准的行列结构):
| 标题1 | 标题2 | 标题3 |
|---|---|---|
| foo | foo | foo |
| bar | bar | bar |
| baz | baz | baz |
数据库导出自定义Bean类型写法(xxx.Class类型)
ExcelFactory.saveExcel(
UNPOOLED_DATA_SOURCE.getConnection().
prepareStatement("select * FROM users_info limit 1000").executeQuery(),
"\u5317\u4eac__Excel.xlsx",
AS.class)
.FilterCol(() -> new String[]{"updatetime"})
.Filter((AS o) ->o.getA().length() > 3)
.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例子
List<Map<String,String>> data=ExcelFactory.getBeans(System.getProperty("user.dir").concat("\\测试.xls"),
new ResWrapperMap() {
@Override//配置Excel属性
protected void LoadConfig(Config config) {
config.setContent_row_start(3);
config.setTitle_row(2);
}
}).//这里能够处理每一行数据
Process((HashMap<String, String> o) -> System.out.println(o + "\n")
//这里能够处理时候过滤某一列
).FilterCol(() -> new String[]{}
//这里能根据某一行的某一列的内容来取舍这行数据
).Filter((HashMap<String, String> o) -> o.get("创建人") != null && o.get("创建人").length() > 5
//排序
).Sort((o1, o2) -> o1.hashCode()>o2.hashCode()?1:hashCode()==o2.hashCode()?0:-1).Create();
//使用 .CreateMap(key_v) 生成Map<Key,Map>类型数据
读取Excel到自定义类型的例子
Map<String,Seven> map=new ResWrapperObj(Seven) {
@Override
protected void LoadConfig(Config config) {
config.setContent_row_start(3);
config.setTitle_row(2);
}
}).
Process((HashMap<String, String> o) -> {}
).FilterCol(() -> new String[]{}
).Filter((HashMap<String, String> o) -> o.get("创建人") !=
null &&o.get("创建人").length() > 4).<Map>CreateMap("创建人"));
- 邮件(hacker.kill07@gmail.com)
- QQ: 985390927
- weibo: @Alden_情绪控
- Blog: http://sweets.cf
【造轮子】打造一个简单的万能Excel读写工具的更多相关文章
- 动手造轮子:实现简单的 EventQueue
动手造轮子:实现简单的 EventQueue Intro 最近项目里有遇到一些并发的问题,想实现一个队列来将并发的请求一个一个串行处理,可以理解为使用消息队列处理并发问题,之前实现过一个简单的 Eve ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(二)
一步步打造一个简单的 MVC 电商网站 - BooksStore(二) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 前: ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(三)
一步步打造一个简单的 MVC 电商网站 - BooksStore(三) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)
一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)
一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)
http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...
- Css打造一个简单的静态七巧板
偶然在微博上看到用css写一个七巧板,正好也有一些源代码,于是就试着敲了敲. 主要是利用了css3的transform,实现平移,旋转,变形,直接用看到的代码敲出来之后有些问题,因为宽度上下面绿色的三 ...
- Flutter随笔(二)——使用Flutter Web + Docker + Nginx打造一个简单的Web项目
前言 Flutter作为一个跨平台UI框架,功能十分强大,仅用一套代码便能编译出Android.iOS.Web.windows.macOS.Windows.Linux等平台上的应用,各平台应用体验高度 ...
随机推荐
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- C#高性能TCP服务的多种实现方式
哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...
- Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...
- 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
- Node.js入门(一)
一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...
- Angular2 Hello World 之 2.0.0-beta.14
公司现在采用angualrjs开发一些web应用,采用的是angular1,现在angular2已经差不多了,听说最近rc6已经出来了……其实感觉好慢啊!之前也做过一些anglar2的例子,但是没有记 ...
- iOS -- CocoaPods
CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 GitHub( https://github.com/CocoaP ...
- 好用的Markdown编辑器一览 readme.md 编辑查看
https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...
- Linux:将rhel yum 切换到centos yum
Red Hat Enterprise Linux Server(RHEL) yum安装软件时This system is not registered with RHN. RHN support wi ...