1

タイトルの通り、ここでちょっと困ったことがあります。セルからフォントを取得できます

HSSFFont font =
    cell.getRow().getSheet().getWorkbook().
    getFontAt(cell.getCellStyle().getFontIndex());

しかし、今はその範囲名を取得する必要があります。実際には、キーセルと独自の値セルを固定して決定するものが必要です。

workBook.getName()またはなどの範囲名を取得する方法はありますが、HSSFCellから名前インデックス.getNameAt()を取得する方法はありますか?

4

1 に答える 1

2

リッチ テキスト文字列とは別に、セルには 1 つのフォントしか割り当てられていませんが、複数の名前付き範囲によって参照される場合があります。したがって、ワークブックの名前付き範囲を反復処理し、セルが参照されているかどうかを確認する必要があります。簡単にするために、私はすべてを繰り返しましたarea.getAllReferencedCells()- 大きな範囲の場合、領域かどうか、セル/行インデックスが境界ボックスisContiguous()のセル/行インデックス内にあるかgetFirstCell()どうかを確認する必要があります。getLastCell()

詳細については、Busy Developers' Guide to HSSF and XSSF Features を確認してください。

またはstackoverflowで検索してください...

(私のテストケースでは、セル (行 4、列 3) は 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;
    }
}
于 2013-05-11T23:33:20.223 に答える