由需求而产生的一款db导出excel的工具
程序员最大的毛病可能就是懒,因为懒所以做出了许许多多提高自己工作效率的工具.
起因于我是商业开发,既然是商业项目避免不了各种数据统计,虽然公司有专门的数据平台,但是应对一些临时性需求还是免不了开发人员去导出一些数据.每一次有需求来我都是写一个复杂的sql,然后放到DataGrip中执行,利用其功能导出cvs,然而越来越多的需求该功能无法满足,比如导出组合表,也就是一个excel中有多个sheet表.那么应该这个需求我写了一个为自己的工具.
我理想中的工具
1.简单模式使用sql查询直接导出
2.复杂模式可以定义一些复杂的bean,然后通过组合代码中自定义实现导出逻辑
3.可以自己定义表头,以及对应的数据处理,比如把时间戳转换为yyy-MM-dd hh:MM:ss这样的形式
4.支持一个excel中含有多个sheet
5.不需要很复杂的配置,因为自用,所以能约定俗成的地方就约定俗成.
语言的选择
这个很随意了,我是选择自己最熟悉的语言,也就是Java.
同事听说我用Java写这种工具,强烈推荐我用py,但天生动态语言无感,可以说是反感,所以放弃.
实现
环境: JDK8 Maven
IDE: IntelliJ IDEA / Eclipse
具体过程很简单,代码逻辑也很清晰,这里只说下主要流程,详细的可以参考源码Github地址,另外由于个人使用,所以没有太多的校验和异常考虑.
数据的获取
数据的获取其实就是DBUtils的使用方法,很简单执行Sql,然后使用对应的Handler转换成对应形式参数
//查询出结果,使用Map存储,当然dbUtils也支持bean存储
final List<Map<String, Object>> result = queryRunner.query(conn, "select * from user", new MapListHandler());
ResultSetHandler接口提供了一个单独的方法:Object handle(java.sql.ResultSet.rs)。
ResultSetHandler接口的实现类
1. ArrayHandler:把结果集中的第一行数据转换成对象数组。
2. ArrayListHandler:把结果集中的每一行数据都转换成一个对象数组,再存放到List中。
3. BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
4. BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
5. MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
6. MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
7. ColumnListHandler:将结果集中某一列的数据存放到List中。
8. KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
9. ......
表头的定义
表头是有序的,所以使用LinkedHashMap<String, ExcelHeader> header这种数据结构,其中ExcelHeader是我封装的一个类,如下,可以看到其功能是存储对应的表头展示名称,以及转换器
@Data
public class ExcelHeader {
/**
* 展示名称
*/
private String displayHeader;
/**
* 对应数据转换器
*/
private Function convert;
private ExcelHeader(String displayHeader,Function convert){
this.displayHeader = displayHeader;
this.convert = convert;
}
public static ExcelHeader create(String displayHeader){
return new ExcelHeader(displayHeader, Function.identity());
}
public static ExcelHeader create(String displayHeader,Function convert){
return new ExcelHeader(displayHeader, convert);
}
}
那么其使用就很简单了
//表格对应的表头,以及该表头的数据处理
LinkedHashMap<String, ExcelHeader> header = new LinkedHashMap<>();
header.put("id", ExcelHeader.create("用户id"));
header.put("username", ExcelHeader.create("用户名"));
header.put("email", ExcelHeader.create("用户邮箱"));
header.put("avatar", ExcelHeader.create("用户头像"));
//对于日期使用转换器,转换器为java8的Function函数实现
header.put("last_login_date", ExcelHeader.create("用户上次登录时间", FuncitionConvertUtil.date2String));
header.put("status", ExcelHeader.create("用户id"));
header.put("role", ExcelHeader.create("用户id"));
//对于日期使用转换器,转换器为java8的Function函数实现
header.put("gmt_create", ExcelHeader.create("用户id",FuncitionConvertUtil.date2String));
导出表
数据以及表头都有了,那么只剩下的导出操作也就是数据的组合.
//导出表
/**
* 查出来的map直接导出表格
*/
ExcelExportUtil.fromMap(result)
.displayHeader(header)
.excelType(ExcelExportUtil.ExcelFileType.XLS)
.build("用户表")
.writeTo("/tmp/test1.xls");
/**
* 导出多张表
*/
ExcelExportUtil.fromMap(result)
.displayHeader(header)
.excelType(ExcelExportUtil.ExcelFileType.XLSX)
.build("用户表1")
.andFormMap(result)
.displayHeader(header)
.build("用户表2")
.writeTo("/tmp/test2.xlsx");
核心的导出逻辑为build()方法
@SuppressWarnings("unchecked")
public ExcelExportUtil build(String sheetName) {
buildReady();
//创建表,如果已存在excelBook,那么新增表
Sheet sheet = sheetName == null ? workbook.createSheet() : workbook.createSheet(sheetName);
//写表头
int rowNum = 0;
Row headerRow = sheet.createRow(rowNum++);
int[] tempCol = {0};
this.headerAndConvert.forEach((k,v) -> headerRow.createCell(tempCol[0]++).setCellValue(v.getDisplayHeader()));
//写表数据
for (Map<String, Object> colData : this.mapData) {
Row row = sheet.createRow(rowNum++);
tempCol[0] = 0;
this.headerAndConvert.forEach((k,v) -> {
Cell cell = row.createCell(tempCol[0]++);
Object value = v.getConvert().apply(colData.get(k));
convertObjValue(cell, value);
});
}
return this;
}
导出表格展示
test1.xls
![]()
test2.xlsx
![]()
下载Demo如何运行?
环境具备后,那么只需要对应的代码导出IDE,然后查看QueryAndExportByH2这个单元测试类,执行里面的testQueryAndExport()方法即可,注意导出表的时候需要指定路径名
![]()
项目结构截图

