Apache POI 实现 Excel 表格下载

这里以苍穹外卖中数据导出功能为例,记录下 Apache POI 导出 Excel 表格的过程。

首先在 pom.xml 中导入相关依赖

xml 复制代码
<!-- poi 用于操作 excel 表格-->
<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
 </dependency>
 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
 </dependency>

controller层

注意方法中的参数 response, service层定义输出流对象要用。

java 复制代码
@RestController
@RequestMapping("/admin/report")
@Slf4j
public class ReportController {
	@GetMapping("/export")
	@ApiOperation("/导出运营报表")
	public void exportExcel(HttpServletResponse response){
	// 注意这里的参数 response, service层定义输出流对象要用。
	    reportService.exportExcel(response);
	}
}

Service层

定义输出流对象时要用 response 去定义,不是直接 new FileOutputStream()

在得到模板文件时候,注意新建的文件夹在resource下,不要写错,刚开始定义的文件夹名字叫 template, 没加字母 's',一直获取不到模板文件,正确的应该叫 templates

java 复制代码
@Service
public class ReportServiceImpl implements ReportService {
		@Override
	    public void exportExcel(HttpServletResponse response) {
	        // 得到最近三十天的起止日期
	        LocalDate beginTime = LocalDate.now().minusDays(30);
	        LocalDate endTime = LocalDate.now().minusDays(1);
	        BusinessDataVO businessDataVo = workspaceService.getBusinessData(LocalDateTime.of(beginTime, LocalTime.MIN), LocalDateTime.of(endTime, LocalTime.MAX));
	
	        // 得到模板文件
	        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/运营数据报表模板.xlsx");
	
	        try {
	            XSSFWorkbook excel = new XSSFWorkbook(in);
	            // 写入时间
	            XSSFSheet sheet = excel.getSheetAt(0);
	            sheet.getRow(1).getCell(1).setCellValue("时间:" + beginTime + "~" + endTime);
	
	            // 写入概览数据
	            sheet.getRow(3).getCell(2).setCellValue(businessDataVo.getTurnover());
	            sheet.getRow(3).getCell(4).setCellValue(businessDataVo.getOrderCompletionRate());
	            sheet.getRow(3).getCell(6).setCellValue(businessDataVo.getNewUsers());
	            sheet.getRow(4).getCell(2).setCellValue(businessDataVo.getValidOrderCount());
	            sheet.getRow(4).getCell(4).setCellValue(businessDataVo.getUnitPrice());
	
	            // 填充明细数据
	            for (int i = 0; i < 30; i++) {
	                LocalDate date = beginTime.plusDays(i);
	                BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
	                XSSFRow row = sheet.getRow(7 + i);
	                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();
	        } finally {
	            try {
	                in.close();
	            } catch (IOException e) {
	                e.printStackTrace();
	            }
	        }
	    }
    }

实现效果

相关推荐
qq_546937279 小时前
excel乱码修复
excel
小兔崽子去哪了12 小时前
EasyExcel 使用
java·excel
lifallen14 小时前
从Apache Doris 学习 HyperLogLog
java·大数据·数据仓库·算法·apache
学Java的bb15 小时前
苍穹外卖-工作台实现、Apache POI、导出Excel报表
excel
DolphinScheduler社区15 小时前
# 3.1.8<3.2.0<3.3.1,Apache DolphinScheduler集群升级避坑指南
java·大数据·开源·apache·任务调度·海豚调度
Roye_ack1 天前
【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
java·spring boot·后端·excel·苍穹外卖
IccBoY2 天前
Java采用easyexcel组件进行excel表格单元格的自动合并
java·开发语言·excel
风车带走过往2 天前
Excel 常用功能自救手册:遇到问题快速排查指南 (个人备忘版)
excel
lisanmengmeng2 天前
apache-tomcat 安装部署
java·tomcat·apache
跟着珅聪学java2 天前
EasyExcel 读取 Excel 文件指南
excel