You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何读取Excel指定行与列的数据?Java代码实现求助

解决Excel指定行+特定列读取问题

我来帮你搞定这个Excel读取的问题!你要从指定行开始读取数据,并且只提取特定列的值,用Apache POI的话可以按照下面的思路调整你的代码:

核心思路

  • 明确起始行号:注意Apache POI中行索引是从0开始计数的,如果你要从第5行开始读,对应的索引就是4
  • 定义目标列集合:比如你要取第2列和第4列,对应的索引就是1和3(同样列也是0起始)
  • 遍历起始行之后的每一行,跳过空行,只提取目标列的单元格值

修正后的完整代码

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFCell;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class ReadExcel {
    private File src = new File("F:\\ucd\\UAT_Patch_31012018.xlsx");

    public void readExcelFromSpecifiedRowAndColumns() throws IOException {
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (FileInputStream fis = new FileInputStream(src);
             XSSFWorkbook wb = new XSSFWorkbook(fis)) {

            XSSFSheet sheet1 = wb.getSheetAt(0);
            if (sheet1 == null) {
                System.out.println("指定工作表不存在!");
                return;
            }

            // 1. 设置起始行号(比如从第3行开始读,索引为2)
            int startRowIndex = 2;
            // 2. 设置需要读取的特定列索引(比如第1列和第3列,索引为0和2)
            List<Integer> targetColumnIndices = Arrays.asList(0, 2);

            // 遍历从起始行到最后一行
            for (int rowNum = startRowIndex; rowNum <= sheet1.getLastRowNum(); rowNum++) {
                XSSFRow row = sheet1.getRow(rowNum);
                if (row == null) {
                    // 跳过空行
                    continue;
                }

                System.out.println("第" + (rowNum + 1) + "行数据:");
                // 遍历目标列,提取单元格值
                for (int colIndex : targetColumnIndices) {
                    XSSFCell cell = row.getCell(colIndex);
                    String cellValue = getCellValue(cell);
                    System.out.println("列" + (colIndex + 1) + "的值:" + cellValue);
                }
                System.out.println("------------------------");
            }
        }
    }

    // 统一处理不同类型的单元格值
    private String getCellValue(XSSFCell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                // 如果是数字类型,转成字符串避免科学计数法
                return String.valueOf(cell.getNumericCellValue());
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                // 可以根据需求处理公式结果
                return cell.getCellFormula();
            default:
                return "";
        }
    }

    public static void main(String[] args) {
        ReadExcel reader = new ReadExcel();
        try {
            reader.readExcelFromSpecifiedRowAndColumns();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键注意点

  • 索引计数问题:POI的行和列都是从0开始的,一定要对应好你实际要读取的行号和列号
  • 空行/空单元格处理:必须判断行和单元格是否为空,否则容易抛出NullPointerException
  • 单元格类型兼容:不同类型的单元格(字符串、数字、布尔值等)要统一处理,避免读取异常
  • 资源管理:使用try-with-resources语法自动关闭输入流和Workbook,防止资源泄漏

内容的提问来源于stack exchange,提问作者vivek bangare

火山引擎 最新活动