如何使用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():区分局部/全局命名范围的核心标识,局部命名范围返回对应工作表索引,全局命名范围返回-1Workbook.getName(String name, String sheetName):指定工作表名称获取对应局部命名范围,避免多个工作表同名局部范围冲突AreaReference:自动解析命名范围的单元格区域引用,无需手动处理字符串拆分
注意:不要使用
Workbook.getName(String name)方法获取局部命名范围,该方法只会返回全工作簿第一个匹配的命名范围,无法获取其他工作表下的同名局部范围。
内容的提问来源于stack exchange,提问作者Simon Rieu
相关产品推荐
相关产品推荐

