Java之如何读取Excel获取真实行数
作者:imadxu
Java读取Excel获取真实行数
刚进入公司开发,熟悉环境是个很大的难题,今天就接到了一个任务,让我修改批量上传excel文件的页面.
公司采用的是apache提供的包,通过XML文件的映射,把EXCEL表和我们的Model对应起来.本来是校验正确的,结果莫名其妙到后面就会报空指针异常.
问题的原因:在没有格式的前提下,getLastRowNum方法能够正确返回最后一行的位置;getPhysicalNumberOfRows方法能够正确返回物理的行数;
* 在有格式的前提下,这两个方法都是不合理的;
* 所以,在做导入excel的时候,建议想要正确获取行数,可以做一个人为的约定,比如约定导入文件第一列不允许为空,行数就按照第一列的有效行数来统计;这样就能正确获取到实际想要的行数;
更新版本,因为发现有时候 存在了加了样式的边框,边框的属性默认成为了 公式属性,导致后面空指针,现已修复
修改版
/** * 用来得到真实行数 * @param sheet * @param flag 需要写进数据库的列数用逗号隔开 比如 (Sheet sheet,int 2,int 3);随意个 * @return * */ public static int findRealRows(Sheet sheet, int... flag) { int row_real = 0; int rows = sheet.getPhysicalNumberOfRows();// 此处物理行数统计有错误, int size = flag.length; try { for (int i = 1; i < rows; i++) { Row row = sheet.getRow(i); int total = 0; ArrayList<Integer> blank =new ArrayList<Integer>(); int type=-1; String s = null; for(int j:flag){ if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){ type=row.getCell(j).getCellType(); row.getCell(j).setCellType(1); } if (row.getCell(j) == null||row.getCell(j).getStringCellValue().matches("^\\s+$")||row.getCell(j).getCellType()>2) { total++; if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){ row.getCell(j).setCellType(type); } blank.add(j); } } System.out.println(s+"我"); // 如果4列都是空说明就该返回 if (total == flag.length) { return row_real; } else if (total == 0) { row_real++; } else { String h=""; for(Integer b:blank){ h=h+"第"+(b+1)+"列"+" "; } throw new BusinessException("第" + (i + 1) + "行" + h + "不能为空"); } } } catch (NullPointerException e) { throw new BusinessException("excel格式异常,请检查excel格式有无数据缺失,无效数据行!"); } return row_real; }
方法都这样,通过约定一个有的ID来进行判断,可以较快的得到真实的行数 ,以至于后面的集合循环输出的话不会出现空指针异常
Java读取excel数据
导入相关的MAVEN依赖。
<!--excel的依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency>
Java代码
使用说明:
1、XSSFWorkbook是整个操作excel文件需要用到的对象。构造时,参数是一个FileInputStream对象,里面写上文件的地址。
2、getNumberOfSheets()获取拥有的sheet总页数。
3、getSheetAt(number)操作第几个工作簿,参数是第几个sheet表。此处的参数索引是从0开始。返回值是一个工作簿对象XSSFSheet,用于操作这个工作簿。
4、工作簿对象.getLastRowNum()。获取该工作簿一共有多少列。
5、getRow(row_num).getLastCellNum().获取改行共有多少列。此处行和列的下标都是从1开始的。
6、getRow(row).getCell(rol)。获取改行该列的元素。
public static void excelFind() { try { XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("src/test/java/postSQL/database/test.xlsx")); //获取工作簿下sheet的个数 int sheetNum = xssfWorkbook.getNumberOfSheets(); System.out.println("总数页码:"+sheetNum); //遍历页码: for(int i = 0;i<sheetNum;i++) { System.out.println("读取第"+(i+1)+"个sheet"); //sheet的索引下标是从0开始的,得到该页码的对象 XSSFSheet sheet = xssfWorkbook.getSheetAt(i); //获取总共的行数 int maxRow = sheet.getLastRowNum(); //对每一行进行遍历 for (int row = 0; row <= maxRow; row++) { //getRow(row_num)获取改行的对象,再.getLastCellNum()获取该行共有几列 //此处与sheet不同的是,该索引下标是从1开始的 int maxRol = sheet.getRow(row).getLastCellNum(); System.out.println("--------第" + row + "行的数据如下--------"); //遍历列数 for (int rol = 0; rol < maxRol; rol++){ //sheets.getRow(1).getCell(1);获取元素值 System.out.print(sheet.getRow(row).getCell(rol) + " "); } System.out.println(); } } } catch (IOException e) { e.printStackTrace(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。