前言
使用java操作word使用的是java开源项目docx4j,在学习docx的使用过程中,参考了大牛的链接,下面放上我参考过的网址:
上面的博主翻译了一系列国外大神的博客,直接在他博客里面查找就行了,下面开始讲解一下我对docx的理解
word基本格式
一个编辑过的word文档可以直接使用winRAR打开,打开之后,可以看到里面有许许多多的xml文件,其中有一个叫做document.xml的文件就是你编辑的word文档,如下:
好像word的保存格式是基于openXML的一个东东的,具体的我也不太清楚,就不多说了
docx4j的使用
前面讲了那么多关于word的,docx4j是个什么东西呢?
docx4j是一个用于创建和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和 Excel xlsx)文件的Java类库。
—————————以上摘自百度百科
我在上面显示出来的表格就是使用docx4j创建的,既然需要创建一个word里面的表格,那么需要用到下面一些类:
- WordprocessingMLPackage : 整个word的生成就是它实现的
- MainDocumentPart: 存有docx4j里面的许多对象,例如后面要讲到的Tbl、Tr等等,WordprocessingMLPackage就是将这个对象转换成word
- Tbl :表格对象
- TblPr:表格的属性,可以用来设置看边框
- Tr : 表格里面的行
- Tc : 表格里面的列
- TcPr:表格列的属性
- P : 一个文本端
- R:一个运行块(貌似就是一段设置了styled的文本)
- RPr:R对象的属性
- Text:一段文本
- VMerge:一个合并对象,这个对象由TcPr对象设置,如果不调用VMerge.setVal(“restart”),那么这个这一列下面的行都会被当前列合并
- RFont:设置选中的文本的字体,通常由RPr设置
- BooleanDefaultTrue:是否加粗,通常由RPr设置
- U:是否加下划线,通常由RPr设置
- HpsMeasure:字体大小,通常由RPr设置
上面是一些基本的对象,创建表格的步骤通常是先创建表格对象、然后创建行对象、再创建列对象,添加的顺序也是表格添加行、行添加列,这就类似二维数组的概念了,java里面只有一维数组,一维数组里面再有一维数组,然后就构成了二维数组,这个也是类似,表格里面只有行,行里面再有列,就构成了二维表格。
如果只要创建普通的表格,表格里面没有什么要求(例如文本加粗、加下划线、设置字体、设置字体大小)的话,可以直接使用Tc.getContent().add(P),就可以创建一列了:
private static void addTableCell(Tr tableRow, String content, int width) {
//使用object factory创建表格列
Tc tableCell = factory.createTc();
tableCell.getContent().add(pack.getMainDocumentPart().createParagraphOfText(content));
//设置列宽
setCellWidth(tableCell, width);
tableRow.getContent().add(tableCell);
}
设置列宽使用TcPr属性做的:
private static void setCellWidth(Tc tableCell, int width) {
TcPr properties = tableCell.getTcPr();
if( properties == null) {
properties = new TcPr();
}
TblWidth columnWidth = new TblWidth();
columnWidth.setW(BigInteger.valueOf(width));
properties.setTcW(columnWidth);
tableCell.setTcPr(properties);
}
上面是创建普通文本的表格列,下面创建带各种格式的文本的表格列,思路 是先创建一个P对象,然后再创建一个R对象,因为R对象是一个可以拥有样式的文本,叫做运行块(参考博主的翻译),然后通过列添加P,P添加R,R添加Text,这样就可以实现带样式的文本列了:
private static void addTableCell(Tr tableRow, String content, int width, boolean bold, int fontSize) {
Tc tableCell = factory.createTc();
P paragraph = factory.createP();
R run = factory.createR();
Text text = factory.createText();
text.setValue(content);
run.getContent().add(text);
paragraph.getContent().add(run);
//创建R的属性
RPr properties = factory.createRPr();
if( bold ) {
//设置是否加粗
BooleanDefaultTrue b = new BooleanDefaultTrue();
b.setVal(bold);
properties.setB(b);
}
//设置字体大小
HpsMeasure size = new HpsMeasure();
size.setVal(BigInteger.valueOf(fontSize));
properties.setSz(size);
properties.setSzCs(size);
run.setRPr(properties);
tableCell.getContent().add(paragraph);
//设置宽度
setCellWidth(tableCell, width);
tableRow.getContent().add(tableCell);
}
创建合并列,应用场景,例如,一共有两行三列,其中第一列的一二行合并,那么实现这种方式可以使用VMerger对象,只要第一列的一二行都设置VMerge属性,那么就可以实现一二行合并,当然第一行要设置VMerge.setVal(“restart”)方法,这样第一行的列内容就会显示,第二行不设置这个值,就算往列里面添加内容也不会显示:
private static void addMergeCell(Tr tableRow, String content, boolean merge, int width) {
Tc tableCell = factory.createTc();
TcPr prop = new TcPr();
//创建合并对象
VMerge mergeObj = new VMerge();
if( merge ) {
mergeObj.setVal("restart");
}
prop.setVMerge(mergeObj);
tableCell.setTcPr(prop);
setCellWidth(tableCell, width);
tableCell.getContent().add(pack.getMainDocumentPart().
createParagraphOfText(content));
tableRow.getContent().add(tableCell);
}
实现结果
最后的实现结果上面的图片就是一部分内容,还有最下面的一部分带格式的表格:
代码链接
下面附上代码连接:点我下载