Вопрос

Я пытаюсь открыть документ 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 содержит такую ​​простую строку:"ААА ЭЭЭ", он работает успешно, но когда я использую сложный файл, он успешно прочитает содержимое и создаст файл Test1.doc, но когда я попытаюсь его открыть, он выдаст следующую ошибку:

Word не может прочитать этот документ.Это может быть коррумпировано.Попробуйте одно или несколько из следующих действий:* Откройте и восстановите файл.* Откройте файл с помощью конвертера Text Recovery.(C: est1.doc)

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

Выглядит как этот может быть проблема.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top