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

时间:2010-09-21 12:09:29

标签: java split automation ms-word ole

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

我设法使用OLE自动化执行以下操作:

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

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

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

所以唯一的解决方案是将所有行合并到一个文档中,然后将其拆分为多个文档,以确保每个文件中确实存在3000页属性的确切页数,直到没有剩余的页面为止原始合并文件。

我已经通过使用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

1 个答案:

答案 0 :(得分:1)

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