使用POI将数据库导出为excel表格

准备

使用的是POI,是Apache项目,目前已经很少有人用jxl了,学就学习常用的东西,没有必要去学冷门.
此种方式使用的map封装的数据,操作比较的简单使用的是mybatis+map的方式.
另有一种方式略微复杂,使用jdbc+list,效率高些: https://blog.csdn.net/sqlgao22/article/details/100736325

数据库

        <!--操作xls类型文件--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><!--操作xlsx类型文件--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>

思路

将数据库中的内容全部取出存到实体类的list中,
将表格的一行看作是一个实体类的映射,表头是实体类的属性,因此,重要的是将实体类转换为map集合,才能取出map中的key.
幸运的是,我们不用自己去反射去组合,spring框架中有一个很好的工具类:
org.springframework.cglib.beans.BeanMap,可以方便的使用.
我将方法做了简单的封装,可以使用.

public class MapAndBeanUtil {/*** 将实体类转换为一个Map*/public static <T> Map<String,Object> beanToMap (T bean) {Map<String, Object> map = new HashMap<>();//创建一个BeanMapBeanMap beanMap = BeanMap.create(bean);//将BeanMap转换为MapIterator iterator = beanMap.keySet().iterator();while (iterator.hasNext()) {String key = (String) iterator.next();map.put(key, beanMap.get(key));}return map;}/*** 实体类集合转换为List<Map>*/public static <T> List<Map<String, Object>> beansToMap(List<T> beanList) {List<Map<String, Object>> mapList = new ArrayList<>();Iterator<T> iterator = beanList.iterator();while (iterator.hasNext()) {T bean = iterator.next();Map<String, Object> map = beanToMap(bean);mapList.add(map);}return mapList;}/*** 将map转化为实体类*/public static <T> T mapToBean(Map<String, Object> map,Class<T> clazz) throws IllegalAccessException, InstantiationException {T bean = clazz.newInstance();BeanMap beanMap = BeanMap.create(bean);//将map转换为beanbeanMap.putAll(map);return bean;}/*** 将List<Map>转化为实体类*/public static <T> List<T> mapsToBeans(List<Map<String, Object>> mapList,Class<T> clazz) throws IllegalAccessException, InstantiationException {List<T> list = new ArrayList<>();Iterator<Map<String, Object>> iterator = mapList.iterator();while (iterator.hasNext()) {Map<String, Object> map = iterator.next();T bean = mapToBean(map, clazz);list.add(bean);}return list;}
}

实现

有两种方式实现,:
方式一:创建一个新的文件,只需要指定文件的路径即可,
方式二:直接准备一个excel将数据写入.

先看方式一

public class CreatExcel {public static void writeExcel(List<Map<String,Object>> dataList,String filePath) throws Exception {//创建文件File path = new File(filePath);if (!path.exists()) {path.mkdirs();}String fileName = System.currentTimeMillis() + ".xlsx";File file = new File(path, fileName);//创建一个excel对象Workbook workbook = new XSSFWorkbook();//创建第一个工作簿Sheet sheet = workbook.createSheet("dbName");//将数据库字段(map的key)写入第一行Map<String, Object> firstRowMap = dataList.get(0);Set<String> keySet = firstRowMap.keySet();Object[] keyArr = keySet.toArray();Row row0 = sheet.createRow(0);for (int i = 0; i < keyArr.length; i++) {//创建单元格并写入数据Cell cell = row0.createCell(i);cell.setCellValue(keyArr[i].toString());}//将数据写入其他行for (int i = 0; i < dataList.size(); i++) {//控制有多少行Map<String, Object> rowMap = dataList.get(i);Row row = sheet.createRow(i + 1);for (int j = 0; j < rowMap.size(); j++) {Cell cell = row.createCell(j);Object o = rowMap.get((String) keyArr[j]);//除掉空值,也可以写入对应类型,此处直接写入stringcell.setCellValue(null==o?"":o.toString());}}//输出文件FileOutputStream fos = new FileOutputStream(file);workbook.write(fos);}
}
测试

读取数据库的代码就不放了.

