使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!
一、需求
我们会遇到开发任务:
经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel.
小王:好的,经理.(内心一脸懵逼)
二、前期准备
首先我们采用Apache的POI来实现Excel的导出功能,
导入直通车—> 使用POI+hutool实现导入Excel
我们把maven依赖先准备好:
<!-- 导出为Excel所需依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <!-- 工具包 --> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency>
三、代码演示
- 首先我们先使用JDBC结合Dbutils把要导出的数据库表数据准备好
/** * 利用jdbc来把要导出的数据表查询出来 * @return */ public static Map<String,List<Map<String, Object>>> getDataSource(){ Connection con = null; Statement sta = null; try { //1.注册驱动==》告诉指挥部有哪些造桥人可以调遣 Class.forName("com.mysql.cj.jdbc.Driver"); //这里是mysql为例 oracle的url ---"jdbc:oracle:thin:@localhost:1521:orcl" String url = "jdbc:mysql://127.0.0.1:3306/test"; String user = "root"; String pwd = "root"; //2.获得链接==》指挥部根据传入类型 调遣不同的造桥的人造桥 con = DriverManager.getConnection(url,user,pwd); //3.创建Statement对象===》造车 sta = con.createStatement(); //4.执行SQL ==》运行SQL 有结果返回 String sql = "select * from user"; String sql1 = "select * from test"; //第五步处理结果还可以引入Dbutils工具包来解析结果 QueryRunner queryRunner = new QueryRunner(); //存放查询出来的数据,key为表名,value为查询出来的表字段和对应的值 Map<String,List<Map<String, Object>>> mapMap = new HashMap<>(); List<Map<String, Object>> query = queryRunner.query(con, sql, new MapListHandler()); List<Map<String, Object>> query1 = queryRunner.query(con, sql1, new MapListHandler()); //暂时以两张表为例,多张一个意思 mapMap.put("user",query); mapMap.put("test",query1); return mapMap; } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); return null; }finally { //6.关闭资源 DbUtils.closeQuietly(sta);//Dbutils封装了关闭方法 DbUtils.closeQuietly(con); } }
- 接下来我们把这些数据库表数据导出到Excel
/** * 把准备好的数据库表数据导出到本地Excel中 */ public boolean exportExcel() { //拿到数据库表的所有信息,开始导出 Map<String, List<Map<String, Object>>> source = getDataSource(); //创建一个Excel模板 Workbook workbook = new XSSFWorkbook(); for (Map.Entry<String,List<Map<String, Object>>> mapTop :source.entrySet()) { //获取sheet的名字 以表名来命名 String sheetName = mapTop.getKey(); //创建sheet Sheet sheet = workbook.createSheet(sheetName); //创建第一行 Row header = sheet.createRow(0); //从第二行开始 --来控制插入的行数 int rowSize = 1; //便利每个表的数据 for (Map<String, Object> button : mapTop.getValue()){ //控制第一行的列 int columnSize = 0; //给第一行表头赋值 for (String string :button.keySet()){ //把表头添加上 header.createCell(columnSize++).setCellValue(string); } //控制从第二行开始插入数据的列 int valueSize = 0; //创建第二行 每添加完一行+1 Row data = sheet.createRow(rowSize++); //从第二行开始都是数据 for (Object object : button.values() ){ //防止有的列为空 if (object != null) { data.createCell(valueSize++).setCellValue(object.toString()); }else { data.createCell(valueSize++).setCellValue(""); } } } } try { File file = new File("E:/template/数据库表数据.xlsx"); if (file.exists()){ file.delete();//存在就删除 } //保存到本地 FileOutputStream fos = new FileOutputStream("E:/template/数据库表数据.xlsx"); workbook.write(fos); fos.close(); //存在就代表成功 return file.exists(); } catch (Exception e) { e.printStackTrace(); return false; } }
四、结果截图
五、总结
这样就实现了数据库表的导出,有什么疑问留言哦,谢谢大家的观看!!!