总结
本文的主要目的是表达迷茫的时候不知道自己该做什么,那么就从自己身边的需求开始,分析自己所遇到的痛点,然后用你喜欢的方式去解决这个痛点,那么这个过程就是你的进步.
最后给出github地址,如果你有能力则直接看源代码即可,如果你从此网站下载了Demo,那么有问题可以随时与我交流,邮件为 niudear@foxmail.com
由需求而产生的一款db导出excel的工具
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
由需求而产生的一款db导出excel的工具的更多相关文章
- 个人推荐的两款vue导出EXCEL插件
个人认为前端VUE项目中导出EXCEL比较好的两种方法,均不是我个人原创,我只是收录简单说明,原创地址在下面. 下面推荐两种方法,个人推荐第一种,第二种不做详细讲解,因为作者已经写过博客了,你们可以点 ...
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
一.http_load程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把 ...
- 简化工作流程,10款必备的HTML5开发工具
利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...
- 15款最佳的MySQL管理工具和应用程序
工欲善其事,必先利其器.几乎每个开发人员都有最钟爱的 MySQL 管理工具,它帮助开发人员在许多方面支持包括 PostgreSQL,MySQL,SQLite,Redis,MongoDB 等在内的多种数 ...
- 简化工作流程 10款必备的HTML5开发工具
利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...
- 七款做好DevOps的强大工具
原文链接: 7 cool tools for doing devops right 传统把开发和运营割裂开的做法,实则不适合现代产品和服务开发的需求,如今把开发和运营作为整体来看待的DevOps工程思 ...
- Python导出Excel为Lua/Json/Xml实例教程(三):终极需求
相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...
- pylot是一款开源的web性能测试工具
pylot是一款开源的web性能测试工具,http://www.pylot.org/ 参考文档:http://www.pylot.org/gettingstarted.html很容易上手 使用分为以下 ...
- 给你推荐10款优秀的 HTML5 动画工具
HTML5 在过去三年快速增长,已经成为 Web 开发人员最喜欢的编程语言之一.强大的编程语言拥有开发更好的网页应用的能力. HTML5 中引入的新技术都非常好,像 Chrome.Firefox.Sa ...
随机推荐
- laravel中建立公共视图的方法
1.用法概要 @include('common.header') 包含子视图 @extends('article.common.base') 继承基础模板 @yield('content') 视图占位 ...
- ubuntu 开启PHP CURL支持
sudo apt-get install php5-curl sudo service apache2 restart
- 通过GitHub部署项目到Nginx服务器
1.更新源: 2.安装nginx 3.安装成功 4.DNS域名解析 5.访问域名就会找到相应IP地址的主机,一个IP可对应多个域名 6.提交到gitHub 复制这两行 填上邮箱和密码 7.提交成功 8 ...
- SQL Server 预编译执行SQLs
问题描述: MVC5项目,利用执行sql的方式获取数据,但是在利用预编译执行的时候报错了,字段XXXwhich was not supplied. 其实就是这个参数传了个null导致的.在传参数之前做 ...
- 想转行做web前端工程师,必学这6大技能
web前端工程师是近几年才发展出来的新兴职业,也是目前火爆且高薪的职业.大需求的市场环境下,出现了越来越多的人群转行做web前端工程师,如设计师.后台程序员.网虫.大学其他专业.策划.编辑等等. 要学 ...
- 牛客小白月赛3 B 躲藏【动态规划/字符串出现cwbc子序列多少次】
链接:https://www.nowcoder.com/acm/contest/87/B来源:牛客网 XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏 Cwbc藏在多个不区分大小写的字符串中. 好奇的X ...
- 树的直径【bzoj3363】 [Usaco2004 Feb]Cow Marathon 奶牛马拉松
Description 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉松路线要尽量长,所以,告诉你农场的地图(该地图的描述与上题一致),请帮助约翰寻找两个最远农场间的 ...
- 九. 常用类库、向量与哈希2.Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...
- steelray project viewer
steelray project viewer是一款英文语言软件,透过Steelray Project Viewer,可以打开.导航.浏览.打印Microsoft Project的.mpp文件.
- C语言基础之指针
1.指针的定义 格式:变量类型 *变量名; 1: // 定义了一个指针变量p 2: // 指针变量只能存储地址 3: // 指针就一个作用:能够根据一个地址值,访问对应的存储空间 4: // 指针变量 ...