使用POI操作word文档中文本框中的内容

近几日,公司项目要求使用一个已存在的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,即游标,哈哈,开始我伟大的代码之旅了:

    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 进行编程】http://www.ibm.com/developerworks/cn/xml/x-beans1/


上一篇
Java经典算法40题 Java经典算法40题
在网上看到一个《Java经典算法40题》,准备没事就写一篇,其中部分题目可能有点小问题,比如19、38。【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每
2014-03-29
下一篇
圣思园Java培训视频的播放顺序 圣思园Java培训视频的播放顺序
最近在好好的学习Java,把以前遗漏掉的知识点都补上,看的是圣思园的Java培训视频,前几天,搞明白了圣思园Java视频的顺序,贴在这里,方便其他也学习圣思园Java的人。 人民银行企培视频:这个是2010年5月份的时候的企业培训视频,
2013-05-13