更新时间:2023-08-17 来源:黑马程序员 浏览量:
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。
一般情况下,POI 都是用于操作 Excel 文件,例如银行网银系统导出交易明细、各种业务系统导出Excel报表、批量导入业务数据等。
POI导出Excel报表的需求分析和设计
如下产品原型,我们要在导出的报表中包含各模块的业务数据和明细。
导出的Excel报表格式:
导出Excel形式的报表文件和最近30天的运营数据,接口可以如下设计:
当前接口没有返回数据,因为报表导出功能本质上是文件下载,服务端会通过输出流将Excel文件下载到客户端浏览器。实现步骤如下:
①设计Excel模板文件
②查询近30天的运营数据
③将查询到的运营数据写入模板文件
④通过输出流将Excel文件下载到客户端浏览器
根据接口定义,在ReportController中创建export方法:
/** * 导出运营数据报表 * @param response */@GetMapping("/export") @ApiOperation("导出运营数据报表") public void export(HttpServletResponse response){ reportService.exportBusinessData(response); }
在ReportService接口中声明导出运营数据报表的方法:
/** * 导出近30天的运营数据报表 * @param response */ void exportBusinessData(HttpServletResponse response);
在ReportService接口中声明导出运营数据报表的方法:
/** * 导出近30天的运营数据报表 * @param response */ public void exportBusinessData(HttpServletResponse response) { LocalDate begin = LocalDate.now().minusDays(30); LocalDate end = LocalDate.now().minusDays(1); //查询概览运营数据,提供给Excel模板文件 BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX)); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx"); try { //基于提供好的模板文件创建一个新的Excel表格对象 XSSFWorkbook excel = new XSSFWorkbook(inputStream); //获得Excel文件中的一个Sheet页 XSSFSheet sheet = excel.getSheet("Sheet1");
在ReportServiceImpl实现类中实现导出运营数据报表的方法(第2部分):
sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end); //获得第4行XSSFRow row = sheet.getRow(3); //获取单元格row.getCell(2).setCellValue(businessData.getTurnover()); row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); row.getCell(6).setCellValue(businessData.getNewUsers()); row = sheet.getRow(4);row.getCell(2).setCellValue(businessData.getValidOrderCount()); row.getCell(4).setCellValue(businessData.getUnitPrice()); for (int i = 0; i < 30; i++) { LocalDate date = begin.plusDays(i); //准备明细数据 businessData = workspaceService.getBusinessData(LocalDateTime.of(date,、 LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX)); row = sheet.getRow(7 + i);
在ReportServiceImpl实现类中实现导出运营数据报表的方法(第3部分):
row.getCell(1).setCellValue(date.toString()); row.getCell(2).setCellValue(businessData.getTurnover()); row.getCell(3).setCellValue(businessData.getValidOrderCount()); row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); row.getCell(5).setCellValue(businessData.getUnitPrice()); row.getCell(6).setCellValue(businessData.getNewUsers()); } //通过输出流将文件下载到客户端浏览器中 ServletOutputStream out = response.getOutputStream(); excel.write(out); //关闭资源 out.flush(); out.close(); excel.close(); } catch (IOException e) { e.printStackTrace(); } }