使用POI将java数据导入导出为excel文档(.xls .xlsx)

前言:在我们的工作当中,时常会有将Excel文档进行导入导出的操作,针对于此项需求,有很多的处理方法。而我们今天就讲一下其中最为常用的POI。

1.POI介绍

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

2.Excel介绍

Excel文档有两种格式,分别是

  • 03版的excel,文件后缀为.xls (最多能容纳65536行数据)
  • 07版的excel,文件后缀为.xlsx(最多能容纳1048576行数据)

3.导入依赖

导入poi依赖,可以根据需求导入相对应的依赖。
poi可以操作03版的excel,后缀为.xls
poi-ooxml可以操作07版的excel,后缀为.xlsx

	<!--03版excel  后缀为.xls-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

    <!--07版excel  后缀为.xlsx-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.14</version>
    </dependency>

4.认识类与方法

  • HSSFWorkbook:一般用于操作03版以前的excel(包括03版excel),扩展名是.xls。
  • XSSFWorkbook:一般用于操作07版excel及以上的版本,扩展名是.xlsx。
  • SXSSFWorkbook(POI 3.8+版本):一般用于大数据量的导出。比如数据量超过5000条即可考虑这种工作表

这三个类可以根据需求来进行选择。
下面介绍一下三个类共有的方法。了解了这些方法,就可以更加快捷的去导入导出Excel

  //获取工作薄
 Workbook workbook=new HSSFWorkbook();
  //获取工作表
  Sheet sheet = workbook.createSheet();
  //生成第一行 参数为行的下标,下标从0开始
  Row row = sheet.createRow(0);
  //生成第一列 参数为列的下标,下标从0开始
  Cell cell1 = row.createCell(0);
  //给第一行第一列的单元格赋值
  cell1.setCellValue("姓名");
  //输出流导出文档
  FileOutputStream fileOutputStream = new FileOutputStream(new File(PATH + "hhh.xls"));
   workbook.write(fileOutputStream);
//读取excel文档 生成工作薄对象
FileInputStream fileInputStream = new FileInputStream(new File("D:\\Users\\idea\\test\\lilun\\excel\\srchhh.xls"));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);
//读取第一个工作表  参数为工作表下标 下标从0开始
HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
//读取工作表第一行数据  参数为行下标 下标从0开始
HSSFRow row = sheetAt.getRow(0);
//一行有几列 返回列数
int num = row.getPhysicalNumberOfCells();
//根据行取对应的列  获取单元格  参数为行下标 下标从0开始
HSSFCell cell = row.getCell(0);
//获取单元格的数据类型 返回值是一个int类型
int cellType = cell.getCellType();

获取类型后就可以进行判断
CELL_TYPE_NUMERIC 数值型 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5
根据数据类型的不同采用不同的方法获取单元格内的值

//判断单元格数据类型
  switch (cellType){
   
      case 0:
          //单元格返回double类型
          double numericCellValue = cell.getNumericCellValue();
          break;
      case 1:
          //单元格返回string字符串类型
          String stringCellValue = cell.getStringCellValue();
          break;
      case 2:
          //单元格返回公式
          String cellFormula = cell.getCellFormula();
          break;
      case 3:
          //单元格为空
          break;
      case 4:
          //单元格返回boolean类型
          boolean booleanCellValue = cell.getBooleanCellValue();
          break;
      case 5:
          //单元格返回错误
          byte errorCellValue = cell.getErrorCellValue();
          break;
          default:
              break;
  }

5.读取Excel的方法

/**
     * 读取Excel文档
     * @throws IOException
     */
    @Test
    public void inExcel() throws IOException {
   

        //读取excel文档 生成工作薄对象
        FileInputStream fileInputStream = new FileInputStream(new File("D:\\Users\\idea\\test\\lilun\\excel\\srchhh.xls"));
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);

        //读取第一个工作表  参数为工作表下标 下标从0开始
        HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
        //读取工作表第一行数据  参数为行下标 下标从0开始
        HSSFRow row = sheetAt.getRow(0);

        if(row!=null){
   
            //一行有几列 返回列数
            int num = row.getPhysicalNumberOfCells();
            for (int i=0;i<num;i++){
   
                //根据行取对应的列  获取单元格  参数为行下标 下标从0开始
                HSSFCell cell = row.getCell(i);
               if(cell!=null){
   
                   //获取单元格的数据类型
                   int cellType = cell.getCellType();
                   //判断单元格数据类型
                   switch (cellType){
   
                       case 0:
                           //单元格返回double类型
                           double numericCellValue = cell.getNumericCellValue();
                           break;
                       case 1:
                           
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值