一.工作台
1.需求分析和设计
2.代码导入
直接导入代码即可
3.功能测试
前后端联调测试即可
二.Apache POI
1.介绍
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。
一般情况下,POI 都是用于操作 Excel 文件。
Apache POI 的应用场景:
1.银行网银系统导出交易明细
2.各种业务系统导出Excel报表
3.批量导入业务数据
2.入门案例
三.导出运营数据Excel报表
1.需求分析和设计
业务规则:
1.导出Excel形式的报表文件
2.导出最近30天的运营数据
接口设计:
2.代码开发
根据接口定义,在ReportController中创建export方法:
/**
* 导出运营数据报表
* @param response
*/
@GetMapping("/export")
@ApiOperation("导出运营数据报表")
public void export(HttpServletResponse response){
reportService.exportBusinessData(response);
}
在ReportService接口中声明导出运营数据报表的方法:
/**
* 导出近30天的运营数据报表
* @param response
*/
void exportBusinessData(HttpServletResponse response);
在ReportServiceImpl实现类中实现导出运营数据报表的方法
/**
* 导出近30天的运营数据报表
*
* @param response
*/
public void exportBusinessData(HttpServletResponse response) {
LocalDate begin = LocalDate.now().minusDays(30);
LocalDate end = LocalDate.now().minusDays(1);
BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin, LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
try {
XSSFWorkbook excel = new XSSFWorkbook(inputStream);
XSSFSheet sheet = excel.getSheet("Sheet1");
sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);
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(i + 7);
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();
inputStream.close();
excel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Q&A
1.ServletOutputStream 是什么输出流?
ServletOutputStream 是用于将数据写入到 Servlet 的响应中的输出流。它是javax.servlet.ServletOutputStream类的实例,==用于在 Servlet 中向客户端发送二进制数据,比如文件内容。==在代码中通过 response.getOutputStream() 获取了一个 ServletOutputStream 对象,这表示将通过这个输出流将数据写入到 HTTP 响应中。
2.excel.write(out) 具体有什么含义?
XSSFWorkbook 是 Apache POI 库中用于处理 Excel 文件的类,表示一个基于 XML 的 Excel 文档。
excel.write(out) 的含义是将 XSSFWorkbook 对象中的内容写入到 ServletOutputStream 中,从而将 Excel 文件的内容发送给客户端浏览器。这通常用于在后端生成 Excel 文件,并通过 HTTP 响应将文件内容返回给前端,从而实现文件下载的功能。
具体而言,excel.write(out) 会将 Excel 文件的内容写入到提供的输出流 (ServletOutputStream) 中,这个输出流连接着客户端的浏览器。这样,通过浏览器访问相应的接口时,浏览器会收到包含 Excel 文件内容的响应,并触发文件下载操作。
功能测试
全部前后端联调测试即可