Java向指定Excel写入读取数据

今天在开发中遇到用户列表导入导出的功能实现,这里了解到使用POI函数库可以完成此任务!特此记录一下

POI

Apache POI是Apache软件基金会开放的源码函数库,POI提供API给Java程序对Office格式文档读和写的功能。

  • HSSF:提供读写Excel格式档案的功能。Excel2003
  • XSSF:提供读写OOXML格式档案的功能。Excel2007
  • HWPF:提供读写Word文档的功能。
  • HSLF:提供读写PPT的功能。
  • HDGF:提供读写Visio格式档案的功能。

上面提及到的五个对象分别操作不同文件。
这里只测试了Excel读写相关,剩下的只需要修改文件后缀名和指定对象即可。

相关依赖

创建完项目后,首先需要引入POI的相关依赖。

 <dependencies>
        <!-- xls -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <!-- xlsx -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

将数据保存到Excel2003

步骤
1、创建workbook对象,workbook是接口,实现类指定要操作的对象,例如要操作的文件是Excel2003就创建的是HSSFWorkbook,如果操作的是Excel2007那就创建XSSFWorkbook

2、创建Sheet对象,Sheet具体指的就是哪张表
在这里插入图片描述
3、创建Row,指明要将写入的数据放在第几行
4、创建Cell,指明将数据写在第几列,也就是第几个单元格
5、最后创建输出流,将内存中的数据持久化

/**
     * 向Excel2003版本中写入数据
     */
    @Test
    public void writeTest03() throws IOException {

        //1、创建Workbook
        Workbook workbook = new HSSFWorkbook();
        //2、创建sheet,默认名字是sheet1,sheet2...
        Sheet sheet = workbook.createSheet("会员列表");
        //3、创建row 参数是0代表第1行,参数是1代表第二行...
        Row row1 = sheet.createRow(0);
        //4、创建cell 第0列
        Cell cell = row1.createCell(0);
        //5、在cell中填充数据
        cell.setCellValue("datao");
        //6、向文件中写入数据,以上步骤都是在内存中完成的,想要将文件持久化到磁盘需要文件输出流
        FileOutputStream outputStream = new FileOutputStream("E:\\1.xls");
        workbook.write(outputStream);
        //7、关闭流
        outputStream.close();

    }

在这里插入图片描述

将数据保存在Excel2007

步骤和上面的基本一样,只是workbook的实现类不同,保存的文件名后缀不同。

public void writeTest07() throws IOException {

        //1、创建Workbook
        Workbook workbook = new XSSFWorkbook();
        //2、创建sheet,默认名字是sheet1,sheet2...
        Sheet sheet = workbook.createSheet("用户列表");
        //3、创建row 参数是0代表第1行,参数是1代表第二行...
        Row row1 = sheet.createRow(0);
        //4、创建cell 第0列
        Cell cell = row1.createCell(0);
        //5、在cell中填充数据
        cell.setCellValue("贝姐");
        //6、向文件中写入数据,以上步骤都是在内存中完成的,想要将文件持久化到磁盘需要文件输出流,注意保存到文件的后缀名,03版本的Excel文件是以.xls结尾
        //excel2007版本是以.xlsx结尾
        FileOutputStream outputStream = new FileOutputStream("E:\\2.xlsx");
        workbook.write(outputStream);
        //7、关闭流
        outputStream.close();
    }

在这里插入图片描述
在这里插入图片描述

写入大文件

  • 使用HSSFWorkbook写入数据有个缺点就是写入的数据是有限的,最大不能超过65535行,超过会写不进去,抛出异常,java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
    他是先将内存中的数据一次性写入磁盘。

  • 如果使用XSSFWorkbook写入大数据时,虽然不会报错,但是他写入速度很慢。(当写入100万行数据时内存才会溢出)

  • 如果写入大文件,推荐使用SXSSFWorkbook,它可以写入100万条数据以上,并且写入速度很快,分段写入。
    SXSSFWorkbook官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。
    请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释…仍然只存储在内存中,因此如果广泛使用,可能需要大量内存。

从Excel中读取

  1. 创建文件输出入流
  2. 创建workbook构造参数传入输入流
  3. 读取指定的sheet
  4. 根据sheet读取行
  5. 根据行读取单元格
  6. 输出结果
  7. 关闭输入流
//从Excel中读取值,并输出
    @Test
    public void read03Test() throws IOException {
        //1、创建输入流,指定要读取的文件
        InputStream inputStream = new FileInputStream("E:\\1.xls");
        //2、创建workbook将输入流传过去
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
        //3、指定读取的sheet
        HSSFSheet sheet = hssfWorkbook.getSheet("会员列表");
        //4、获取指定行
        HSSFRow row = sheet.getRow(0);
        //5、获取指定cell
        HSSFCell cell = row.getCell(0);
        //6、从cell中也就是单元格中获取数据
        String cellValue = cell.getStringCellValue();
        //输出结果
        System.out.println(cellValue);
        //关闭输入流
        inputStream.close();
    }

在这里插入图片描述

posted @ 2020-10-28 21:28  起个名字都这么男  阅读(812)  评论(0编辑  收藏  举报