解决Excel文件读取遇到值为null单元格会自动跳过的情况

本文介绍了两种解决Java在读取Excel文件时遇到null单元格自动跳过的方法,包括使用Excel4J库和Apache POI-OOXML库的处理策略。

第一种方法:使用Excel4J依赖

<dependency>
    <groupId>com.github.crab2died</groupId>
    <artifactId>Excel4J</artifactId>
    <version>3.0.0</version>
</dependency>
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class demo {

    public static void main(String[] args){
        String filePath="F:\\cs.xlsx";
        String sheetName="Sheet1";
        List<List<String>> list=getExcelData(filePath,sheetName);
        System.out.println(list.size());
    }

    private static List<List<String>> getExcelData(String filePath,String sheetName){
        List<List<String>> list=new ArrayList<>();
        FileInputStream fileInputStream=null;
        try {
            fileInputStream = new FileInputStream(filePath);
            XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
            //获取当前sheet
            XSSFSheet sheet = sheets.getSheet(sheetName);
            //获取当前sheet的行数
            int rows = sheet.getPhysicalNumberOfRows();
            for(int i=1;i<rows;i++){
                List<String> stringList=new ArrayList<>();
                //获取第几行
                XSSFRow row = sheet.getRow(i);
                //获取当前行的最后一个单元格的位置,从0开始
                int columns = row.getLastCellNum();
                for(int j=0;j<columns;j++){
                    if(row.getCell(j)==null||"".equals(row.getCell(j).toString())){//单元格不存在值
                        stringList.add("");
                    }else {//单元格存在值
                        stringList.add(row.getCell(j).toString());
                    }
                }
                list.add(stringList);
            }
        } catch (Exception e) {
            log.error("读取excel文件出现异常:",e);
        }finally {
            try{
                if(fileInputStream!=null){
                    fileInputStream.close();
                }
            }catch (Exception e){
                log.error("关闭文件流出现了异常:",e);
            }
        }
        return list;
    }
}

第二种:使用apache poi-ooxml依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

public class demo {

    public static void main(String[] args){
        String filePath="F:\\cs.xlsx";
        List<List<String>> list=getExcelData(filePath);
        System.out.println(list.toString());
        System.out.println(list.size());
    }

    private static List<List<String>> getExcelData(String filePath){
        List<List<String>> list=new ArrayList<>();
        FileInputStream fileInputStream=null;
        try {
            fileInputStream = new FileInputStream(filePath);

            //获取excel文件流
            Workbook workbook = WorkbookFactory.create(fileInputStream);
            //获取sheet
            Sheet sheet = workbook.getSheetAt(0);
            //获取当前sheet的行数
            int rows = sheet.getPhysicalNumberOfRows();
            for(int i=1;i<rows;i++){
                List<String> stringList=new ArrayList<>();
                //获取第几行
                Row row = sheet.getRow(i);
                //获取当前行的最后一个单元格的位置,从0开始
                int columns = row.getLastCellNum();
                for(int j=0;j<columns;j++){
                    if(row.getCell(j)==null||"".equals(row.getCell(j).toString())){//单元格不存在值
                        stringList.add("");
                    }else {//单元格存在值
                        stringList.add(row.getCell(j).toString());
                    }
                }
                list.add(stringList);
            }
        } catch (Exception e) {
            System.out.println("读取excel文件出现异常:"+e);
        }finally {
            try{
                if(fileInputStream!=null){
                    fileInputStream.close();
                }
            }catch (Exception e){
                System.out.println("关闭文件流出现了异常:"+e);
            }
        }
        return list;
    }
}
在使用Java的Hutool库读取Excel文件时,如果第一行有空单元格,可能会出现读取到字母的情况。这是因为Hutool库在读取Excel时,默认会按照列索引进行读取,而空单元格会导致索引偏移,从而读取到意外的字母。 为了解决这个问题,可以通过以下几种方法进行处理: 1. **忽略空单元格**:在读取Excel时,手动检查每个单元格是否为空,如果为空则跳过。 2. **填充空单元格**:在读取Excel时,将空单元格填充为一个默认,例如空字符串。 3. **使用列名映射**:如果Excel文件表头,可以使用表头作为列名进行映射,而不是依赖索引。 以下是一个示例代码,展示了如何使用Hutool库读取Excel并处理空单元格: ```java import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import java.util.List; import java.util.Map; public class ExcelReadExample { public static void main(String[] args) { // 读取Excel文件 ExcelReader reader = ExcelUtil.getReader("path/to/your/excel.xlsx"); // 获取表头 List<String> header = reader.readHeader(); // 读取数据 List<Map<String, Object>> data = reader.readAll(); // 处理数据 for (Map<String, Object> row : data) { for (String column : header) { Object value = row.get(column); if (value == null) { // 处理空单元格 System.out.print("NULL "); } else { System.out.print(value.toString() + " "); } } System.out.println(); } // 关闭读取器 reader.close(); } } ``` 在这个示例中,我们首先读取Excel文件表头,然后读取所有数据行。对于每一行数据,我们通过表头进行映射,并检查每个单元格是否为空。如果为空,则打印出"NULL",否则打印出单元格
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值