使用POI读取Excel表格中数据

系统管理员 2023-02-21 09:16 164阅读 0赞

使用POI读取Excel表格中数据

已经在 使用POI读取Excel表格中数据2优化。(https://blog.csdn.net/qq\_36570464/article/details/107053355)

https://blog.csdn.net/qq\_36570464/article/details/107053355

背景

自己最近在研究自动换测试,在进行参数化时候,会对把用例写在Excel表格中,然后通过Java来取表格中数据,进而进行参数化。

问题

那么,我们的表格可能回事这么一个情况:

在这里插入图片描述

表格中的单元格里出现没有输入的情况(图片中红色部分),如何通过POI进行读取,或者如何处理?预期结果不用考虑。

代码

只贴了获取表格中数据代码,其他不是本文内容。

  1. @DataProvider
  2. public Object[][] getParamExcel() throws IOException {
  3. File file = new File("/param.xlsx");
  4. XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));
  5. //获得表格中的第0个Sheet
  6. XSSFSheet sheet = workbook.getSheetAt(0);
  7. //得到有多少行
  8. int numberRows = sheet.getPhysicalNumberOfRows();
  9. //获得第一行有多少列
  10. int numberCells=sheet.getRow(0).getPhysicalNumberOfCells();
  11. //获得第一行第一列所在的位置
  12. int numberFirst = sheet.getRow(0).getFirstCellNum();
  13. //创建一个Object二维数组,用来作为参数返回。
  14. //因为第一行是说明,则跳过第一行,所以行数减一
  15. Object[][] data = new Object[numberRows - 1][];
  16. //创建一个保存列的对象
  17. XSSFRow row = null;
  18. // 因为第一行是说明,则跳过第一行,所以行数减一
  19. //sheet.getFirstRowNum() 获得第一行开始的位子,可能不从第一行开始(i=0)
  20. //numberRows - 1 表示除去第一行说明,实际数据有多少行
  21. for (int i = sheet.getFirstRowNum(); i < numberRows - 1; i++) {
  22. //得到第i+1行,即第二行的实际数据
  23. row = sheet.getRow(i + 1);
  24. // 创建一个字符数组,用来保存一行中,每一列的数据
  25. String[] strings = new String[numberCells];
  26. //row.getFirstCellNum() 获得一行中实际数据所在列,不一为第一列,如图第4行
  27. for (int j = numberFirst; j < numberCells; j++) {
  28. // 数据是通过key-value方式保存,遍历是会出现空指针异常(图中红色部分)。
  29. //出现的多余没有输入的单元格会出现异常,并对没有数据输入的单元格(红色部分)是进行空字符处理
  30. try {
  31. //设置为字符类型,这里主要是因为在获取Excel数据时,
  32. //数字出现小数点,主要用于不加小数点,可以简单这么理解。大家可以看一下源码就知道什么原因了
  33. row.getCell(j).setCellType(CellType.STRING);
  34. } catch (NullPointerException e) {
  35. //出现空指针异常,说明数据没有输入,即空数据,做空字符串处理
  36. strings[j] = "";
  37. //跳过当前循环
  38. continue;
  39. }
  40. // 保存数据
  41. strings[j] = row.getCell(j).getStringCellValue();
  42. }
  43. //把获得数据添加到data
  44. data[i] = strings;
  45. }
  46. return data;
  47. }

后言

当然,该方法不是一个很好的方法,有些还有些特殊情况处理不了。
如果你有什么改进或者更好的方法,欢迎留言。

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读