最近需要用docx4j来对docx进行一些操作,用到的技术是docx4j,这个技术在国内其实用的不是很多,看了一些博主的文章,有些感悟,做了一些总结,如果有疑问或错误之处欢迎交流。

创建包:

WordprocessingMLPackage wordMLPackage =WordprocessingMLPackage.createPackage();

保存包:

wordMLPackage.save(new java.io.File("C://xxx.docx"));

得到主段落,并且输出/带样式输出:

MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello Word!");

wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Title", "Hello Word!"); wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Subtitle"," a subtitle!");

创建表格并添加内容:

ObjectFactory factory=Context.getWmlObjectFactory();

Tbl table = factory.createTbl();

Tr tableRow = factory.createTr();

Tc tableCell = factory.createTc();

tableCell.getContent().add(wordMLPackage.getMainDocumentPart().createParagraphOfText("Field 1"));

tableRow.getContent().add(tableCell);

table.getContent().add(tableRow);

wordMLPackage.getMainDocumentPart().addObject(table);

先创建一个工厂,(需要导入的包是org.docx4j.wml,导错的的话下面全错)创建表格,在创建行和单元格(tableCell),在单元格里添加你想要的内容,因为返回值是Object,只能通过这种方式传入数据,最后层层退回去,用add添加,最后在主段落添加。

编辑表格样式:

table.setTblPr(new TblPr());

CTBorder border = new CTBorder();

border.setColor("auto");

border.setSz(new BigInteger("4"));

TblBorders borders = new TblBorders();

borders.setBottom(border);

borders.setLeft(border);

borders.setInsideV(border);

table.getTblPr().setTblBorders(borders);先创建table样式对象,在用CTBorder对象规定样式规范,用TblBorders对象将样式规范应用进去。

创建 段落/运行块/运行块属性/文本 对象:

ObjectFactory factory=Context.getWmlObjectFactory();

P paragraph = factory.createP();

Text text = factory.createText();

text.setValue(content);

R run = factory.createR();

run.getContent().add(text);

paragraph.getContent().add(run);

RPr runProperties = factory.createRPr();

run.setRPr(runProperties);

tableCell.getContent().add(paragraph);

P是一个段落,Text是文本的值对象,R是一个运行块,负责便于将多个属性相同的Text对象统一操作,RPr是运行块的属性,可以对R对象进行操作。简单的说几个对象之间的关系可以这么理解:Tc tableCell > P paragraph > R run > Text text。其中,run.setRPr(RPr runProperties)可以设置块中属性。个人认为用开始的方法输入内容,在某种程度上是和上述代码做了一样的工作,效果相同。

加粗字体和调整字体大小:

HpsMeasure size = new HpsMeasure();

size.setVal(new BigInteger("40"));

runProperties.setSz(size);

runProperties.setSzCs(size);

BooleanDefaultTrue b = new BooleanDefaultTrue();

b.setVal(true);

runProperties.setB(b);

思路是先创建各自的对象,设置对象的值为自己想要的情况,再用RPr的对象来set相应的属性。其中注意setVal中的值最后会被现实一半,所以只有字体20大小。

纵向合并单元格:

Tc tableCell = factory.createTc();

TcPr tableCellProperties = new TcPr();

VMerge merge = new VMerge();

merge.setVal("restart");

tableCellProperties.setVMerge(merge);

tableCell.setTcPr(tableCellProperties);

tableCell.getContent().add(wordMLPackage.getMainDocumentPart().createParagraphOfText(content));

row.getContent().add(tableCell);

先创建单元格属性,再创建VMerge对象,如果设置merge则为向上合并,如果将merge属性设为restart则重新开始新的单元格。

设置单元格宽度:

TcPr tableCellProperties = new TcPr();

TblWidth tableWidth = new TblWidth();

tableWidth.setW(BigInteger.valueOf("50"));

tableCellProperties.setTcW(tableWidth);

tableCell.setTcPr(tableCellProperties);

先创建单元格属性对象,创建Tblwidth对象并且设置宽度,用单元格属性对象通过方法调用Tblwidth对象。

添加图片:

File file = new File("c:\\a.jpg");

BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, file);

int docPrId = 1;

int cNvPrId = 2;

Inline inline = imagePart.createImageInline("Filename hint","Alternative text", docPrId, cNvPrId, false);

ObjectFactory factory = new ObjectFactory();

P paragraph = factory.createP();

R run = factory.createR();

paragraph.getContent().add(run);

Drawing drawing = factory.createDrawing();

run.getContent().add(drawing);

drawing.getAnchorOrInline().add(inline);

wordMLPackage.getMainDocumentPart().addObject(paragraph);

打开文件,通过imagePart将图片读进去,现在图片被转换成二进制,为了能在文件中内联中显示出图片,调用函数将图片存在inline中。之后paragraph,run,drawing,用drawing读inline,方法同上。

加载读入docx文件:

WordprocessingMLPackage template = WordprocessingMLPackage.load(new File("c:\\a.docx"));

获取文档中所有内容(方法):

