java docx4j_docx4j基本操作
最近需要用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基本操作相关推荐
- 黑马程序员并发编程笔记(二)--java线程基本操作和理解
3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...
- OPencv java Mat 基本操作像素点(7)
前面我们说到了用Mat类进行行列式的计算,可能在OPenCv中不算太实用,那么今天我们介绍一个比较使用的,图片中的像素点 我们知道OpenCv当我们read一个图片的时候,返回的结果是一个Mat 一. ...
- c++创建文件_JavaNote 文件系统及Java文件基本操作
文件概述 文件系统是由OS(操作系统)管理的: 文件系统和Java进程是平行的,是两套系统: 文件系统是由文件夹和文件递归组合而成: 文件目录分隔符 Linux/Unix 用/隔开 Windows用隔 ...
- 图解java链表基本操作篇一(头插法和尾插法)
整体代码结构定义 public class LinkedListTest <E>{} 节点数据存储定义 这样子定义只是为了可以方便地创建双向链表,循环链表,不影响单链表的创建,在创建链表的 ...
- Java字符串基本操作
目录 1.字符串连接(两种) 2.字符串比较 3.字符串截取 4.字符串查找 5.字符串替换 6.字符串与字符数组 1.字符串连接 第一种就是我们常用的 + 连接 public class ...
- 我知道java的基本操作 日语翻译_日语文档怎么翻译?我来教会你日语翻译
小编是一个资深日漫迷,但是每次去看完日漫电影都觉得结尾留有遗憾.其实有很多日漫电影的内容都被修改了.为了能看到原版的日漫内容,小编终于从网上找到了一些有关原版日漫故事情节的文档.可是全都是日语,我一句 ...
- MySQL关联eclipse_MySQL JDBC 连接数据库基本操作
JDBC(Java DataBase Connectivity,java数据库连接)基本操作 废话不多说,直接开始把~~~~~~~ 一.下载驱动(MySql为例,oracle同理操作) ①通过Bing ...
- java中的数组增删查改操作,java数组实现增删改查
java 实现动态数组,Java工具类Arrays中不得不知的常用方法,数组实现队列java,java数组实现增删改查 java 增删改查代码 import java.sql.Connection; ...
- 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)
作者 l 程序员小跃 来源 l 程序员小跃(ID:runningdimple) 大家好,我是程序员小跃,一名在职场已经写了 6 年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的 ...
- 两万字长文总结,梳理 Java 入门进阶那些事(推荐收藏)
大家好,我是程序员小跃,一名在职场已经写了6年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的Java后端架构,对Java还是相对了解的挺多. 大概是半年前吧,在知乎上有个知友私 ...
最新文章
- SAP System Copy Guide, ECC 6.0, Oracle
- Nacos源码集群一致性
- ubuntu安装-Caffe依赖
- 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
- java 读取webapp文件_在Java Webapp和Java Normal应用中读取公共外部属性文件
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
- 【Angular专题】——(1)Angular,孤傲的变革者
- 1067. Sort with Swap(0,*) (25)
- Android攻略--单位转化器UC--Units Converter(学习笔记)
- XenServer学习笔记1虚拟磁盘和虚拟内存
- matlab对数画图命令,MATLAB命令画图
- unity3D人物动画
- 泛微 linux mobile手册,泛微E-Mobile5.0服务端安装手册.doc
- 华为云空间 微信聊天记录_微信聊天记录云同步!用了这个方法,再也不怕聊天记录丢失...
- 泰勒级数和幂级数(如何解题)
- Linux 远程连接Windows执行命令方法总结
- 智能终端代替传统设备 手机APP离线识别车牌号
- 怎么用计算机画正弦函数图像,怎样用几何画板作正弦函数图象
- 电信增值短信平台软件模块清单(sp专用)
- ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建
热门文章
- 获取百度云盘真实下载链接(告别云盘客户端,全速下载)
- 通过链接下载文件并保存到本地
- 硬盘安装助手安装苹果Mac系统镜像Change partition type to AF: not a HFS partition的解决方法
- 有什么软件可以快速测试到苹果,苹果官方App测试工具TestFlight
- 25个常用的正则表达式汇总
- 网页爬取常用正则表达式的介绍
- springboot网上订餐管理系统设计与实现.rar(项目源码)
- lnmp一键安装包 php7,LNMP一键安装包 V1.7 正式版发布
- 微信小程序上传图片(限制图片大小、张数)
- win10 FTP搭建全过程