6

次のコードを使用すると、Excel スプレッドシートに加えたセル値の変更が保存されません。

OPCPackage pkg = OPCPackage.open(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

ModifyWorkbook();

pkg.close();

以下は私が書いた回避策ですが、なぜそれが必要なのかわかりません。

OPCPackage pkg = OPCPackage.open(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

ModifyWorkbook();

File tmp = File.createTempFile("tempSpreadsheet", ".xlsx");
FileOutputStream newExcelFile = new FileOutputStream(tmp);
wb.write(newExcelFile);
newExcelFile.close();
tmp.deleteOnExit();
pkg.close();

この件に関する Javadoc とガイドは、.close() メソッドが保存して閉じる必要があることを示しています。閉じる前に変更されたセルの値をチェックすると、変更が行われたことが示されますが、pkg.close() メソッドだけでは、閉じたときにそれらの変更をファイルに書き込むのに十分ではありません。

4

3 に答える 3

2

を呼び出すとOPCPackage.close()、基になる OOXML ファイル構造が閉じられます。XSSF (または X??F 形式のいずれか) に変更を書き出すことはできません。したがって、変更されていないファイルを書き出します....

低レベルの変更を行う場合は、OPCPackage を開いて変更を加え、close を呼び出してそれらを書き出すことができます。高レベルの作業を行っている場合は、OPCPackage を開き、UserModel コードを操作して変更を加えてから、usermodelにその変更を書き出すように依頼します。重要なのはこの最後のステップです。

現在のコードは次のようになります。

File f = new File("test.txt");
Sting s = readFileCompletely(f);
s = s.replaceAll("foo", "bar");
f.close();
// Why hasn't the file contents changed?

ファイルを読み込んで高レベルのオブジェクトを変更するだけでは不十分です。高レベルのオブジェクトに変更を書き出すように指示する必要もあります。(高レベルのオブジェクトは、パフォーマンス上の理由からメモリにキャッシュします)

于 2013-04-19T21:33:45.210 に答える