使用POI将数据库导出为excel表格
使用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表格相关推荐
- 将数据库查询结果导出成Excel表格
使用Java代码,从数据库中获取结果集,将结果集导出成Excel表格形式. 从数据库中查询学生表所有数据,将其导出成Excel表格,点击查看学生表表结构 . package com.test.test ...
- POI导出读取Excel表格讲解
文章目录 一.POI是什么? Apache POI介绍 EasyExcel介绍 二.常用信息 三.导出Excel表具体操作 1.POI-Excel写 2.大文件写数据 3.大文件写SXSSF 四.读E ...
- 数据库中的表导出成excel表格 并发送给客户端
需求概述 excel相信大家都不陌生了,公司里的白领也好大学学生也好的老朋友了,今天说说后端数据库里的内容怎么导出成excel表格 技术手段 后端:Servlet,poi,MyBaits 前端:axi ...
- python生成excel表格-Python实现将数据库一键导出为Excel表格的实例
数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...
- php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...
php 怎么把数据导出到excel表格 php 把数据导出到excel表多种方法如使用 phpExcel 等,以下代码是直接通 header 生成 excel 文件的代码示例: header(&quo ...
- python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...
数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...
- SQL Server 数据库中数据库表导出为Excel表格
数据库操作人员经常会使用sql server 中数据导出至excel表中,其过程其实比较简单,只是有部分细节需要注意,有出现个别情况可以进行规避 处理 打开数据库,选择需要导出的数据库名,右键选择&q ...
- c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...
如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...
- python数据导出excel模板中的脚本_Python实现将数据库一键导出为Excel表格的实例...
数据库数据导出为excel表格,也可以说是一个很常用的功能了.毕竟不是任何人都懂数据库操作语句的. 下面先来看看完成的效果吧. 数据源 导出结果 依赖 由于是Python实现的,所以需要有Python ...
最新文章
- XCode删除多余的Simulator(模拟器)
- 解决外部符号错误:_main,_WinMain@16,__beginthreadex
- Hadoop集群中运行MapReduce程序错误记录
- 闪念-许久未来一切没变
- java解析nes_【JVM系列】一步步解析java执行内幕
- HTML5拖放API
- CloudFoundry cf push命令报错误码223的解决方法
- BZOJ 2844 | HYSBZ - 2844albus就是要第一个出场——线性基
- 快抢!猪年之前最后一波送书福利,错过只能等“明年”
- ubuntu 部署 redis 主从节点配置
- 关于超过255台电脑的内网IP规划问题
- 左移和右移运算符的重载问题(里面的绝对盲点)在做了一遍,还是出错了
- 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
- 《Two Dozen Short Lessons in Haskell》学习(三)
- ubuntu下载Linux 内核,ubuntu下载linux内核源码
- 服务器采集协议,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)
- cs1.6联机服务器没有响应,cs1.6联机问题解说
- vue设置LED字体
- 公告栏模板php代码,destoon调用自定义模板及样式的公告栏_PHP教程
- 易經大意 061_080
热门文章
- psd替换图片图层,图层效果不变
- python_____三级菜单
- 三星天气显示服务器不可用,三星手机天气APP出现诡异BUG!网友:这就是它爆炸的原因?...
- (转)iPod原充拆机图+iPod仿充拆机图+DIY(普充)实现iPod充电详细教程(详图)+回复 [复制链接]...
- 如何使用fgets()函数
- 感情沟通出了问题要怎么解决_两个人感情出现问题了怎么办?六招教你解决感情问题...
- 一键排版工具1.0.6使用说明
- 苹果se2_苹果SE2已经被替代,配置A13的iPhone 9算不算大惊喜?
- 恭主驾到——你知道发动机舱需要注意哪些吗?
- sql显错注入靶机演示