1

Java で MS Word 2003 ドキュメントを開こうとしています。指定された文字列を検索し、新しい文字列に置き換えます。私はそれを行うためにAPACHE POIを使用しています。私のコードは次のようなものです:

public void searchAndReplace(String inputFilename, String outputFilename,
            HashMap<String, String> replacements) {
    File outputFile = null;
    File inputFile = null;
    FileInputStream fileIStream = null;
    FileOutputStream fileOStream = null;
    BufferedInputStream bufIStream = null;
    BufferedOutputStream bufOStream = null;
    POIFSFileSystem fileSystem = null;
    HWPFDocument document = null;
    Range docRange = null;
    Paragraph paragraph = null;
    CharacterRun charRun = null;
    Set<String> keySet = null;
    Iterator<String> keySetIterator = null;
    int numParagraphs = 0;
    int numCharRuns = 0;
    String text = null;
    String key = null;
    String value = null;
        try {
            // Create an instance of the POIFSFileSystem class and
            // attach it to the Word document using an InputStream.
            inputFile = new File(inputFilename);
            fileIStream = new FileInputStream(inputFile);
            bufIStream = new BufferedInputStream(fileIStream);
            fileSystem = new POIFSFileSystem(bufIStream);
            document = new HWPFDocument(fileSystem);
            docRange = document.getRange();
            numParagraphs = docRange.numParagraphs();
            keySet = replacements.keySet();
            for (int i = 0; i < numParagraphs; i++) {
                paragraph = docRange.getParagraph(i);
                text = paragraph.text();
                numCharRuns = paragraph.numCharacterRuns();
                for (int j = 0; j < numCharRuns; j++) {
                    charRun = paragraph.getCharacterRun(j);
                    text = charRun.text();
                    System.out.println("Character Run text: " + text);
                    keySetIterator = keySet.iterator();
                    while (keySetIterator.hasNext()) {
                        key = keySetIterator.next();
                        if (text.contains(key)) {
                            value = replacements.get(key);
                            charRun.replaceText(key, value);
                            docRange = document.getRange();
                            paragraph = docRange.getParagraph(i);
                            charRun = paragraph.getCharacterRun(j);
                            text = charRun.text();
                        }
                    }
                }
            }
            bufIStream.close();
            bufIStream = null;
            outputFile = new File(outputFilename);
            fileOStream = new FileOutputStream(outputFile);
            bufOStream = new BufferedOutputStream(fileOStream);
            document.write(bufOStream);
        } catch (Exception ex) {
            System.out.println("Caught an: " + ex.getClass().getName());
            System.out.println("Message: " + ex.getMessage());
            System.out.println("Stacktrace follows.............");
            ex.printStackTrace(System.out);
        }
}

この関数を次の引数で呼び出します。

HashMap<String, String> replacements = new HashMap<String, String>();
replacements.put("AAA", "BBB");
searchAndReplace("C:/Test.doc", "C:/Test1.doc", replacements);

Test.doc ファイルに「 AAA EEE 」のような単純な行が含まれている場合、正常に動作しますが、複雑なファイルを使用するとコンテンツが正常に読み取られ、Test1.doc ファイルが生成されますが、開こうとすると、次のエラーが表示されます。

Word はこの文書を読み取ることができません。破損している可能性があります。次の 1 つまたは複数を試してください。 * ファイルを開いて修復します。* Text Recovery コンバーターでファイルを開きます。(C:\Test1.doc)

私は POI の初心者で、適切なチュートリアルが見つからないため、何をすべきか教えてください。

4

5 に答える 5

3

まず、ドキュメントを閉じる必要があります。

それに加えて、元の Word ドキュメントを Word XML ドキュメントとして再保存し、拡張子を手動で .XML から .doc に変更することをお勧めします。次に、作業している実際のドキュメントの XML を見て、コンテンツをトレースして、誤って 16 進値を編集していないことを確認します (AAA と EEE は、他のフィールドでは 16 進値である可能性があります)。

実際の Word 文書を見ないと、何が起こっているのかわかりません。

残念ながら、特に Word ドキュメントについては、POI に関するドキュメントはあまりありません。

于 2009-05-10T21:41:10.550 に答える
2

わかりません:自分で答えてもいいですか、しかし知識を共有するために、自分で答えます。

Webをナビゲートした後、私が見つけた最終的な解決策は次のとおりです。docx4jと呼ばれるライブラリは、MS docxファイルを処理するのに非常に適していますが、そのドキュメントは今まで十分ではなく、そのフォーラムはまだ初期段階にありますが、全体的には私が必要なことをする..

私を助けてくれた4人全員に感謝..

于 2009-05-20T08:40:14.043 に答える
1

OpenOffice APIを試すこともできますが、その使用方法を説明するリソースはあまりありません。

于 2009-05-11T07:15:06.883 に答える
0

これを試すこともできます: http://www.dancrintea.ro/doc-to-pdf/

于 2009-11-19T09:20:14.640 に答える
0

これが問題になる可能性があるようです。

于 2009-05-11T06:53:26.263 に答える