POI-Excel写

POI-Excel写

1,创建项目

2,引入pom依赖

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

    <!--xls-07-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</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>

03 | 07版本的写入操作,本质就是对象的不同,其他方法是一样的!

注意:2003版本和2007版本存在兼容性问题!2003版本最多只有65535行!

03版本:

public void testWrite03() throws IOException {

    //1,创建一个工作簿
    Workbook workbook = new HSSFWorkbook();
    //2,创建一个工作表
    Sheet sheet = workbook.createSheet("测试表");
    //3,创建一行,默认从0开始,即表示第一行
    Row row = sheet.createRow(0);
    //4,创建一个单元格,(1,1)第一个单元格
    Cell cell1 = row.createCell(0);
    cell1.setCellValue("今日新增观众");
    //(1,2)
    Cell cell2 = row.createCell(1);
    cell2.setCellValue(666);

    //第二行
    Row row2 = sheet.createRow(1);
    //(2,1)
    Cell cell21 = row2.createCell(0);
    cell21.setCellValue("统计时间");
    //(2,2)
    Cell cell22 = row2.createCell(1);
    cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));

    //生成一张表(IO流)  03版就是使用xls结尾!
    FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite03.xls");
    //输出
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();

    System.out.println("文件生成完毕!");
}

07版本:

public void testWrite07() throws IOException {
    //1,创建一个工作簿
    Workbook workbook = new XSSFWorkbook();
    //2,创建一个工作表
    Sheet sheet = workbook.createSheet("测试表");
    //3,创建一行,默认从0开始,即表示第一行
    Row row = sheet.createRow(0);
    //4,创建一个单元格,(1,1)第一个单元格
    Cell cell1 = row.createCell(0);
    cell1.setCellValue("今日新增观众");
    //(1,2)
    Cell cell2 = row.createCell(1);
    cell2.setCellValue(666);

    //第二行
    Row row2 = sheet.createRow(1);
    //(2,1)
    Cell cell21 = row2.createCell(0);
    cell21.setCellValue("统计时间");
    //(2,2)
    Cell cell22 = row2.createCell(1);
    cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));

    //生成一张表(IO流)  07版就是使用xlsx结尾!
    FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07.xlsx");
    //输出
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();

    System.out.println("文件生成完毕!");
}

注意:1,对象的区别,2,文件的后缀!

大文件写入 HSSF

缺点:最多只能处理65536行,否则会抛出异常

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

优点:过程中写入换船,不操作磁盘,最后一次性写入磁盘,速度快

public void testWrite03BigData() throws IOException {
    //开始时间
    long begin = System.currentTimeMillis();
    //创建一个簿
    Workbook workbook = new HSSFWorkbook();
    //创建表
    Sheet sheet = workbook.createSheet();
    //写入数据
    for (int rowNum = 0; rowNum < 65537; rowNum++) {
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            Cell cell = row.createCell(cellNum);
            cell.setCellValue(cellNum);
        }
    }
    System.out.println("over");
    //创建输出流
    FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite03BigData.xls");
    //通过流的方式写入数据
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();
    //结束时间
    long end = System.currentTimeMillis();
    //输出时间差
    System.out.println((double) (end-begin)/1000);
}

业务中数据批量导入!

大文件写入XSSF

缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条数据

优点:可以写较大的数据量,比如20万条数据

public void testWrite07BigData() throws IOException {
    //开始时间
    long begin = System.currentTimeMillis();
    //创建一个簿
    Workbook workbook = new XSSFWorkbook();
    //创建表
    Sheet sheet = workbook.createSheet();
    //写入数据
    for (int rowNum = 0; rowNum < 100000; rowNum++) {
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            Cell cell = row.createCell(cellNum);
            cell.setCellValue(cellNum);
        }
    }
    System.out.println("over");
    //创建输出流
    FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigData.xlsx");
    //通过流的方式写入数据
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();
    //结束时间
    long end = System.currentTimeMillis();
    //输出时间差
    System.out.println((double) (end-begin)/1000);
}

大文件写入SXSSF

优点:可以写入非常大的数据量,如100万条数据甚至更多,写数据速度快,占用更少的内存

注意:

过程中会产生临时文件,需要清理临时文件

默认有100条记录被保存在内存中,如果超过这个数量,则最前面的数据被写入临时文件

如果想自定义内存中的数据的数量,可以使用 new SXSSFWorkbook(数量)

public void testWrite07BigDataS() throws IOException {
    //开始时间
    long begin = System.currentTimeMillis();
    //创建一个簿
    Workbook workbook = new SXSSFWorkbook();
    //创建表
    Sheet sheet = workbook.createSheet();
    //写入数据
    for (int rowNum = 0; rowNum < 100000; rowNum++) {
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            Cell cell = row.createCell(cellNum);
            cell.setCellValue(cellNum);
        }
    }
    System.out.println("over");
    //创建输出流
    FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite07BigDataS.xlsx");
    //通过流的方式写入数据
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();
    //清除临时文件
    ((SXSSFWorkbook)workbook).dispose();
    //结束时间
    long end = System.currentTimeMillis();
    //输出时间差
    System.out.println((double) (end-begin)/1000);
}

SXSSFWorkbook 来自官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分会被保存在内存中。

请注意,任然可能会消耗大量的内存,这些内存基于您正在使用的功能,例如合并区域,注释。。。仍然只存储在内存中,因此,如果广泛使用需要大量内存

学习自:BiliBili 狂神说Java

posted @ 2022-01-06 20:14  油条蘸豆浆  阅读(43)  评论(0)    收藏  举报