zoukankan      html  css  js  c++  java
  • 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();
        }
    

    在这里插入图片描述

  • 相关阅读:
    方维分享系统模板修改,book_share_list.htm调用用户数据,$_FANWE['user']的数据
    方维分享系统修改会员的积分设置
    方维分享系统二次开发,tip.htm,修改调用的当前用户的信息
    方维分享系统模板修改,删除操作增加提示
    模拟器分辨率
    android自定义menu,PopUpWindow弹出菜单
    Android popupWindow响应back按键并关闭
    Android开发技巧:ViewStub惰性装载
    android动态全屏切换
    Android程序对不同手机屏幕分辨率自适应的总结
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121838.html
Copyright © 2011-2022 走看看