POI:对Excel的基本写操作 整理1

首先导入相关依赖

XML 复制代码
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <!--xls(03)-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>5.2.2</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <!--xlsx(07)-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.2</version>
    </dependency>

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

    <!--测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>

1 写入简单的数据

java 复制代码
public class ExcelWrite {

    String PATH = "D:\\Idea-projects\\POI\\POI_projects";

    // 以下是相应的写入操作方法
    // ......
}

(1)当向03版本的Excel中写入数据

java 复制代码
    @Test
    public void testWrite03() throws IOException {
//        1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();

//        2.创建一个工作表
        Sheet sheet = workbook.createSheet("xx");

//        3.创建一行
        Row row = sheet.createRow(0);
//        4.创建一个单元格
        Cell cell1 = row.createCell(0);
        cell1.setCellValue("今日新增观众");

        Cell cell2 = row.createCell(1);
        cell2.setCellValue(666);


//        创建第二行(2,1)
        Row row2 = sheet.createRow(1);
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");

//        (2,2)
        Cell cell22 = row2.createCell(1);
        String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell22.setCellValue(time);


//        5. 生成一张表 (IO 流)   03版本就是使用xls结尾

        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xx03.xls");

        workbook.write(fileOutputStream);

//        6.关闭流
        fileOutputStream.close();

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

(2)当向07版本的Excel中写入数据

java 复制代码
    @Test
    public void testWrite07() throws IOException {
//        1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();

//        2.创建一个工作表
        Sheet sheet = workbook.createSheet("xiexu1");

//        3.创建一行
        Row row = sheet.createRow(0);
//        4.创建一个单元格
        Cell cell1 = row.createCell(0);
        cell1.setCellValue("今日新增观众");

        Cell cell2 = row.createCell(1);
        cell2.setCellValue(666);


//        创建第二行(2,1)
        Row row2 = sheet.createRow(1);
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");

//        (2,2)
        Cell cell22 = row2.createCell(1);
        String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell22.setCellValue(time);


//        5. 生成一张表(IO 流)   03版本就是使用xlsx结尾
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "xiexu07.xlsx");

        workbook.write(fileOutputStream);

//        6.关闭流
        fileOutputStream.close();

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

    }

2 写入大量的数据

(1)当向03版本的Excel中写入****大量数据
缺点: 最多只能处理65536行,否则会抛出异常;

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

java 复制代码
    @Test
    public void testWriteBigData03() throws IOException {
        // 计算时间差
        long beginTime = System.currentTimeMillis();
        // 1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();

        // 2.创建一个工作表
        Sheet sheet = workbook.createSheet("xiexu2");

        // 3. 写入数据  (03版最多只能放65536行, 超出会报异常)
        for (int rowNum = 0 ; rowNum < 65536; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }

        System.out.println("写入完成!");
        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "bigData03.xls");
        workbook.write(fileOutputStream);

        fileOutputStream.close();

        long endTime = System.currentTimeMillis();

        System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒
    }

1.129s 还是非常快的


只能写入65536行,超出会报异常


(2)当向07版本的Excel中写入****大量数据
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条数据时;

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

java 复制代码
    @Test
    public void testWriteBigData07() throws IOException {   // 耗时长
        // 计算时间差
        long beginTime = System.currentTimeMillis();
        // 1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();

        // 2.创建一个工作表
        Sheet sheet = workbook.createSheet("xiexu3");

        // 3. 写入数据
        for (int rowNum = 0 ; rowNum < 65538; rowNum++) {   // ? 65538
            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 + "bigData07.xlsx");
        workbook.write(fileOutputStream);

        fileOutputStream.close();

        long endTime = System.currentTimeMillis();
        System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒
    }

耗时4.812s, 相比于03版本,是非常慢的


可以写入超出65536行的数据

**(3)因为07版本写入大量数据时的速度较慢,所以我们可以用07的加速版的做法:**SXSSFWorkbork()
优点:可以写非常大的数据量,如100万条甚至更多,写入数据速度快,占用更少的内存;

注意**:过程中会产生临时文件,需要清理临时文件(默认有100条记录被保存在内存中,如果超出了这个数量,则最前面的数据被写入临时文件,如果想自定义内存中数据的数量,可以使用 new SXSSFWorkbook(自定义的数量值) )**

java 复制代码
    @Test
    public void testWriteBigData07quick() throws IOException {   // SXSSF 更快
        // 计算时间差
        long beginTime = System.currentTimeMillis();
        // 1.创建一个工作簿
        Workbook workbook = new SXSSFWorkbook();

        // 2.创建一个工作表
        Sheet sheet = workbook.createSheet("xiexu4");

        // 3. 写入数据
        for (int rowNum = 0 ; rowNum < 65538; rowNum++) {   // ? 65538
            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 + "bigData07quick.xlsx");
        workbook.write(fileOutputStream);

        fileOutputStream.close();
        ((SXSSFWorkbook) workbook).dispose();    // 清除临时文件
        long endTime = System.currentTimeMillis();
        System.out.println((double) (endTime - beginTime) / 1000);  // 毫秒转换为秒
    }

现在是1.667s相比于之前,还是非常快的

相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ11 分钟前
idea 弹窗 delete remote branch origin/develop-deploy
java·elasticsearch·intellij-idea
Code成立13 分钟前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
鸽鸽程序猿38 分钟前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法
遇见你真好。1 小时前
自定义注解进行数据脱敏
java·springboot
NMBG221 小时前
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
java·开发语言·面试·java-ee·intellij-idea
像污秽一样1 小时前
Spring MVC初探
java·spring·mvc
计算机-秋大田1 小时前
基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
LuckyLay1 小时前
Spring学习笔记_36——@RequestMapping
java·spring boot·笔记·spring·mapping
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
阿维的博客日记2 小时前
java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
java·jvm