You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI筛选含局部命名范围"section1"的Excel工作表?

实现方案

Apache POI 中Name对象本身携带命名范围的所属工作表标识,局部命名范围的getSheetIndex()方法会返回对应工作表的索引,全局命名范围的该方法返回-1,通过这个特性即可完成筛选。

示例代码

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

public class ReadLocalNamedRange {
    public static void main(String[] args) throws Exception {
        // 加载目标XLSX文件
        FileInputStream fis = new FileInputStream("你的文件路径.xlsx");
        Workbook workbook = new XSSFWorkbook(fis);
        // 存储符合条件的工作表
        List<Sheet> targetSheets = new ArrayList<>();

        // 遍历全工作簿所有命名范围
        int nameCount = workbook.getNumberOfNames();
        for (int i = 0; i < nameCount; i++) {
            Name name = workbook.getNameAt(i);
            // 筛选条件:名称为section1 + 是局部命名范围(sheetIndex不为-1)
            if ("section1".equals(name.getNameName()) && name.getSheetIndex() != -1) {
                Sheet sheet = workbook.getSheetAt(name.getSheetIndex());
                targetSheets.add(sheet);
            }
        }

        // 遍历符合条件的工作表,读取section1范围内容
        for (Sheet sheet : targetSheets) {
            // 直接获取当前工作表下的section1局部命名范围
            Name section1Range = workbook.getName("section1", sheet.getSheetName());
            // 解析范围引用(比如A2:C10这类格式)
            String rangeRef = section1Range.getRefersToFormula();
            AreaReference areaRef = new AreaReference(rangeRef, workbook.getSpreadsheetVersion());
            CellReference[] allCells = areaRef.getAllReferencedCells();

            // 逐单元格读取内容
            for (CellReference cellRef : allCells) {
                Row row = sheet.getRow(cellRef.getRow());
                if (row == null) continue;
                Cell cell = row.getCell(cellRef.getCol());
                if (cell == null) continue;
                // 此处可根据业务需求替换为自己的处理逻辑
                System.out.printf("工作表[%s] 单元格[%s] 内容:%s%n",
                        sheet.getSheetName(), cellRef.formatAsString(), cell.toString());
            }
        }

        workbook.close();
        fis.close();
    }
}

关键API说明

  • Name.getSheetIndex():区分局部/全局命名范围的核心标识,局部命名范围返回对应工作表索引,全局命名范围返回-1
  • Workbook.getName(String name, String sheetName):指定工作表名称获取对应局部命名范围,避免多个工作表同名局部范围冲突
  • AreaReference:自动解析命名范围的单元格区域引用,无需手动处理字符串拆分

注意:不要使用Workbook.getName(String name)方法获取局部命名范围,该方法只会返回全工作簿第一个匹配的命名范围,无法获取其他工作表下的同名局部范围。

内容的提问来源于stack exchange,提问作者Simon Rieu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:57:01