задний план
Сегодня мне нужно написать экспортированную функцию Excel, но я обнаружил, что когда количество данных достигает 30 000, а количество столбцов равно 23, память переполняется, загрузка ЦП составляет 100%, и тестовая среда сразу взрывается. В локальном тесте обнаружилось, что при экспорте около 3000 кусков данных память кучи моментально увеличилась примерно на 500М. а потом нашелSXSSFWorkbook
этот класс.
Введение
SXSSFWorkbook
необходимостьpoi-ooxml
Сумка3.8
и выше начать поддерживать, что я использую здесь3.9
версия, которая по сути являетсяXSSFWorkbook
своего рода(Excel2007
), он используется таким образом, что硬盘空间
значительно сократить堆内存
occupancy, create a temporary file in the temporary folder directory of the system, and then store all the data larger than the specified number of lines in the temporary file, instead of placing all the data in the memory, and only store the data in the объем памяти.НовейшиеСогласованное количество фрагментов данных, чтобы обменять место на жестком диске на место в памяти и избежать переполнения памяти.
Как пользоваться
Никаких отличий от обычного метода экспорта Excel, просто замените созданный класс наSXSSFWorkbook
SXSSFWorkbook workbook = null;
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
//创建工作簿
workbook = new SXSSFWorkbook();
// 打开压缩功能 防止占用过多磁盘
workbook.setCompressTempFiles(true);
// 创建一个工作表
Sheet sheet = workbook.createSheet("表名");
// 创建一行
Row titleRow = sheet.createRow(0);
// 创建一个单元格
Cell cell = titleRow.createCell(0);
// 给单元格赋值
cell.setCellValue("内容");
// 将工作簿写入输出流
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (workbook != null) {
//使用完毕后将产生的临时文件删除 防止将磁盘搞满
workbook.dispose();
}
if (outputStream != null) {
outputStream.close();
}
}
будь осторожен
-
Лучше включить сжатие
workbook.setCompressTempFiles(true);
Это может значительно уменьшить размер временных файлов. -
Выпуск после использования
workbook.dispose();
Предотвращение увеличения временных файлов и разрыва жесткого диска