JAVA exporta com eficiência milhões de dados para planilhas EXCEL

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 

Acho que você gosta

Origin blog.csdn.net/qq_38623939/article/details/128845635
Recomendado
Clasificación