【问题标题】:Java Apache POI adding new row in to existing table. Word documentJava Apache POI 在现有表中添加新行。 Word 文档
【发布时间】:2014-07-09 15:52:29
【问题描述】:

我正在尝试向 MS Word 文档中的现有表格添加新行。我使用 POI 3.10,hwpf 库。但执行此程序后,文件崩溃,MS Word 出现警告信息。所有内容看起来都很奇怪,而且没有格式化。

示例如下:

InputStream fin = new FileInputStream(args[0]);
    POIFSFileSystem fs = new POIFSFileSystem(fin);

    HWPFDocument doc = new HWPFDocument(fs);
    Range range = doc.getRange();

    range.getParagraph(269).insertAfter("TEST");
    doc.write(new FileOutputStream("SOME PATH"));

也许应该更新一些额外的东西(例如 SI、DSI),因为添加了新的 CharacterRun?

【问题讨论】:

  • 发出的警告信息是什么?
  • 您好,消息听起来像这样:“此文档中的表格已损坏。”

标签: ms-word apache-poi hwpf


【解决方案1】:

HWPF 仅支持 Word97/2000 格式的 DOC 文件的简单变体。表格已经很重要了。如果 Word 拒绝了您使用库创建/修改的文件,那么您可能不走运。

前段时间,我为客户开发了一个基于 Apache 的 HWPF 代码库的自定义库。该自定义库增加了对许多功能的支持,并且可以可靠地编写 Word 文件。正确地做所有这些事情是一项艰巨的工作。因此,仅解决小问题是不可能的。您将不得不花费几个月的时间。

您可以选择在 Word 中创建空行并使用 HWPF 填充它们吗?

编辑:可能的功能解决方法:

用标记预填充表格:

+--------+-------------+------------------------------------+
| Rev 1  |  2014-01-01 | Created document                   |
+--------+-------------+------------------------------------+
| Rev 2  |  2014-01-02 | Corrected flow chart               |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+

确保标记足够长。 (在 HWPF 中添加文本,以便在表格中更改段落地址可能会造成麻烦。)

要填充一行,请执行以下操作:

  1. 查找一行的标记集
  2. 每个标记都必须包含所有后续的#-字符
  3. 准备好要为每个标记填写的文本
  4. 确保您的文本仅使用 ASCII 字符(见下文)
  5. 确保您的文本不超过修订标记
  6. 用新内容填充修订标记,并用空格填充剩余的#字符

如果软件没有找到新行,则必须有人在 Word 中添加新行模板。

一些限制的原因:

不插入:很多东西都与地址一起存储到文本流中(许多内部额外的表,其中包含对文本内容的地址引用)。这适用于段落边框、字符格式、表格标记、书签、图形参考等。HWPF 涵盖了一些内容,但很多没有。如果插入文本,地址可能会发生偏移,Word 文件可能会损坏。

ASCII 范围: 文本序列存储为每个字符 1 个字节或每个字符 2 个字节。如果操作正确,在 1 字节范围内插入非 ASCII 字符需要将该范围转换为 2 字节范围。这在 HWPF 中并不总是有效,它会导致地址转移(参见上面的“无插入”)。

如果您的文档“更简单”,您可能会摆脱一些限制。例如:没有文本框更好。没有嵌入的图纸更好。没有嵌套表更好。但是,通常限制非常严格,您也可以使用纯文本文档并为其提供 .doc 扩展名。

如果您需要更多详细信息,请告诉我。

【讨论】:

  • 感谢雷纳提供信息。该程序的目的是更新现有文档中的修订历史,修订历史章节是一个表格。我需要以某种方式使用新信息更新此表格。你有什么建议吗?
  • 嗨@Rainer,好主意,我需要与客户协商是否可以。还有一个问题,有没有可能用这种方式来解决这个想法:
  • 嗨@Rainer,好主意,我需要与客户协商是否可以。还有一个问题,是否有可能以这种方式解决这个想法: 1. 创建空的 .doc 文件。 2 创建HPWFdocument 实例,空文件作为输入。 3. 创建段落实例,从文件(源文件)复制文本和属性,直到到达应该插入新文本之后的行。 4. 使用一些新的文本和属性创建新的段落实例。
  • 5.继续创建新实例和处理属性,直到到达文件末尾。 6. 使用内部方法“write(OutputStream)”保存HPWFdocument 实例。有没有可能,你怎么看?感谢您的帮助:)
  • 我已经尝试过这个解决方案,但是保存后,文档还是崩溃了...我使用了 character.replace() 方法将标记替换为新文本。当我尝试使用 MS Word 打开此文件时,我收到这样的消息:“此错误消息的出现可能有多种原因。文档可能已损坏或损坏。使用恢复文本转换器或打开和修复功能。两者可从“打开”对话框获得。”
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2016-10-02
相关资源
最近更新 更多