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

实现效果

相关推荐
用户0332126663678 小时前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记8 小时前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
CORNERSTONE36514 小时前
低代码开发有哪些应用场景?
低代码·excel·erp·mes·企业数字化
小葱炖豆腐1 天前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
网络豆2 天前
Apache Maven 鸿蒙 PC 适配全记录:把 JVM 构建工具交付到 HiShell
maven·apache·harmonyos
cspttty2 天前
2026年财务分析岗JD中的Excel、SQL、BI与业务分析要求
大数据·sql·excel
cspttty2 天前
HR数字化校招准备路线:Excel、SQL、BI和AI工具怎么学
人工智能·sql·excel
网络豆2 天前
Apache Hive 鸿蒙 PC 适配全记录:以 Qt 客户端打通 HiveQL、监控与元数据访问
hive·apache·harmonyos
网络豆2 天前
Apache HBase 鸿蒙 PC 适配全记录:用 Qt 原生客户端打通 REST 管理与数据读写
apache·hbase·harmonyos
鲲穹AI种草3 天前
Excel 表格批量处理与数据整理,多款表格工具能力客观记录
excel·表格处理