private static List getAllElementFromObject(Object obj, Class> toSearch) {

List result = new ArrayList();

if (obj instanceof JAXBElement)

obj = ((JAXBElement>) obj).getValue();

if (obj.getClass().equals(toSearch))

result.add(obj);

else if (obj instanceof ContentAccessor) {

List> children = ((ContentAccessor) obj).getContent();

for (Object child : children) {

result.addAll(getAllElementFromObject(child, toSearch));

}

}

return result;

}

通过对类型的判断,将obj的内容分类读到List中,最后将内容按照列表的顺序贮存,如果obj是JAXB的一个实例就将他转型获取值,如果是和第二个参数的类型相同就添加,如果是ContentAccessor的一个对象,就将对象中的内容存到另外的一个列表中,再次调用自己将全部元素添加到原来的List中,返回一个List。

java docx4j_docx4j基本操作相关推荐

  1. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

  2. OPencv java Mat 基本操作像素点(7)

    前面我们说到了用Mat类进行行列式的计算,可能在OPenCv中不算太实用,那么今天我们介绍一个比较使用的,图片中的像素点 我们知道OpenCv当我们read一个图片的时候,返回的结果是一个Mat 一. ...

  3. c++创建文件_JavaNote 文件系统及Java文件基本操作

    文件概述 文件系统是由OS(操作系统)管理的: 文件系统和Java进程是平行的,是两套系统: 文件系统是由文件夹和文件递归组合而成: 文件目录分隔符 Linux/Unix 用/隔开 Windows用隔 ...

  4. 图解java链表基本操作篇一(头插法和尾插法)

    整体代码结构定义 public class LinkedListTest <E>{} 节点数据存储定义 这样子定义只是为了可以方便地创建双向链表,循环链表,不影响单链表的创建,在创建链表的 ...

  5. Java字符串基本操作

    目录  1.字符串连接(两种)  2.字符串比较  3.字符串截取  4.字符串查找  5.字符串替换  6.字符串与字符数组 1.字符串连接 第一种就是我们常用的 + 连接 public class ...

  6. 我知道java的基本操作 日语翻译_日语文档怎么翻译?我来教会你日语翻译

    小编是一个资深日漫迷,但是每次去看完日漫电影都觉得结尾留有遗憾.其实有很多日漫电影的内容都被修改了.为了能看到原版的日漫内容,小编终于从网上找到了一些有关原版日漫故事情节的文档.可是全都是日语,我一句 ...

  7. MySQL关联eclipse_MySQL JDBC 连接数据库基本操作

    JDBC(Java DataBase Connectivity,java数据库连接)基本操作 废话不多说,直接开始把~~~~~~~ 一.下载驱动(MySql为例,oracle同理操作) ①通过Bing ...

  8. java中的数组增删查改操作,java数组实现增删改查

    java 实现动态数组,Java工具类Arrays中不得不知的常用方法,数组实现队列java,java数组实现增删改查 java 增删改查代码 import java.sql.Connection; ...

  9. 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)

    作者 l 程序员小跃 来源 l 程序员小跃(ID:runningdimple) 大家好,我是程序员小跃,一名在职场已经写了 6 年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的 ...

  10. 两万字长文总结,梳理 Java 入门进阶那些事(推荐收藏)

    大家好,我是程序员小跃,一名在职场已经写了6年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的Java后端架构,对Java还是相对了解的挺多. 大概是半年前吧,在知乎上有个知友私 ...

最新文章

  1. SAP System Copy Guide, ECC 6.0, Oracle
  2. Nacos源码集群一致性
  3. ubuntu安装-Caffe依赖
  4. 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
  5. java 读取webapp文件_在Java Webapp和Java Normal应用中读取公共外部属性文件
  6. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
  7. 【Angular专题】——(1)Angular,孤傲的变革者
  8. 1067. Sort with Swap(0,*) (25)
  9. Android攻略--单位转化器UC--Units Converter(学习笔记)
  10. XenServer学习笔记1虚拟磁盘和虚拟内存
  11. matlab对数画图命令,MATLAB命令画图
  12. unity3D人物动画
  13. 泛微 linux mobile手册,泛微E-Mobile5.0服务端安装手册.doc
  14. 华为云空间 微信聊天记录_微信聊天记录云同步!用了这个方法,再也不怕聊天记录丢失...
  15. 泰勒级数和幂级数(如何解题)
  16. Linux 远程连接Windows执行命令方法总结
  17. 智能终端代替传统设备 手机APP离线识别车牌号
  18. 怎么用计算机画正弦函数图像,怎样用几何画板作正弦函数图象
  19. 电信增值短信平台软件模块清单(sp专用)
  20. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建

热门文章

  1. 获取百度云盘真实下载链接(告别云盘客户端,全速下载)
  2. 通过链接下载文件并保存到本地
  3. 硬盘安装助手安装苹果Mac系统镜像Change partition type to AF: not a HFS partition的解决方法
  4. 有什么软件可以快速测试到苹果,苹果官方App测试工具TestFlight
  5. 25个常用的正则表达式汇总
  6. 网页爬取常用正则表达式的介绍
  7. springboot网上订餐管理系统设计与实现.rar(项目源码)
  8. lnmp一键安装包 php7,LNMP一键安装包 V1.7 正式版发布
  9. 微信小程序上传图片(限制图片大小、张数)
  10. win10 FTP搭建全过程