diff --git a/pom.xml b/pom.xml index 42841b3..0294aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -107,11 +107,6 @@ libthrift 0.9.2 - - com.alibaba - fastjson - 1.2.35 - com.alibaba fastjson @@ -120,12 +115,12 @@ org.apache.poi poi - 3.14 + 3.17 org.apache.poi poi-ooxml - 3.14 + 3.17 diff --git a/src/main/java/com/jmfy/controller/OrderInfoController.java b/src/main/java/com/jmfy/controller/OrderInfoController.java index 74b4629..b7d1a45 100644 --- a/src/main/java/com/jmfy/controller/OrderInfoController.java +++ b/src/main/java/com/jmfy/controller/OrderInfoController.java @@ -1,7 +1,5 @@ package com.jmfy.controller; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.jmfy.WebSecurityConfig; import com.jmfy.dao.*; import com.jmfy.model.*; @@ -10,10 +8,10 @@ import com.jmfy.model.vo.OrderExcelVo; import com.jmfy.redisProperties.RedisUserKey; import com.jmfy.utils.*; import com.jmfy.utils.DateUtil; -import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,9 +29,6 @@ import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.math.BigDecimal; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; import java.util.*; /** @@ -316,53 +311,48 @@ public class OrderInfoController { long start = DateUtil.now(); LOGGER.info("开始导出订单,写入文件,name:{},订单数:{}",name, cgPayOrders.size()); try (FileOutputStream fOut = new FileOutputStream(getExcelFilePath(name, start))) { - try (Workbook workbook = new XSSFWorkbook()) { - CellStyle contextStyle = workbook.createCellStyle(); - int rowIndex = 1, cellIndex = 0; - Field[] fields = cgPayOrders.get(0).getClass().getDeclaredFields(); - Sheet sheet = workbook.createSheet(); - Row headerRow = sheet.createRow(0); - while (cellIndex < fields.length) { - Cell cell = headerRow.createCell(cellIndex); - cell.setCellType(HSSFCell.CELL_TYPE_STRING); - cell.setCellValue(fields[cellIndex].getAnnotation(Fields.class).value()); - cellIndex++; - } + SXSSFWorkbook workbook = new SXSSFWorkbook(); // 使用SXSSFWorkbook代替XSSFWorkbook - for (Corder cgPayOrder : cgPayOrders) { - if (rowIndex > 65535) { - // 超过行数限制,创建新的工作表 - sheet = workbook.createSheet(); - headerRow = sheet.createRow(0); - cellIndex = 0; - while (cellIndex < fields.length) { - Cell cell = headerRow.createCell(cellIndex); - cell.setCellType(HSSFCell.CELL_TYPE_STRING); - cell.setCellValue(fields[cellIndex].getAnnotation(Fields.class).value()); - cellIndex++; - } - rowIndex = 1; - } + CellStyle contextStyle = workbook.createCellStyle(); + int rowIndex = 1, cellIndex = 0; + Field[] fields = cgPayOrders.get(0).getClass().getDeclaredFields(); + SXSSFSheet sheet = workbook.createSheet(); + Row headerRow = sheet.createRow(0); + while (cellIndex < fields.length) { + Cell cell = headerRow.createCell(cellIndex); + cell.setCellType(CellType.STRING); + cell.setCellValue(fields[cellIndex].getAnnotation(Fields.class).value()); + cellIndex++; + } + int batchSize = 1000; // 每批写入的数据量 + int batchCount = (int) Math.ceil((double) cgPayOrders.size() / batchSize); + for (int batch = 0; batch < batchCount; batch++) { + int startIndex = batch * batchSize; + int endIndex = Math.min(startIndex + batchSize, cgPayOrders.size()); + for (int i = startIndex; i < endIndex; i++) { + Corder cgPayOrder = cgPayOrders.get(i); cellIndex = 0; Row currentRow = sheet.createRow(rowIndex); while (cellIndex < fields.length) { Cell cell = currentRow.createCell(cellIndex); - cell.setCellType(HSSFCell.CELL_TYPE_STRING); + cell.setCellType(CellType.STRING); Object value = getFieldValueByName(fields[cellIndex].getName(), cgPayOrder); setCellValue(cell, value, contextStyle); cellIndex++; } rowIndex++; } - workbook.write(fOut); - }catch (Exception e){ - LOGGER.error("导出订单报错1:{}", e.getMessage(), e); + + sheet.flushRows(); // 刷新行数据到磁盘,释放内存 } + + workbook.write(fOut); + workbook.dispose(); // 释放临时文件资源 + LOGGER.info("导出订单操作,excel文件写入耗时:{}毫秒", DateUtil.now() - start); } catch (Exception e) { - LOGGER.error("导出订单报错2:{}", e.getMessage(), e); + LOGGER.error("导出订单报错:{}", e.getMessage(), e); } - LOGGER.info("导出订单操作,excel文件写入耗时:{}毫秒", DateUtil.now() - start); } private static String getExcelFilePath(String name, long start) throws Exception {