使用 java 中的 OLE 自动化将 word 文件拆分为多个较小的 word 文件

Posted

技术标签:

【中文标题】使用 java 中的 OLE 自动化将 word 文件拆分为多个较小的 word 文件【英文标题】:Splitting word file into multiple smaller word files using OLE Automation from java 【发布时间】:2010-09-21 12:09:29 【问题描述】:

我一直在使用 java 中的 OLE 自动化来访问 word 的方法。

我设法使用 OLE 自动化完成了以下操作:

打开word文档模板文件。 邮件将 word 文档模板与 csv 数据源文件合并。 将邮件合并文件保存到新的 word 文档文件中。

我现在需要做的是能够打开邮件合并文件,然后使用 OLE 以编程方式将其拆分为多个文件。这意味着如果原始邮件合并文件有 6000 页,并且我的每个文件的最大页数属性设置为 3000 页,我需要创建两个新的 Word 文档文件,并将第一个 3000 页放在一个中,最后 3000 页放在另一个中。

在我第一次尝试时,我将 csv 文件中的行数乘以模板中的页数,以获得合并后的总页数。然后我使用合并来创建多个文件。然而,问题是我无法准确计算合并文档的页数,因为在某些情况下,由于使用了数据和合并字段,所以都说模板的 9 页不会被使用。所以在某些情况下,一行只会创建 3 页(使用 9 页模板),而其他可能会在邮件合并期间创建 9 页(使用 9 页模板)。

因此唯一的解决方案是将所有行合并到一个文档中,然后将其拆分为多个文档,以确保每个文件中确实存在像 3000 pages 属性这样的确切页面数量,直到没有更多页面离开原始合并文件。

我已经通过使用 msdn 站点来获取方法及其属性等尝试了一些事情,但一直无法做到这一点。

在我最后一次尝试中,我一直在尝试使用 GoTo 获取特定页码并删除该页面。我将尝试对每一页逐一执行此操作,直到到达我希望文件开始的位置,然后将其另存为新文件,但也无法这样做。

请任何人提出一些可以帮助我的建议吗?

感谢和问候 肖恩

以下是使用 Jave 中的 OLE AUTOMATION 打开 word 文件的示例:

Code sample
OleAutomation documentsAutomation = this.getChildAutomation(this.wordAutomation, "Documents");

int [ ] id = documentsAutomation.getIDsOfNames(new String[]"Open");

Variant[] arguments = new Variant[1];

arguments[0] = new Variant(fileName); // where filename is the absolute path to the docx file

Variant invokeResult = documentsAutomation.invoke(id[0], arguments);

private OleAutomation getChildAutomation(OleAutomation automation, String childName) 

int[] id = automation.getIDsOfNames(new String[]childName);

Variant pVarResult = automation.getProperty(id[0]);

return(pVarResult.getAutomation());



Code sample

【问题讨论】:

我忘记补充说我正在使用以下库来执行此操作,该库包含在 Eclipse 的 Helios 版本中。 org.eclipse.swt.win32.win32.x86_64_3.6.0-v3650b.jar 我现在已经成功地实际使用 Goto 方法转到特定页面,然后删除它们,直到文档中只有我需要的页面,然后将其保存到新文档中。它还不完美,但似乎至少是一种方法。 最后一点,我在拆分文件的末尾有一个空白页,因为用于进行邮件合并的模板在最后一页有分页符。要删除文件中的最后一个空页面,我无法在 Range 对象上使用 Delete,因为这只会删除内容而不是页面。我发现的解决方法是在使用 Goto 方法进入最后一页后使用 TypeBackspaceKey 方法。这完美地从拆分的 word 文档中删除了空白页面。 【参考方案1】:

听起来你已经确定了。您可以采取的另一种避免构建然后删除的方法是查看模板中可能对模板数量产生最大差异的部分(即数据可以是多行的地方)。如果您随后使用这些字段并查看字体、行距和线宽类型的属性,您将能够计算出您的数据将在模板中占用的空间并在该点限制您的数据。 Java FontMetrics 可以帮助您。

【讨论】:

以上是关于使用 java 中的 OLE 自动化将 word 文件拆分为多个较小的 word 文件的主要内容,如果未能解决你的问题,请参考以下文章

OLE 自动化 - WORD 表格 (Delphi)

如何在 Delphi 的 OLE 自动化过程中使 Word 不可见

MS Word Ole 自动化、ADO 和外来字符

如何使用C#将包含文字、图片和表格的二进制数据写入到word文件中

Perl 的 OLE 自动化基础知识

对于 word.zip 文件的 word/embedding 中的文件,将 .bin 转换为 .png