美文网首页技术程序员
利用docx4j来处理word的合并与拆分

利用docx4j来处理word的合并与拆分

作者: igool | 来源:发表于2016-03-14 16:02 被阅读1975次

    docx4j是一款在java世界处理微软word/ppt/excel文档的强大工具。它其实是一个半开源的产品。虽然它对WORD各种处理在API层面进行了封装,但是像WORD本身的拆分,合并。其作者(Jason Harrop)是单独提出来了,封装成了商用的JAR包来提供支持。而我在深入学习其API之后,先后将组合,拆分技术进行了实现。

    docx4j用到了个比较N的技术--JAXB.它建立了XML文件与JAVA对象互相转换的一个桥梁。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XMLSchema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

WORD以XML存储的原理:

WordprocessingML体系结构图

WordML以XML的格式定义了文档中各个部分的属性,如页眉,页脚,图片,样式。每一种资源都其实是使用一个XML的结点来描述。举例来说明:

假如有这样一个文档

docx4j可以将WORD直接转换其对应的XML文档,我们可以以第一段【开始】到【题文】那一段的XML片断来说明。初步看,这段内容包含了若干文字,一张图片。

文字段:

图片:

图片的关联资源引用定义:

图片资源的数据定义:

看到NB的地方没有,使用binarydata存储这个图片的数据。


组合原理:

拆分原理:

原理基本如上,已经在项目中实际应用。有了这层API,你可以通过程序去生成一份试卷(类似学科网的组卷功能),或者把试卷拆分成单个的试题入库。如有不明白的,欢迎沟通学习。

之前生成的试卷sample:主要在基础API之上,封装了生成一份试卷常用的方法。其实就是内容的样式设置及WORD组合。

相关文章

网友评论

  • 张志军_e425:请问 表格的样式是如何处理的 我先在分割完word之后 表格的样式不显示了
    igool:截图看看
  • bd6187156bf7:楼主请教下 “”docx4j可以将WORD直接转换其对应的XML文档 “ docx4j又类函数能直接转换为xml文档?什么类啊
    igool:你看看Samlpe代码
  • 98f737ac47d5:谢谢分享,你的题库拆分之后,是怎么存储的,怎么在页面展示的,转成html?转成图片?
    igool:@ycssh HTML
  • 9dda16ecb72b:有相关代码么,兄弟
    igool:@9dda16ecb72b 拆分的同时,把你拆分成WORD的小单元里面的图片的ID找到,建立WORD单元与图片资源的对应关系。这样你再生成新的WORD的时候,就可以从原来的WORD里面找出
    Relationship ,通过它的API再生成新的relationship
    代码片断如下:
    /////////////////////////////////////////////////////////////////
    Relationship re = wordMLPackage.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(id);

    // add ref
    PartName partName = new PartName("/word/" + re.getTarget());

    BinaryPart oPart = (BinaryPart) wordMLPackage.getParts().getParts().get(new PartName("/word/" + re.getTarget()));
    BinaryPart bPart = new BinaryPart(partName);
    bPart.setBinaryData(oPart.getBytes());
    // 写死了类型
    bPart.setContentType(new ContentType(oPart.getContentType()));
    bPart.setRelationshipType(re.getType()/* Namespaces.IMAGE */);
    Relationship newRe = _wordMLPackage.getMainDocumentPart().addTargetPart(bPart);
    newRe.setId(id);
    newRe.setType(re.getType());
    //////////////////////////////////////////////////////////////////////////////
    9dda16ecb72b:@igool 我写了一个拆分的程序,可是拆分之后图片显示不出来,你拆分的时候图片怎么处理的
    igool:@9dda16ecb72b 有的,但不方便透露:blush:

本文标题:利用docx4j来处理word的合并与拆分

本文链接:https://www.haomeiwen.com/subject/bfeflttx.html