Откройте Microsoft Word на Java - PullRequest
1 голос
/ 11 мая 2009

Я пытаюсь открыть документ MS Word 2003 в Java, найти указанную строку и заменить ее новой строкой. Я использую 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 не может прочитать этот документ. Это может быть испорчено. Попробуйте выполнить одно или несколько из следующих действий: * Открыть и восстановить файл. * Откройте файл с помощью конвертера текста восстановления. (C: \ Test1.doc)

Пожалуйста, скажите мне, что делать, потому что я новичок в POI, и я не нашел хорошего учебника для этого.

Ответы [ 5 ]

3 голосов
/ 11 мая 2009

Прежде всего вы должны закрыть свой документ.

Кроме того, я предлагаю восстановить исходный документ Word как документ Word XML, а затем вручную изменить расширение с .XML на .doc. Затем посмотрите на XML документа, с которым вы работаете, и проследите содержимое, чтобы убедиться, что вы случайно не редактируете шестнадцатеричные значения (AAA и EEE могут быть шестнадцатеричными значениями в других полях).

Не видя самого документа Word, трудно сказать, что происходит.

Существует совсем немного документации по POI, особенно для документа Word, к сожалению.

2 голосов
/ 20 мая 2009

Не знаю: нормально ли мне отвечать самому, но просто чтобы поделиться знаниями, я отвечу сам.

После навигации по Интернету окончательное решение, которое я нашел: Библиотека под названием docx4j очень хороша для работы с файлом MS docx, хотя ее документации пока недостаточно, а форум еще находится на начальном этапе, но в целом она помогает мне делай то, что мне нужно ..

Спасибо 4 всем, кто мне помогает ..

1 голос
/ 11 мая 2009

Вы можете попробовать OpenOffice API , но не так много ресурсов, чтобы рассказать вам, как его использовать.

0 голосов
/ 19 ноября 2009

Вы также можете попробовать это: http://www.dancrintea.ro/doc-to-pdf/

0 голосов
/ 11 мая 2009

Похоже, это может быть проблемой.

...