problemas encontrados
1. A lista definida é muito grande para acionar oom
2. A quantidade de dados do Excel exportados é muito grande e a memória está cheia, e o oom já começou antes de enviar para o disco rígido
Em seguida, tente resolvê-lo com poi
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.10-FINAL</version>
</dependency>
Comece com XSSFWorkbook
O parâmetro linhas é o número total de linhas passadas e col é o número total de colunas de saída
public static void XSSFWorkbook(int rows, int col) throws Exception {
long start = System.currentTimeMillis();
XSSFWorkbook workbook1 = new XSSFWorkbook();
Sheet first = workbook1.createSheet("sheet1");
for (int i = 0; i < rows; i++) {
Row row = first.createRow(i);
for (int j = 0; j < col; j++) {
if(i == 0) {
// 首行
row.createCell(j).setCellValue("column" + j);
} else {
// 数据
if (j == 0) {
CellUtil.createCell(row, j, String.valueOf(i));
} else
CellUtil.createCell(row, j, String.valueOf(Math.random()));
}
}
}
FileOutputStream out = new FileOutputStream("E:/XSSFWorkbookworkbook.xlsx");
workbook1.write(out);
out.close();
System.out.println(("XSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
}
Faz com que o GC seja acionado
O motivo é que os dados do documento excel ficam guardados na memória, quando você fica olhando o excel para preencher os dados, quanto maior ele for, a memória não vai conseguir segurar.
Vá para o site oficial do poi para ver
Retorne ao site oficial do POI novamente. http://poi.apache.org/spreadsheet/index.html
O responsável referiu que desde a versão POI3.8 foi disponibilizado um método SXSSF para a operação de uma grande quantidade de dados. então…
original:
SXSSF é uma extensão de streaming compatível com API do XSSF para ser usada quando planilhas muito grandes precisam ser produzidas…
A biblioteca de classes POI implementa uma classe de gravação em lote relativamente eficiente SXSSFWorkbook
Então eu tentei
public static void SXSSFWorkbook(int rows, int col) throws Exception {
long start = System.currentTimeMillis();
XSSFWorkbook workbook1 = new XSSFWorkbook();
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook1, 100);
Sheet first = sxssfWorkbook.createSheet("sheet1");
for (int i = 0; i < rows; i++) {
Row row = first.createRow(i);
for (int j = 0; j < col; j++) {
if(i == 0) {
// 首行
row.createCell(j).setCellValue("column" + j);
} else {
// 数据
if (j == 0) {
CellUtil.createCell(row, j, String.valueOf(i));
} else
CellUtil.createCell(row, j, String.valueOf(Math.random()));
}
}
}
FileOutputStream out = new FileOutputStream("E:/SXSSFWorkbookworkbook.xlsx");
sxssfWorkbook.write(out);
out.close();
System.out.println(("SXSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
}
No momento em que vi os dados, me senti uau. Muito poderoso para dizer. Na verdade, diminuiu de quase 50 segundos para 11 segundos. . .
Por que a lacuna de código é tão grande?
Acontece que o SXSSF implementou um mecanismo para escovar automaticamente os dados. Quando a quantidade de dados atinge um determinado nível (os usuários podem definir esse limite por conta própria). Alguns dos dados gravados no texto são enviados para o disco rígido. Isso alivia a pressão da memória durante a execução do programa. atingir alta eficiência.
Princípio: Substitua a memória pelo disco rígido
Claro, também existe uma ferramenta pronta BigExcelWriter de hutool
Visualizar o código-fonte é apenas uma camada de encapsulamento com base em poi