Java中利用POI优雅的导出Excel文件详解
前言
故事是这样开始的:公司给排了几天的工期,让完成2个功能模块的开发。其中有一个场景是这样的,从Excel导入数据,要求数据不能重复。用户可以下载导入失败的Excel文件。
这样就有2种实现
- 将失败数据存储数据库,需要下载时生成Excel下载即可
- 将失败数据生成Excel文件存储文件服务器,然后返回下载链接。
老大要求按方案二进行。好吧,导出Excel是再常见不过的功能了,然而总是觉得以前写的不够优雅,所以决定进行简单的封装,以适应简单场景的Excel导出。
实现
Excel导出的数据源一般是数据库中查询的数据。在Java开发这种面向对象的设计中,数据一般都是以对象为载体,填充在集合中的。所以入参之一便设计为Collection集合类。
导出的Excel一般需要表头说明每列数据的含义,这里计划用注解+反射来进行定义。Excel无论是通过HttpServletResponse还是File存储,本质上都是IO流操作。
具体实现如下:
pom.xml
org.apache.poi poi-ooxml 4.1.2
注解定义
该注解添加在字段上,标识哪些字段需要导出到Excel,并且添加表头说明。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public@interfaceExcelHeader{ /** *表头 *@return */ Stringvalue()default""; /** *列索引 *@return */ intcolumnIndex()default0; }
实体类
以下实体类中根据注解可知,age字段不需要导出到Excel。
@Data @NoArgsConstructor @AllArgsConstructor publicclassUser{ @ExcelHeader(value="账号") privateStringusername; @ExcelHeader(value="密码") privateStringpassword; @ExcelHeader(value="生日") @JsonFormat(pattern="yyyy-MM-ddHH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss") privateLocalDateTimebirthday; //该字段没有添加注解,Excel不导出 privateIntegerage; publicUser(Stringusername,Stringpassword,LocalDateTimebirthday){ this.username=username; this.password=password; this.birthday=birthday; } }
单元测试
注释已经足够清晰,这里不再过多复述。
@Slf4j classIdcPoiApplicationTests{ @Test voidcontextLoads()throwsNoSuchFieldException,IllegalAccessException,IOException{ //创建模拟数据 Useruser1=newUser("admin","123456",LocalDateTime.now()); Useruser2=newUser("test","123456",LocalDateTime.now()); Listusers=Arrays.asList(user1,user2); //文件路径 StringbasePath="/Users/cuishiying/Documents/spring-cloud-learning/idc-poi/oss/"; StringfileName=newSimpleDateFormat("yyyyMMddHHmmss").format(newDate()).toString()+".xls"; //将Excel写入文件 HSSFWorkbookworkbook=exportExcel(users,User.class); workbook.setSheetName(0,"sheetName");//设置sheet的Name //无论是通过HttpServletResponse导出还是导出到本地磁盘,本质都是IO操作,所以这里将IO操作提取到外层。 workbook.write(newFile(basePath+File.separator+fileName)); } /** * *@paramdata需要导出的数据 *@paramclz数据对应的实体类 *@param 泛型 *@returnExcel文件 *@throwsNoSuchFieldException *@throwsIllegalAccessException */ public HSSFWorkbookexportExcel(List data,Class clz)throwsNoSuchFieldException,IllegalAccessException{ Field[]fields=clz.getDeclaredFields(); List headers=newLinkedList<>(); List variables=newLinkedList<>(); //创建工作薄对象 HSSFWorkbookworkbook=newHSSFWorkbook();//这里也可以设置sheet的Name //创建工作表对象 HSSFSheetsheet=workbook.createSheet(); //创建表头 RowrowHeader=sheet.createRow(0); //表头处理 for(inth=0;h aClass=t.getClass(); //填充列数据 for(intj=0;j 总结
上边的案例只是表达基本设计思路,并不严谨。大家项目中使用的话还请斟酌。
到此这篇关于Java中利用POI优雅的导出Excel文件的文章就介绍到这了,更多相关Java用POI导出Excel文件内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!