Java使用POI实现对Execl表格进行数据读取

  最近因为项目需要从文档读取数据进行存储,因此花了点时间对这个知识点进行了一些学习和总结,通过自己的学习使用心得,希望对大家有所帮助。关于POI的介绍,网上有很多大牛都介绍的很详细,读者有时间可以去看看,这里我只做应用层面的说明,帮助你快速掌握使用。

1.在原项目架构基础上导入以下所需maven配置。(非maven项目请自行下载jar包)

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

2.读取表格实现方法

public void addDataByExeclImport(MultipartFile file) throws Exception {
    if (file.exists()) {     //判断文件是否存在  
        String[] split = file.getOriginalFilename().split("\\.");  //获取文件的后缀名,"."是特殊字符,需要转化
        Workbook wb;  //定义文档对象
        InputStream is = file.getInputStream();  
        if ("xls".equals(split[1])) {   //xls,xlsx对文档对象的实现方式是不同的,需要不同对待
            wb= new HSSFWorkbook(is);  
        }else if ("xlsx".equals(split[1])){
            wb = new XSSFWorkbook(is);
        }else {
            System.out.println("文件类型错误");
            return null;
        }
        Sheet sheet = wb.getSheetAt(0);  //开始解析工作表(说明1,见后文)
        int firstRowNum = sheet.getFirstRowNum(); //获取当前表格的第一行
        int lastRowNum = sheet.getLastRowNum();   //获取当前表格的最后一行(说明2,见后文)
        //遍历数据集
        for (int rIndex = firstRowNum; rIndex <= lastRowNum; rIndex++) {
            Row row = sheet.getRow(rIndex); // 获取当前行数据
            if (row != null) {
                int firstCellNum = row.getFirstCellNum(); //当前行的第一列
                int lastCellNum = row.getLastCellNum();   //当前行的最后一列(说明3,见后文)
                for (int cIndex = firstCellNum; cIndex < lastCellNum; cIndex++) {
                    row.getCell(cIndex).setCellType(Cell.CELL_TYPE_STRING); //设置列值类型,基本都为STRING型没问题
                    String value = row.getCell(cIndex).getStringCellValue(); //获取列值
                    System.out.println(value); //打印测试值
                }
             }
        }
     }
}

说明:

1.工作表:下面Sheet1,Sheet2...就是工作表,在方法里下标是从0开始的,如果你只有一个sheet,就选0读取当前工作表内容。

2.所谓最后一行,就是指数据不为空的最后一行。如图第6行是最后一行,哪怕只有1个值,空值第7行才不算进行数里。

3.最后一列概念如说明2。

特别说明:

如果数据存在合并单元格的情况,如下图取值需要注意。当按照行遍历数据的时候,第一行按照列读取数据是正常的,也就是第1行在读取B列的时候,会取到值为2,读B列的时候则为4。但是从第2行开始,往下所有在读取B,D两列的时候值为" ",这就需要自己根据需求处理。

      以上就是关于POI对表格的基本操作,当然更复杂的操作还可以看POI文档。关于读取之后的操作大家根据自身需要来处理,就不扩展说了,希望以上内容能够对读者快速实现相关功能有所帮助。

 

android 使用poi读取高版本excel, 解决以下这两个错误 java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory; at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:141) at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149) javax.xml.stream.FactoryConfigurationError: Provider com.sun.xml.internal.stream.events.XMLEventFactoryImpl not found at javax.xml.stream.FactoryFinder.newInstance(Unknown Source) at javax.xml.stream.FactoryFinder.newInstance(Unknown Source) at javax.xml.stream.FactoryFinder.find(Unknown Source) at javax.xml.stream.FactoryFinder.find(Unknown Source) at javax.xml.stream.XMLEventFactory.newInstance(Unknown Source) at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:141) at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值