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();
	            }
	        }
	    }
    }

实现效果

相关推荐
babe小鑫8 小时前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
Data-Miner15 小时前
商品ABC分类分析怎么用AI做?脚本复用+图表可编辑的一次完整实操
人工智能·数据分析·excel
E-iceblue3 天前
Excel 列转行/行列转换全指南:从 4 种常见解法到 Python 批量自动化
python·excel·python库·spire.xls
Data-Miner3 天前
AI处理数据的脚本复用与逻辑复用有什么区别?哪种方式更能沉淀工作成果
数据分析·excel
福兮说4 天前
在浏览器里写一个“够用就好“的 Excel 公式求值器
前端·javascript·excel·编译原理
慧都小妮子4 天前
标签打印如何减少手工抄数?用Bartender 直连 Excel 批量打印
excel·bartender·条码打印·标签打印软件·数据驱动打印·工业打印机
SunnyDays10115 天前
Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间
java·excel·数据验证·下拉列表
Metaphor6925 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
用户0332126663675 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记5 天前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel