除了富文本字符串,一个单元格只分配了一种字体,但它可能被多个命名范围引用。因此,您需要遍历工作簿的命名范围并检查是否引用了单元格。为了简单起见,我对所有内容进行了迭代area.getAllReferencedCells()
- 如果范围很大,您需要检查该区域isContiguous()
是否以及您的单元格/行索引是否在边界框的单元格/行索引getFirstCell()
内。getLastCell()
有关更多信息,请查看Busy Developers' Guide to HSSF and XSSF Features。
或者在stackoverflow上搜索...
(在我的测试用例中,一个单元格(第 4 行,第 3 列)被三个不同形状的命名范围引用)
import java.io.File;
import java.util.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
public class XlsRangeNames {
public static void main(String[] args) throws Exception {
Workbook wb = WorkbookFactory.create(new File("src/test/resources/name-range.xls"));
Cell cell = wb.getSheetAt(0).getRow(3).getCell(2);
for (Name n : getNamedRangesForCell(wb, cell)) {
System.out.println(n.getNameName());
}
}
static List<Name> getNamedRangesForCell(Workbook wb, Cell cell) {
int col = cell.getColumnIndex();
int row = cell.getRowIndex();
String sheetName = cell.getSheet().getSheetName();
List<Name> result = new ArrayList<Name>();
for (int i=0; i<wb.getNumberOfNames(); i++) {
Name name = wb.getNameAt(i);
if (!sheetName.equals(name.getSheetName())) continue;
AreaReference area = new AreaReference(name.getRefersToFormula());
CellReference crList[] = area.getAllReferencedCells();
for (CellReference cr : crList) {
if (cr.getCol() == col
&& cr.getRow() == row) {
result.add(name);
continue;
}
}
}
return result;
}
}