本文主要是将数据库取出的数据按照自定义的行列格式导出到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地址