代码地址如下:
http://www.demodashi.com/demo/12062.html

程序员最大的毛病可能就是懒,因为懒所以做出了许许多多提高自己工作效率的工具.
起因于我是商业开发,既然是商业项目避免不了各种数据统计,虽然公司有专门的数据平台,但是应对一些临时性需求还是免不了开发人员去导出一些数据.每一次有需求来我都是写一个复杂的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的工具

代码地址如下:
http://www.demodashi.com/demo/12062.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

由需求而产生的一款db导出excel的工具相关推荐

  1. 推荐7款实用强大的神器工具,建议你先收藏,总有一天你会用到!

    分享7个非常强大的神器工具,每一款都是精品,喜欢的话记得点赞支持哦~ 1.后羿采集器 后羿采集器是前谷歌技术团队倾力打造,基于人工智能技术,只需要输入网址就能自动识别采集内容.支持Win/Mac/Li ...

  2. Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍

    一.http_load程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会 ...

  3. 简化工作流程,10款必备的HTML5开发工具

    利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具为你节省更多开发时间. 利用HTML5工具不仅可以帮助设计师和开发者 ...

  4. 15款提高工作效率的工具分享

    想要工作更高效,不仅仅是改变工作方式,在一定程度上还依赖于工作环境和工具软件,选择合适的辅助工具,可以让你的工作轻松高效.今天这篇文章与大家分享15款提高工作效率的工具. RescueTime Res ...

  5. python自动化工具哪个好用_10款好用的自动化测试工具推荐

    当我们功能测试干的时间比较久了,或者想要学习更多的技术,提升自己的时候,基本上第一时间就会想到的是自动化测试.而在自动化测试领域,自动化工具的核心地位毋庸置疑,下面为大家推荐10款常见常用的自动化测试 ...

  6. vb net 模拟 ctrl+c_8款优秀的.NET开发工具,收藏了

    NET是一个重要的应用程序开发平台,因为它安全.稳定.易于学习和实现.今天小编给就给大家介绍8款优秀的.NET开发工具,有需要的小伙伴可以收藏转发哦. 1.Chocolaty Chocolaty是一个 ...

  7. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  8. 7款优秀的开源数据挖掘工具

    7款优秀的开源数据挖掘工具   IDMer说道:本文只对几种流行的开源数据挖掘平台进行了检视,比如Weka和R等.如果您想找寻更多的开源数据挖掘软件,可以到KDnuggets和Open Directo ...

  9. 推荐30款最佳的数据可视化工具

    各个互联网公司通过大量的用户数据.信息进行统计分析,而这些大量繁杂的数据在经过可视化工具处理后,就能以图形化的形式展现在用户面前,清晰直观.随着各种数据的增加,这种可视化工具越来越得到开发者们的欢迎. ...

最新文章

  1. CSS属性:font-family
  2. 百度搜索打不开第二页_北易信息:百度爱采购适合做优化推广吗
  3. Spring JPA
  4. 要写related_name的两种情况
  5. 10进制小数转化为任意进制小数
  6. 【物联网中间件平台-03】YFIOs安装指南
  7. POI导出echarts统计报表到Excel
  8. 本地搭建mysql数据库
  9. 拼多多token是什么?如何提取及写入?
  10. java实现奖学金申请,基于ssm+mysql的web助学金申请系统[实现过程记录]
  11. python+request 哔哩哔哩视频下载
  12. GCF(4)----手机认证相关知识
  13. OBS录屏软件无法打开的问题,无法捕获到游戏画面的问题
  14. 太极图形课S1第06讲:光线追踪的概念与基础
  15. 快速上手爬虫,有哪些方便实用的工具和服务?
  16. Integer类型比较
  17. 英语不好,能不能学软件编程?不懂英文能学编程吗
  18. android 工作记事本
  19. 关于免费的虚拟主机与虚拟主机的一些事情
  20. JMeter安装教程------详细

热门文章

  1. 按键检测框架单击-双击-连按
  2. 移植RTT使用cubeMx配置后出现 cannot open source input file stm32f1xx_hal_exti.h: No such file or directory
  3. 13001.udp广播接收程序(python)
  4. 本地笔记软件_到底哪个笔记软件适合你
  5. 利用PCF8591进行AD转换
  6. nginx基础概念(100%)之connection
  7. 怎样设计访谈提纲_服务设计简史
  8. 【LeetCode】【HOT】226. 翻转二叉树(递归)
  9. 动态数据源切换--AbstractRoutingDataSource
  10. C++编程基础二 13-函数与string对象