poi写入大数据到Excel及调优

Excel版本介绍及写入参考上一篇:
https://blog.csdn.net/moerduo0/article/details/113833765

创建一个maven项目并导入poi依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zkd</groupId>
    <artifactId>poi</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
<!--        xls(03)-->
        <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
        </dependency>

<!--        xlsx(07)-->
        <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
        </dependency>

        <!--日期格式化工具-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>

        <!--test-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

大数据03(.xls)版本代码:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import java.io.FileOutputStream;

public class Text {
    
    
    //文件生成路径
    String path="D:\\idea_gzkj\\poi\\";

    //03版本的大数据写入
    @Test
    public void text03() throws Exception{
    
    
        //开始时间
        long begin=System.currentTimeMillis();

        //创建一个簿
        Workbook workbook=new HSSFWorkbook();

        //创建表
        Sheet sheet = workbook.createSheet();

        //写入数据  03版本的excel最多只有65536行
        for (int i = 0; i < 65536; i++) {
    
    
            //创建行
            Row row = sheet.createRow(i);
            for (int y = 0; y < 10; y++) {
    
    
                //每行写0-10   10列数据
                Cell cell = row.createCell(y);
                cell.setCellValue(y);
            }
        }

        System.out.println("写入完成");
        //创建文件
        FileOutputStream fileOutputStream=new FileOutputStream(path+"03大数据.xls");
        //写
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        //结束时间
        long end=System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    }
}

效果:用了2秒速度非常快在这里插入图片描述
在这里插入图片描述

大数据07(.xlsx)版本代码:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.FileOutputStream;

public class Text {
    
    
    //文件生成路径
    String path="D:\\idea_gzkj\\poi\\";

    //07版本的大数据写入
    @Test
    public void text07() throws Exception{
    
    
        //开始时间
        long begin=System.currentTimeMillis();

        //创建一个簿
        Workbook workbook=new XSSFWorkbook();

        //创建表
        Sheet sheet = workbook.createSheet();

        //写入数据  03版本的excel最多只有65536行
        for (int i = 0; i < 65536; i++) {
    
    
            //创建行
            Row row = sheet.createRow(i);
            for (int y = 0; y < 10; y++) {
    
    
                //每行写0-10   10列数据
                Cell cell = row.createCell(y);
                cell.setCellValue(y);
            }
        }

        System.out.println("写入完成");
        //创建文件
        FileOutputStream fileOutputStream=new FileOutputStream(path+"07大数据.xlsx");
        //写
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        //结束时间
        long end=System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    }
}

效果:同样都是写65536行07比03要慢许多
在这里插入图片描述

优化方案:使用缓存

使用XSSFWorkbook接口
优点:写入速度快,占用更少的内存
注意:过程会产生临时文件,需要清理临时文件

优化后代码

这里写入10万行数据

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;

import java.io.FileOutputStream;

public class Text {
    
    
    //文件生成路径
    String path="D:\\idea_gzkj\\poi\\";

    //07版本的大数据写入加速版
    @Test
    public void text07() throws Exception{
    
    
        //开始时间
        long begin=System.currentTimeMillis();

        //创建一个簿
        Workbook workbook=new SXSSFWorkbook();

        //创建表
        Sheet sheet = workbook.createSheet();

        //写入数据  03版本的excel最多只有65536行
        for (int i = 0; i < 1000; i++) {
    
    
            //创建行
            Row row = sheet.createRow(i);
            for (int y = 0; y < 10; y++) {
    
    
                //每行写0-10   10列数据
                Cell cell = row.createCell(y);
                cell.setCellValue(y);
            }
        }

        System.out.println("写入完成");
        //创建文件
        FileOutputStream fileOutputStream=new FileOutputStream(path+"07大数据S.xlsx");
        //写
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        //删除临时文件
        ((SXSSFWorkbook) workbook).dispose();
        //结束时间
        long end=System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    }
}

效果:
写入10万行数据比之前65536行快多了
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/moerduo0/article/details/113835059