POI解析excel,解决有空行出现的问题

1 需要的依赖包

<dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>${poi.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>${poi.version}</version>
      </dependency>

2 解析方法

 /*
     * 根据excel文件格式获知excel版本信息
     */
    private fun getWorkbook(fs: InputStream, str: String): Workbook? {
        var book: Workbook? = null
        try {
            if ("xls" == str) {
                // 2003
                book = HSSFWorkbook(fs)
            } else {
                // 2007以上
                book = XSSFWorkbook(fs)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return book
    }
private fun getExcelContent(workbook: Workbook?, result: MutableMap<String, Any>): ArrayList<ExcelInfo> {
        // 获取工作薄第一张表
        val sheet = workbook!!.getSheetAt(0)
        // 获取第一行
        var row: Row? = sheet.getRow(0)
        // 获取有效单元格数
        val cellNum = row!!.physicalNumberOfCells
        // 表头集合
        val headList = ArrayList<String>()
        for (i in 0 until cellNum) {
            val cell = row.getCell(i)
            val data = cell.stringCellValue
            headList.add(data)
        }

        // 获得有效行数
        val rowNum = sheet.getPhysicalNumberOfRows()
        result.put("sum", rowNum - 1)
        val dataList = ArrayList<ExcelInfo>()
        val rowIterator = sheet.rowIterator()
        //去掉头部数据
        rowIterator.next()
        var data: ExcelInfo? = null
        for (i in 1 until rowNum) {
            //row = sheet.getRow(i);//如果有空行,Workbook读取excel数据为null
            row = rowIterator.next()
            if (row != null) {
                data = ExcelInfo()
                for (j in headList.indices) {
                    // 解析单元格
                    val cellData = getCellFormatValue(row!!.getCell(j)).toString()
                    // 根据字段给字段设值
                    saveCellDataToBean(headList, data, j, cellData)
                }
                dataList.add(data)
            }
        }
        return dataList
    }

3 碰到的问题

row = sheet.getRow(i);//如果有空行,Workbook读取excel数据为null

如果excel中有空行,通过sheet.getPhysicalNumberOfRows()方法可以获取到空行后的数据,但是如果使用sheet.getRow方法获取该行的数据时,空行后面的行数据为空。。。有人说是XSSFWorkbook这个类的问题,打断点明明看到有数据,但就是获取的时候为空,所以这里换了一种方法来获取数据。

val rowIterator = sheet.rowIterator()

数据是放在TreeMap里的,这里拿到它的迭代对象,通过next方法来获取数据。

4 测试结果

测试数据

在这里插入图片描述

测试结果

在这里插入图片描述

GitHub地址

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值