質問

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 ファイルに次のような単純な行が含まれている場合:」ああ、ええ」と表示され、正常に動作しますが、複雑なファイルを使用すると、コンテンツは正常に読み取られ、Test1.doc ファイルが生成されますが、それを開こうとすると、次のエラーが表示されます。

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

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

役に立ちましたか?

解決

試してみてもいいでしょう OpenOffice API, しかし、その使用方法を説明するリソースはあまりありません。

他のヒント

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

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

実際の Word 文書を見ないと、何が起こっているのかを判断するのは困難です。

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

わからない :自分で答えても大丈夫ですが、知識を共有するために、自分で答えます。

Webをナビゲートした後、私が見つけた最終的な解決策は次のとおりです。と呼ばれる図書館 docx4j MS docx ファイルを扱うのに非常に優れていますが、ドキュメントはまだ十分ではなく、フォーラムはまだ初期段階にありますが、全体的には必要なことを行うのに役立ちます。

助けてくれた4人全員に感謝します。

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

みたいです これ 問題になる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top