Java之如何读取Excel获取真实行数

 更新时间:2023年06月09日 09:59:53   作者:imadxu  
这篇文章主要介绍了Java之如何读取Excel获取真实行数问题,具有很好的参考价值,希望对大家有所帮助。

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();
        }
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的位运算符、移位运算详细介绍

    Java中的位运算符、移位运算详细介绍

    这篇文章主要介绍了Java中的位运算符、移位运算,有需要的朋友可以参考一下
    2013-12-12
  • Apache SkyWalking 修复TTL timer 失效bug详解

    Apache SkyWalking 修复TTL timer 失效bug详解

    这篇文章主要为大家介绍了Apache SkyWalking 修复TTL timer 失效bug详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • SpringBoot项目中resources文件读取实践

    SpringBoot项目中resources文件读取实践

    本文详细介绍了SpringBoot项目中读取resources目录下文件的9种主流方式,并提供了一个完整的控制器Demo示例,帮助开发者快速定位最适合的资源加载方案
    2026-01-01
  • JDBC实现Mysql自动重连机制的方法详解

    JDBC实现Mysql自动重连机制的方法详解

    最近在工作中发现了一个问题,通过查找相关的资料终于解决了,下面这篇文章主要给大家介绍了关于JDBC实现Mysql自动重连机制的相关资料,文中给出多种解决的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Spring boot中限制 Mybatis SQL日志的大字段输出问题

    Spring boot中限制 Mybatis SQL日志的大字段输出问题

    文章介绍Springboot中MyBatis SQL日志因大字段输出导致日志膨胀及JVM内存问题,建议通过Logback或Log4j2自定义Converter/Filter实现参数截断或脱敏,或调整日志级别限制调试信息,本文给大家介绍Spring boot中限制Mybatis SQL日志的大字段输出问题,感兴趣的朋友一起看看吧
    2025-10-10
  • Springboot工具类StringUtils使用教程

    Springboot工具类StringUtils使用教程

    这篇文章主要介绍了Springboot内置的工具类之StringUtils的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 你知道Tomcat安装之前为什么要安装JDK

    你知道Tomcat安装之前为什么要安装JDK

    这篇文章主要介绍了你知道Tomcat安装之前为什么要安装JDK吗?具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 使用IntelliJ IDEA查看类的继承关系图形(图文详解)

    使用IntelliJ IDEA查看类的继承关系图形(图文详解)

    这篇文章主要介绍了使用IntelliJ IDEA查看类的继承关系图形,本文通过图文并茂的形式给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Java实战之图书管理系统的实现

    Java实战之图书管理系统的实现

    这篇文章主要介绍了如何利用Java语言编写一个图书管理系统,文中采用的技术有Springboot、SpringMVC、MyBatis、ThymeLeaf 等,需要的可以参考一下
    2022-03-03
  • Java中指定时区的3种方法

    Java中指定时区的3种方法

    这篇文章主要介绍了Java中指定时区的3种方法,本文是一个JAVA项目和.NET项目通讯时遇到的问题,本文给出JAVA中的3种解决方法,需要的朋友可以参考下
    2015-02-02

最新评论