    @Testpublic void Test01() throws Exception {List<User> allUser = userController.getAllUser();List<Map<String, Object>> mapList = MapAndBeanUtil.beansToMap(allUser);CreatExcel.writeExcel(mapList,"d://222222/333/444");}


导出的结果就是这样,文件也生成了.顺序需要自己调整.
原因相信不用我说,都知道.

方式二

方式二:直接准备一个excel将数据写入.方法大同小异

public class WriteExcel {public static void writeExcel(List<Map<String,Object>> dataList,File file) throws Exception {//判断文件类型获取文件Workbook workbook = getWorkbook(file);//获取第一个工作簿Sheet sheet = workbook.getSheetAt(0);//清除表内的原有的数据for (int i = 0; i < sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);if (null!=row) {sheet.removeRow(row);}}//将数据库字段(map的key)写入第一行Map<String, Object> firstRowMap = dataList.get(0);Set<String> keySet = firstRowMap.keySet();Object[] keyArr = keySet.toArray();Row row0 = sheet.createRow(0);for (int i = 0; i < keyArr.length; i++) {row0.createCell(i).setCellValue(keyArr[i].toString());}//将数据写入其他行for (int i = 0; i < dataList.size(); i++) {//控制有多少行Map<String, Object> rowMap = dataList.get(i);Row row = sheet.createRow(i + 1);for (int j = 0; j < rowMap.size(); j++) {Cell cell = row.createCell(j);System.out.println(keyArr[j]);cell.setCellValue(null==(rowMap.get((String)keyArr[j]))?"":rowMap.get(keyArr[j]).toString());}}//输出文件FileOutputStream fos = new FileOutputStream(file);workbook.write(fos);}private static Workbook getWorkbook(File file) throws Exception {Workbook workbook = null;FileInputStream fis = new FileInputStream(file);if (file.getName().endsWith("xls")) {workbook = new HSSFWorkbook(fis);} else if (file.getName().endsWith("xlsx")) {workbook = new XSSFWorkbook(fis);} else {throw new Exception("格式错误");}return workbook;}
}

结果同样写入.

使用POI将数据库导出为excel表格相关推荐

  1. 将数据库查询结果导出成Excel表格

    使用Java代码,从数据库中获取结果集,将结果集导出成Excel表格形式. 从数据库中查询学生表所有数据,将其导出成Excel表格,点击查看学生表表结构 . package com.test.test ...

  2. POI导出读取Excel表格讲解

    文章目录 一.POI是什么? Apache POI介绍 EasyExcel介绍 二.常用信息 三.导出Excel表具体操作 1.POI-Excel写 2.大文件写数据 3.大文件写SXSSF 四.读E ...

  3. 数据库中的表导出成excel表格 并发送给客户端

    需求概述 excel相信大家都不陌生了,公司里的白领也好大学学生也好的老朋友了,今天说说后端数据库里的内容怎么导出成excel表格 技术手段 后端:Servlet,poi,MyBaits 前端:axi ...

  4. python生成excel表格-Python实现将数据库一键导出为Excel表格的实例

    数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...

  5. php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...

    php 怎么把数据导出到excel表格 php 把数据导出到excel表多种方法如使用 phpExcel 等,以下代码是直接通 header 生成 excel 文件的代码示例: header(&quo ...

  6. python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...

    数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...

  7. SQL Server 数据库中数据库表导出为Excel表格

    数据库操作人员经常会使用sql server 中数据导出至excel表中,其过程其实比较简单,只是有部分细节需要注意,有出现个别情况可以进行规避 处理 打开数据库,选择需要导出的数据库名,右键选择&q ...

  8. c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...

    如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...

  9. python数据导出excel模板中的脚本_Python实现将数据库一键导出为Excel表格的实例...

    数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...

最新文章

  1. XCode删除多余的Simulator(模拟器)
  2. 解决外部符号错误:_main,_WinMain@16,__beginthreadex
  3. Hadoop集群中运行MapReduce程序错误记录
  4. 闪念-许久未来一切没变
  5. java解析nes_【JVM系列】一步步解析java执行内幕
  6. HTML5拖放API
  7. CloudFoundry cf push命令报错误码223的解决方法
  8. BZOJ 2844 | HYSBZ - 2844albus就是要第一个出场——线性基
  9. 快抢!猪年之前最后一波送书福利,错过只能等“明年”
  10. ubuntu 部署 redis 主从节点配置
  11. 关于超过255台电脑的内网IP规划问题
  12. 左移和右移运算符的重载问题(里面的绝对盲点)在做了一遍,还是出错了
  13. 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
  14. 《Two Dozen Short Lessons in Haskell》学习(三)
  15. ubuntu下载Linux 内核,ubuntu下载linux内核源码
  16. 服务器采集协议,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)
  17. cs1.6联机服务器没有响应,cs1.6联机问题解说
  18. vue设置LED字体
  19. 公告栏模板php代码,destoon调用自定义模板及样式的公告栏_PHP教程
  20. 易經大意 061_080

热门文章

  1. psd替换图片图层,图层效果不变
  2. python_____三级菜单
  3. 三星天气显示服务器不可用,三星手机天气APP出现诡异BUG!网友:这就是它爆炸的原因?...
  4. (转)iPod原充拆机图+iPod仿充拆机图+DIY(普充)实现iPod充电详细教程(详图)+回复 [复制链接]...
  5. 如何使用fgets()函数
  6. 感情沟通出了问题要怎么解决_两个人感情出现问题了怎么办?六招教你解决感情问题...
  7. 一键排版工具1.0.6使用说明
  8. 苹果se2_苹果SE2已经被替代,配置A13的iPhone 9算不算大惊喜?
  9. 恭主驾到——你知道发动机舱需要注意哪些吗?
  10. sql显错注入靶机演示