6

Apache POI を使用すると、名前付き範囲を見つけることができます。

XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()];
for (int i = 0; i < _wb.getNumberOfNames(); i++)
    ranges[i] = workbook.getNameAt(i);

これで、AreaReference をセル化できます。

AreaReference area = new AreaReference(ranges[0].getRefersToFormula());

そして最後に、その範囲内のすべてのセルを取得できます。

CellReference[] cells = area.getAllReferencedCells();

それはすべてうまくいきます。Burt 範囲がカバーする領域を再定義する必要があるユースケースがあります。それを行う方法はありますか?range.getRefersToFormula()メソッドが のような文字列を返すことに気付きましたMySheet!$A$1:$B$8。はありますがrange.setRefersToFormula(String formula)、自分で Excel の範囲式パーサーを作成する以外に方法があると信じなければなりません。Cellよりタイプセーフなものへの参照を設定して AreaReference を生成する方法はありませんか? String新しい範囲を表すために実際に を生成する必要がありますか? これを支援するAPIがどこかにあると思いますが、見つけられないようです。

アップデート

いくつかの API を見つけましたが、動作していないようです。少なくとも正しく保存されていません。これが私がしたことです。

AreaReference newArea = new AreaReference(firstCell, lastCell);
ranges[0].setRefersToFormula(newArea.formatAsString())

数式を正しく設定しているように見えますが、ワークブックをディスクにストリーミングすると、範囲が完全に間違っています。

4

1 に答える 1

7

既存の参照を更新し、要件に従って設定できます。参照が含まれていて、それを次のTestSheet!$A$1:$B$8ように変更したいとします。 MySheet!$B$5:$C$12

任意のセルについて、実行時に「B5」と言います。

cell.getReference(); 

セル参照を提供します(例のように...「B5」が返されます)

char startCellColRef = cell.getReference().toString().charAt(0); 

列参照が表示されます (現在のセルが B5 の場合は "B" が表示されます)。今

int startCellRowRef = cell.getReference().toString().charAt(1);

行インデックスが表示されます (現在のセルが B5 の場合は "5" が表示されます)。

同じ方法で、開始セル参照と終了セル参照 (B5 と C12 など) を取得できます。

次に、既存の参照を更新する方法について説明します。新しく作成された参照文字列で値を更新するだけです

Name reference = wb.getName("NameReferenceInExcelSheet");
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef;
reference.setRefersToFormula(referenceString);
于 2013-07-17T17:36:53.677 に答える