3

私は Apache POI 3.13 を使用しており、特定のテンプレート ファイルからテキストを検索して置換し、新しく生成された .docx を保存しようとしていました。これが私のコードです:

public static void main(String[] args) throws InvalidFormatException, IOException {
    String filePath = "Sample.docx";
    File outputfile = new File("SampleProcessed.docx");

    XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));

    for (XWPFParagraph p : doc.getParagraphs()) {
        List<XWPFRun> runs = p.getRuns();
        if (runs != null) {
            for (XWPFRun r : runs) {
                String text = r.getText(0);
                if (text != null && text.contains("$VAR")) {
                    text = text.replace("$VAR", "JohnDoe");
                    r.setText(text, 0);
                }
            }
        }
    }

    doc.write(new FileOutputStream(outputfile));
    doc.close();
    System.out.println("Done");
    Desktop.getDesktop().open(outputfile);
}

これは非常に簡単に見えますが、このコードを実行すると、ドキュメント「Sample.docx」も置き換えられます。最終的に、同じ内容の 2 つのドキュメントができました。

これは POI の通常の動作ですか? ドキュメントを開くと、ドキュメントがメモリに読み込まれるだけで、「doc.write(OutputStream);」を実行すると思いました。ディスクにフラッシュします。

同じ「filePath」に書き込もうとしましたが、現在開いているファイルに書き込もうとしているため、予想どおり例外がスローされます。

最初にテンプレート ファイルをコピーし、代わりにそのコピーを使用した場合にのみ機能しました。最初の 1 つは元のテンプレート 'Sample.docx' で、残りの 2 つは同じ内容 (SampleProcessed.docx と SampleProcessedOut.docx) です。

うまくいきましたが、かなりもったいないです。これに何か方法はありますか?私は何か間違ったことをしていますか、おそらくWord文書を間違って開いていますか?

4

1 に答える 1

5

使用しているので

XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));

を作成するには、 inモードからXWPFDocumentaOPCPackageを開きます。これが閉じられる場合、それも保存されます。https://poi.apache.org/apidocs/org/apache/poi/openxml4j/opc/OPCPackage.html#close%28%29を参照してください。filePathREAD_WRITE

OPCPackage閉鎖されますが、XWPFDocumentは閉鎖されます。

しかし、なぜそうするのですか?なぜだめですか

XWPFDocument doc = new XWPFDocument(new FileInputStream(filePath));

?

これで、ファイルとは関係なくXWPFDocumentnew のみでメモリ上に が作成されOPCPackageます。

于 2016-02-14T07:17:08.707 に答える