Frage

Ich versuche, MS Word 2003-Dokument in Java zu öffnen, für einen bestimmten String suchen und ihn durch einen neuen String zu ersetzen. Ich benutze APACHE POI das zu tun. Mein Code ist wie die folgenden:

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);
        }
}

Ich nenne diese Funktion mit folgenden Argumenten:

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

Wenn die Test.doc Datei eine einfache Zeile wie diese enthält: „ AAA EEE “, es funktioniert erfolgreich, aber wenn ich eine komplizierte Datei verwenden, wird es den Inhalt erfolgreich und erzeugen die Test1 lesen. doc-Datei, aber wenn ich versuche, es zu öffnen, es gibt mir die folgende Fehlermeldung:

Wort nicht auf dieses Dokument lesen. Es ist möglicherweise beschädigt. Versuchen Sie eine oder mehrere der folgenden: * Öffnen Sie die Datei reparieren. * Die Datei mit Text Recovery-Konverter öffnen.  (C: \ Test1.doc)

Bitte sagen Sie mir, was zu tun ist, weil ich ein Anfänger in POI bin und ich habe nicht ein gutes Tutorial für sie gefunden.

War es hilfreich?

Lösung

Sie könnten versuchen, Openoffice API , aber dort arent viele Ressourcen gibt, um Ihnen zu sagen, wie es zu benutzen.

Andere Tipps

Als erstes sollten Sie Ihr Dokument schließen werden.

Außer dem, was ich schlage vor, dabei ist Ihr ursprüngliches Word-Dokument als Word-XML-Dokument erneut speichern, dann die Erweiterung zu ändern manuell von .XML zu .doc. Schauen Sie sich die XML des aktuellen Dokuments, das Sie gerade arbeiten und verfolgen Sie die Inhalte sicherzustellen, dass Sie nicht versehentlich Bearbeitung hexadezimalen Werten (AAA und EEE könnten Hex-Werte in anderen Bereichen sein).

Ohne das eigentliche Word-Dokument zu sehen, es ist schwer zu sagen, was los ist.

Es gibt nicht viel Dokumentation über POI überhaupt, vor allem für Word-Dokument leider.

Ich weiß nicht: ist sein OK selbst zu beantworten, aber einfach das Wissen zu teilen, werde ich mich antworten

.

Nachdem die Bahn der Navigation, die endgültige Lösung i gefunden ist: Die Bibliothek namens docx4j ist sehr gut für mit MS docx-Datei handelt , obwohl seine Dokumentation nicht genug bis jetzt und sein Forum ist immer noch in einem Anfang Schritt, aber alles in allem helfen, es mir zu tun, was ich brauche ..

Danke 4 alle, die mir helfen ..

Sie können auch versuchen diese: http://www.dancrintea.ro/doc -zu-pdf /

Sieht aus wie diese könnte das Problem sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top