Easypoi-大数据量导出

EasyExcel 在处理 Excel 文件时,需要占用一定的内存。如果导出的数据量过大,可能导致内存占用过高,从而引发 CPU 过高的问题。并发访问导出接口也会导致性能问题,所以尽量在数据量比较大的导出接口添加锁控制。

以下是虚化业务后的代码,记录一下遇到的问题解决方案

/**
 * 导出大数据量Excel文件
 * @param response HttpServletResponse对象,用于设置响应头和输出流
 * @param requestForm 包含查询参数的表单对象
 * @throws ParseException 当日期解析发生错误时抛出异常
 * @throws IOException 当输入或输出操作发生错误时抛出异常
 */
public void exportBigExcelist(HttpServletResponse response, RequestForm requestForm) throws ParseException, IOException {
   
   
    // 设置Excel导出参数,包括标题和sheet名称
    ExportParams params = new ExportParams("标题", "sheet名称");

    // 使用EasyExcel工具类导出大数据Excel文件
    
### 使用 easypoi-spring-boot-starter 实现大规模数据导出 为了实现高效的大规模数据导出,建议采用分页读取数据库记录并通过流式写入 Excel 文件的方式来避免内存溢出。这种方式能够显著提高性能并减少资源消耗。 #### 配置依赖项 首先,在 `pom.xml` 中添加必要的依赖: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.1.1</version> </dependency> ``` #### 创建实体类 定义要导出的数据模型,并使用 EasyPoi 注解标记字段: ```java import cn.afterturn.easypoi.excel.annotation.Excel; public class User { @Excel(name="姓名", orderNum = "0") private String name; @Excel(name="年龄", orderNum = "1") private Integer age; // Getters and Setters... } ``` #### 编写服务层逻辑 编写业务逻辑来获取分页后的用户列表,并将其转换成 List<User> 类型返回给控制器层: ```java @Service public class UserService { public List<User> getUsersByPage(int pageNum, int pageSize){ PageHelper.startPage(pageNum,pageSize); return userMapper.selectAll(); } } ``` #### 控制器层处理请求 在 Controller 层接收前端传来的参数(如当前页码、每页大小),调用 Service 方法查询对应范围内的数据集;最后利用 SXSSFWorkbook 流式写出大文件: ```java @RestController @RequestMapping("/export") public class ExportController { @Autowired private UserService userService; /** * 导出大量数据至 Excel 表格 */ @GetMapping(value="/users") public void exportUsers(HttpServletResponse response) throws Exception{ // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 定义下载文件名 String fileName = URLEncoder.encode("用户信息表.xlsx","UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); // 初始化工作簿对象 (SXSSF 可以有效降低内存占用) SXSSFWorkbook workbook = new SXSSFWorkbook(); try ( OutputStream os = response.getOutputStream() ) { // 获取总条数 long totalCount = userService.getTotalCount(); int batchSize = 5000; // 每次取出的数量 for (int i=0;i<=totalCount/batchSize;i++){ // 计算起始位置和结束位置 int startRow = i*batchSize+1; int endRow = Math.min((i+1)*batchSize,totalCount)+1; // 查询指定区间内数据 List<User> users = userService.getUsersByPage(startRow,endRow-startRow); // 将数据填充到 sheet 中 ExcelExportUtil.exportExcel( new ExportParams(), User.class, users, workbook.createSheet("sheet"+(i+1)) ); } // 输出 excel 到客户端浏览器 workbook.write(os); } finally { if(workbook!=null){ workbook.dispose(); // 清理临时文件 workbook.close(); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值