0

我想编辑 .doc(word) 文档的标题。下面我写的代码:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

public class WordReplaceText {
    public static final String SOURCE_FILE = "C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack.doc";
    public static final String OUTPUT_FILE = "C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack2.doc";

    public static void main(String[] args) throws Exception {
        WordReplaceText instance = new WordReplaceText();
        HWPFDocument doc = instance.openDocument(SOURCE_FILE);
        if (doc != null) {
            doc = instance.replaceText(doc,  "${A}", "AField");
            instance.saveDocument(doc, OUTPUT_FILE);

        }

    }

    private HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
        Range r = doc.getRange();
        for (int i = 0; i < r.numSections(); ++i) {
            Section s = r.getSection(i);
            for (int j = 0; j < s.numParagraphs(); j++) {
                Paragraph p = s.getParagraph(j);
                for (int k = 0; k < p.numCharacterRuns(); k++) {
                    CharacterRun run = p.getCharacterRun(k);
                    String text = run.text();
                    if (text.contains(findText)) {
                        run.replaceText(findText, replaceText);
                    }
                }
            }
        }
        return doc;
    }

    private HWPFDocument openDocument(String file) throws Exception {
        URL res = getClass().getClassLoader().getResource(file);
        HWPFDocument document = null;
        if (res != null) {
            document = new HWPFDocument(new POIFSFileSystem(new File(res.getPath())));
        }else
            document = new HWPFDocument(new POIFSFileSystem(new File(SOURCE_FILE)));
        return document;
    }

    private void saveDocument(HWPFDocument doc, String file) {
        try {
            FileOutputStream out = new FileOutputStream(file);
            doc.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

但它不起作用,执行以下代码后,它无法打开显示错误的新文档。我还需要在文档中提供的框中添加图片。有没有人知道如何做到这一点?

以下是我也尝试过的链接:

用java替换word文档模板中的变量

得到同样的错误:

在此处输入图像描述

4

1 回答 1

2

简短的回答很可能但不幸的是:它不起作用。

长答案是:

HWPF 处于不完整的状态,很多东西不支持(我最后一次看可能是一年前)。.doc 文件格式是一种复杂的二进制文件格式。存在许多表,其条目指向文档中的某些位置。更改文档的一部分通常需要更新所有表格。有用于文本运行的表格、文本框、书签、形状、表格(行和列)等等。如果你很幸运,你有一个非常简单的文档,而且大多数复杂的表格都不在那里。但是,当您有形状、图像、文本框等时,您可能会遇到 HWPF 尚未/未正确支持的内容。输出通常是一个无效的 Word 文件,它会被 Word 拒绝(如果你幸运的话),或者它或多或少地使 Word 严重崩溃(可能需要重新启动计算机)。

(我为一个客户开发了一个自定义的 HWPF 库,几年前修复了这一切。因此我知道细节。)

备择方案

您可能想查看.docx格式而不是.doc. 如果你可以安排获取.docx文件,你可以使用 XWPF,它的状态要好得多。

关于标题:据我所知,标题不在主文档中。您需要查看标题子文档。(我相信是的XWPFHeader?)

于 2016-09-14T07:50:36.553 回答