如何通过java将多个word文档合成一个wor
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过java将多个word文档合成一个wor相关的知识,希望对你有一定的参考价值。
国内有个免费的jar(Free Spire.Doc for Java),可用来合并Word文档,分两种合并方法:1.合并的内容新起一页;2.合并的内容承接上文段落。
1.新起一页合并
import com.spire.doc.Document;import com.spire.doc.FileFormat;
public class MergeWordDocument
public static void main(String[] args)
//获取第一个文档的路径
String filePath1 = "merge1.docx";
//获取第二个文档的路径
String filePath2 = "merge2.docx";
//加载第一个文档
Document document = new Document(filePath1);
//使用insertTextFromFile方法将第二个文档的内容插入到第一个文档
document.insertTextFromFile(filePath2, FileFormat.Docx_2013);
//保存文档
document.saveToFile("Output.docx", FileFormat.Docx_2013);
2.承接上文段落合并
import com.spire.doc.Document;import com.spire.doc.DocumentObject;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;
public class MergeWordDocument
public static void main(String[] args)
//获取第一个文档的路径
String filePath1 = "merge1.docx";
//获取第二个文档的路径
String filePath2 = "merge2.docx";
//加载第一个文档
Document document1 = new Document(filePath1);
//加载第二个文档
Document document2 = new Document(filePath2);
//获取第一个文档的最后一个section
Section lastSection = document1.getLastSection();
//将第二个文档的段落作为新的段落添加到第一个文档的最后一个section
for (Section section:(Iterable <Section>)document2.getSections())
for (DocumentObject obj:(Iterable <DocumentObject>)section.getBody().getChildObjects()
)
lastSection.getBody().getChildObjects().add(obj.deepClone());
//保存文档
document1.saveToFile("Output.docx", FileFormat.Docx_2013);
可参考原文。
Java可以使用这个开源框架,对word进行读取合并等操作,Apache POI是一个开源的利用Java读写Excel、WORD等微软OLE2组件文档的项目。最新的3.5版本有很多改进,加入了对采用OOXML格式的Office 2007支持,如xlsx、docx、pptx文档。 示例如下:
import org.apache.poi.POITextExtractor;import org.apache.poi.hwpf.extractor.WordExtractor;
//得到.doc文件提取器
org.apache.poi.hwpf.extractor.WordExtractor doc = new WordExtractor(new FileInputStream(filePath));
//提取.doc正文文本
String text = doc.getText();
//提取.doc批注
String[] comments = doc. getCommentsText();
2007
import org.apache.poi.POITextExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFComment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
//得到.docx文件提取器
org.apache.poi.xwpf.extractor.XWPFWordExtractor docx = new XWPFWordExtractor(POIXMLDocument.openPackage(filePath));
//提取.docx正文文本
String text = docx.getText();
//提取.docx批注
org.apache.poi.xwpf.usermodel.XWPFComment[] comments = docx.getDocument()).getComments();
for(XWPFComment comment:comments)
comment.getId();//提取批注Id
comment.getAuthor();//提取批注修改人
comment.getText();//提取批注内容
使用 java 中的 OLE 自动化将 word 文件拆分为多个较小的 word 文件
【中文标题】使用 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将多个word文档合成一个wor的主要内容,如果未能解决你的问题,请参考以下文章