在没有格式的前提下,

    • 使用getLastRowNum方法能够正确返回最后一行的位置;
    • 使用getPhysicalNumberOfRows方法能够正确返回物理的行数

    但是一般上传的表格中存在格式,所以需要读取每个行列中的数据进行判断

    1. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    2. import org.apache.poi.ss.usermodel.*;
    3. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    4. import java.io.File;
    5. import java.io.FileInputStream;
    6. import java.io.IOException;
    7. import java.text.SimpleDateFormat;
    8. public class ReadExcelTest {
    9. /**
    10. * 用来判断每一列中的数据类型
    11. * @param cell 需要读取的列
    12. * @return
    13. *
    14. */
    15. public static String getValue(Cell cell){
    16. String cellValue = "";
    17. switch (cell.getCellType()) {
    18. case Cell.CELL_TYPE_STRING:
    19. cellValue = cell.getStringCellValue();
    20. break;
    21. case Cell.CELL_TYPE_BOOLEAN:
    22. cellValue = String.valueOf(cell.getBooleanCellValue());
    23. break;
    24. case Cell.CELL_TYPE_NUMERIC:
    25. if (DateUtil.isCellDateFormatted(cell)) {
    26. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    27. cellValue = sdf.format(cell.getDateCellValue());
    28. }else{
    29. DataFormatter dataFormatter = new DataFormatter();
    30. cellValue = dataFormatter.formatCellValue(cell);
    31. }
    32. break;
    33. default:
    34. cellValue = "";
    35. break;
    36. }
    37. return cellValue;
    38. }
    39. /**
    40. * 用来得到真实行数
    41. * @param sheet 需要读取的Excel表格(excel文件的工作簿的名称)
    42. * @return
    43. *
    44. */
    45. public static int readExcelValueRows(Sheet sheet) {
    46. int realRow = 0;// 返回的真实行数
    47. for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    48. //i从1开始,不判断第一行标题行
    49. Row row = sheet.getRow(i);
    50. if (row == null){
    51. continue;
    52. }
    53. for (Cell cell : row) {
    54. if (cell == null){
    55. continue;
    56. }
    57. String value = getValue(cell).trim();
    58. if (value == null || "".equals(value)){
    59. continue;
    60. } else{
    61. realRow++;
    62. break;
    63. }
    64. }
    65. }
    66. return realRow;
    67. }
    68. /**
    69. * 获取excel表格的真实行数
    70. * @param sheet excel文件的工作簿的名称
    71. * @return
    72. */
    73. public static int getExcelRealRow(Sheet sheet) {
    74. boolean flag = false;
    75. for (int i = 1; i <= sheet.getLastRowNum(); ) {
    76. Row r = sheet.getRow(i);
    77. if (r == null) {
    78. // 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动
    79. sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
    80. continue;
    81. }
    82. flag = false;
    83. for (Cell c : r) {
    84. if (c.getCellType() != Cell.CELL_TYPE_BLANK) {
    85. flag = true;
    86. break;
    87. }
    88. }
    89. if (flag) {
    90. i++;
    91. continue;
    92. } else {
    93. // 如果是空白行(即可能没有数据,但是有一定格式)
    94. if (i == sheet.getLastRowNum())// 如果到了最后一行,直接将那一行remove掉
    95. sheet.removeRow(r);
    96. else//如果还没到最后一行,则数据往上移一行
    97. sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
    98. }
    99. }
    100. return sheet.getLastRowNum();
    101. }
    102. public static void main(String[] args) throws IOException {
    103. File file = new File("D:\\test.xlsx");
    104. String fileName = file.getName();
    105. Workbook workbook = null;
    106. FileInputStream fileInputStream = new FileInputStream(file);
    107. // excel类型
    108. if (fileName.endsWith(".xls")) {
    109. workbook = new HSSFWorkbook(fileInputStream);
    110. } else if (fileName.endsWith(".xlsx")) {
    111. workbook = new XSSFWorkbook(fileInputStream);
    112. }
    113. Sheet sheet1 = workbook.getSheet("sheet1"); // excel文件的工作簿的名称
    114. Sheet sheet2 = workbook.getSheet("sheet2"); // excel文件的工作簿的名称
    115. // 不作处理时获取的行数
    116. int lastRowNum1 = sheet1.getLastRowNum();
    117. // 获取物理行数
    118. int rows = sheet1.getPhysicalNumberOfRows();
    119. // 获取Excel工作簿的真实行数(非空行,即有数据的行)
    120. int lastRowNum2 = readExcelValueRows(sheet1);
    121. int lastRowNum3 = getExcelRealRow(sheet1);
    122. System.out.println("************sheet1**************");
    123. System.out.println("rows:" + rows);
    124. System.out.println("lastRowNum1:" + lastRowNum1);
    125. System.out.println("lastRowNum2:" + lastRowNum2);
    126. System.out.println("lastRowNum3:" + lastRowNum3);
    127. System.out.println("************sheet2**************");
    128. System.out.println("lastRowNum4:" + sheet2.getPhysicalNumberOfRows());
    129. System.out.println("lastRowNum5:" + sheet2.getLastRowNum());
    130. System.out.println("lastRowNum6:" + readExcelValueRows(sheet2));
    131. System.out.println("lastRowNum7:" + getExcelRealRow(sheet2));
    132. }
    133. }

    sheet1:
    image.png
    sheet2:
    image.png

    ************sheet1************** rows:11 # sheet1的物理行数 lastRowNum1:10 lastRowNum2:10 lastRowNum3:10 ************sheet2************** lastRowNum4:13 # sheet1的物理行数 lastRowNum5:14 # 未忽略空白行 lastRowNum6:12 lastRowNum7:12