java使用POI将数据导出放入Excel

本文主要是将数据库取出的数据按照自定义的行列格式导出到excel中,POI则是实现我们需求所用到的技术。

  • POI介绍
  • 使用spring boot导入相关依赖
  • 获取数据(自行处理)
  • 完整代码实例:创建excel,将数据写入excel

####1.POI介绍 要想使用POI对Excel进行操作,我们需要先了解一下Excel的两种版本:一种是97-2003版本扩展名是“.xls”;一种是2007版本扩展名是“.xlsx”。POI分别针对这两种版本需要导入的jar包不同,操作类也不同。

HSSF:操作的是.xls;XSSF:操作的是.xlsx。

不管哪种操作,基本思路都是一致,先要对应一个Excel文件,然后在对应文件中的某个sheet,接下来在操作某一行和这一行中的某一列。对应POI包:文件(webbook)、sheet(sheet)、行(row)和具体单元格(cell)。

详细操作请参照POI官网的Excel(HSSF/XSSF)操作

####2.通过spring boot导入依赖 为了使用java操控excel,需要将相关的jar引入,对于HSSF只需要导入POI.jar,而XSSF则需要导入四个jar,具体导入见下面代码 将代码块的依赖放入工程的pom.xml文件中就可以了。 工程不是spring boot的需要手动将下面jar导入。

1<!-- HSSF需要引入的 --> 2 <dependency> 3 <groupId>org.apache.poi</groupId> 4 <artifactId>poi</artifactId> 5 <version>RELEASE</version> 6 </dependency> 7 8<!-- XSSF需要引入的 --> 9 <dependency> 10 <groupId>org.apache.xmlbeans</groupId> 11 <artifactId>xmlbeans</artifactId> 12 <version>2.6.0</version> 13 </dependency> 14 <dependency> 15 <groupId>dom4j</groupId> 16 <artifactId>dom4j</artifactId> 17 <version>1.6.1</version><!--$NO-MVN-MAN-VER$ --> 18 </dependency> 19 <dependency> 20 <groupId>org.apache.poi</groupId> 21 <artifactId>poi</artifactId> 22 <version>3.9</version> 23 </dependency> 24 <dependency> 25 <groupId>org.apache.poi</groupId> 26 <artifactId>poi-ooxml</artifactId> 27 <version>3.9</version> 28 </dependency>

####3完整代码实例:简单的创建excel,将数据写入excel 依赖导入成功之后,就可以开始进行excel的生成。详细步骤在代码注释中有说明。

1 /** 2 * 创建excel 3 * @param listresult 是需要写入excel中的数据,通过map中的k-v来将数据写入excel 4 * @return 5 */ 6 private XSSFWorkbook createUserListExcel(List<Map<String,Object>> listresult){ 7 // 1.创建HSSFWorkbook,一个HSSFWorkbook对应一个Excel文件 8 XSSFWorkbook wb = new XSSFWorkbook(); 9 // 2.在workbook中添加一个sheet,对应Excel文件中的sheet 10 XSSFSheet sheet = wb.createSheet("sheet1"); 11 // 3.设置表头,即每个列的列名 12 String[] titel = {"rowName1","rowName2","rowName3","rowName4"}; 13 // 3.1创建第一行 14 XSSFRow row = sheet.createRow(0); 15 // 此处创建一个序号列 16 row.createCell(0).setCellValue("序号"); 17 // 将列名写入 18 for (int i = 0; i < titel.length; i++) { 19 // 给列写入数据,创建单元格,写入数据 20 row.createCell(i+1).setCellValue(titel[i]); 21 } 22 // 写入正式数据 23 for (int i = 0; i < listresult.size(); i++) { 24 // 创建行 25 row = sheet.createRow(i+1); 26 // 序号 27 row.createCell(0).setCellValue(i+1); 28 // 医院名称 29 row.createCell(1).setCellValue(listresult.get(i).get("rowKey1").toString()); 30 sheet.autoSizeColumn(1, true); 31 // 业务类型 32 row.createCell(2).setCellValue(listresult.get(i).get("rowKey2").toString()); 33 // 异常信息 34 row.createCell(3).setCellValue(listresult.get(i).get("rowKey3").toString()); 35 // 数量 36 row.createCell(4).setCellValue(listresult.get(i).get("rowKey4").toString()); 37 } 38 /** 39 * 上面的操作已经是生成一个完整的文件了,只需要将生成的流转换成文件即可; 40 * 下面的设置宽度可有可无,对整体影响不大 41 */ 42 // 设置单元格宽度 43 int curColWidth = 0; 44 for (int i = 0; i <= titel.length; i++) { 45 // 列自适应宽度,对于中文半角不友好,如果列内包含中文需要对包含中文的重新设置。 46 sheet.autoSizeColumn(i, true); 47 // 为每一列设置一个最小值,方便中文显示 48 curColWidth = sheet.getColumnWidth(i); 49 if(curColWidth<2500){ 50 sheet.setColumnWidth(i, 2500); 51 } 52 // 第3列文字较多,设置较大点。 53 sheet.setColumnWidth(3, 8000); 54 } 55 return wb; 56 } 57 /** 58 * 用户列表导出 59 * @param userForm 60 */ 61 private String downUserList(List<Map<String,Object>> listresult){ 62 // getTime()是一个返回当前时间的字符串,用于做文件名称 63 String name = getTime(); 64 // csvFile是我的一个路径,自行设置就行 65 String ys = csvFile + "//" + name + ".xlsx"; 66 // 1.生成Excel 67 XSSFWorkbook userListExcel = createUserListExcel(listresult); 68 try{ 69 // 输出成文件 70 File file = new File(csvFile); 71 if(file.exists() || !file.isDirectory()) { 72 file.mkdirs(); 73 } 74 // TODO 生成的wb对象传输 75 FileOutputStream outputStream = new FileOutputStream(new File(ys)); 76 userListExcel.write(outputStream); 77 outputStream.close(); 78 }catch(Exception e){ 79 e.printStackTrace(); 80 } 81 return name; 82 } 83

因为工作中多次用到了这个,所以简单的记录一下,如有问题,欢迎指正。 点击进入简书地址 点击进入csdn地址

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException

java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException参考文章:(1)java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException(https://www.oschina.net/action/GoToLi

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )