本文发表于 4118 天前,其中的信息可能已经事过境迁
Ai摘要
加载中...|
此摘要由AI根据文章内容生成,并经过人工审核,仅用于文章内容的解释与总结

近几日,公司项目要求使用一个已存在的word文件,从数据库读取数据来修改这个word文件,并保存,此为背景。 模板word是一个office 2007的docx文件,在2003版本的的doc文件中,POI可以使用HWPF很方便的获取range,然后replace,不过好像背景图片什么都没有了。在docx中,正常的文本段落还是比较方便替换的,但是遇到文本框中的文字就无力了。还好POI提供了获取文档的XML内容的方法,因此可以通过XML来修改文本框中的内容,但是此xml非dom4j,而是XMLbeans,一个很少有人用的XML框架,唉,无力吐槽了。 在网上找了很多教程,finally,在伟大的IBM Developers发现了一篇介绍XMLbeans的文字,找到了一个有用的东西XMLCursor,即游标,哈哈,开始我伟大的代码之旅了:

Java
FileInputStream fis = new FileInputStream("e:/file.docx");
XWPFDocument doc = new XWPFDocument(fis);
//XWPFParagraph可以通过迭代处理,我这里已经测试过所要用的文档了,所以后边直接使用paragraphList.get(10)
List<XWPFParagraph> paragraphList = doc.getParagraphs();

// 文本框中的內容很麻煩
// 第一步,通过XWPF的XWPFDocument->XWPFParagraph获取XWPFParagraph对象 XWPFParagraph paragraph = paragraphList.get(10);
// 第二部,获取XWPFParagraph的XmlObject,然后使用XmlObject对象,new一个XmlCursor
XmlObject object = paragraph.getCTP().getRArray(1);
XmlCursor cursor = object.newCursor();

// 可以打印XmlObject对象来查看当前xml文件内容
// 也可通过XmlCursor的getName和getTextValue方法查看当前所在Node及其值
// 我的第一个要修改的内容所在node为:注意index
// <xml-fragment> -> <w:pict> -> <v:shape> -> <v:textbox> ->
// <w:txbxContent> -> <w:p> -> <w:r> -> <w:t>
cursor.toChild(1);
cursor.toChild(0);
cursor.toChild(3);
cursor.toChild(0);

cursor.toChild(0);
cursor.toChild(3);
cursor.toChild(1);
cursor.setTextValue("First");

// 我的第二个要修改的内容所在node为:注意index
// <w:txbxContent> -> <w:p> -> <w:r> -> <w:t>
cursor.toParent();
cursor.toParent();
cursor.toParent();
cursor.toChild(1);
cursor.toChild(3);
cursor.toChild(1);
cursor.setTextValue("Second");
FileOutputStream fos = new FileOutputStream("e:/export.docx");
doc.write(fos);
fos.flush();
fos.close();
fis.close();

搞定。 附链接:使用 XMLBeans 进行编程

赞赏博主
评论 隐私政策