Docx4j开发手册-6|Docx4j的表格

一、创建表格

创建一个一行三列的表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void main(String[] args) throws Exception {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();

// 创建表格对象
ObjectFactory objectFactory = new ObjectFactory();
Tbl tbl = objectFactory.createTbl();

// 将表格添加到文档中
mainDocumentPart.getContent().add(tbl);

// 生成表格行对象
Tr tr = objectFactory.createTr();
// 将表格行对象添加到表格对象中
tbl.getContent().add(tr);

// 生成单元格对象
for (int i = 0; i < 3; i++) {
Tc tc = objectFactory.createTc();
Text text = objectFactory.createText();
text.setValue("单元格" + (i + 1));
R r = objectFactory.createR();
r.getContent().add(text);
P p = objectFactory.createP();
p.getContent().add(r);
tc.getContent().add(p);
// 将单元格对象添加到表格行对象中
tr.getContent().add(tc);
}
// 设置表格属性
setTablePr(tbl);

wordMLPackage.save(new File("D:/xxx.docx"));
}

二、设置表格属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public static void setTablePr(Tbl tbl) {
// 表格属性
TblPr tblPr = new TblPr();
TblBorders tblBorders = new TblBorders();

// 设置边距
CTBorder ctBorder = new CTBorder();
// 设置边框样式为单线
ctBorder.setVal(STBorder.SINGLE);
// 设置边框颜色
ctBorder.setColor("000000");
// 设置边框大小(以半点为单位)
ctBorder.setSz(BigInteger.valueOf(2));
// 设置顶部边框
tblBorders.setTop(ctBorder);
// 设置底部边框
tblBorders.setBottom(ctBorder);
// 设置左侧边框
tblBorders.setLeft(ctBorder);
// 设置右侧边框
tblBorders.setRight(ctBorder);
// 设置内部横向
tblBorders.setInsideH(ctBorder);
// 设置内部纵向
tblBorders.setInsideV(ctBorder);
tblPr.setTblBorders(tblBorders);

// 创建一个表格宽度对象
tblPr.setTblW(new TblWidth());
// 设置表格宽度为5000 TWIPs
tblPr.getTblW().setW(BigInteger.valueOf(5000));
// 设置宽度单位为DXA(像素)
tblPr.getTblW().setType("dxa");

// 设置表格居中对齐
tblPr.setJc(new Jc());
tblPr.getJc().setVal(JcEnumeration.CENTER);

tbl.setTblPr(tblPr);
}

三、设置单元格属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void setCellPr(Tc tc) {
TcPr tcPr = tc.getTcPr();
// 文本的垂直对齐方式
tcPr.setVAlign(new CTVerticalJc());
tcPr.getVAlign().setVal(STVerticalJc.TOP);
tcPr.getVAlign().setVal(STVerticalJc.CENTER);
tcPr.getVAlign().setVal(STVerticalJc.BOTTOM);

// 单元格的填充背景色
tcPr.setShd(new CTShd());
tcPr.getShd().setFill("FF0000");

// 文本自动换行(默认自动换行)
ObjectFactory objectFactory = new ObjectFactory();
tcPr.setNoWrap(objectFactory.createBooleanDefaultTrue());
}

四、合并单元格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class TableMergeTest {
public static void main(String[] args) throws Exception {
// 创建一个新的Word文档
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();

// 创建一个包含两行两列的表格
Tbl table = createTable();
TableTest.setTablePr(table);
mainDocumentPart.addObject(table);

// 合并第一行的两个单元格
mergeTableCells(table, 0, 0, 1);

// 保存文档
wordMLPackage.save(new File("D:/Desktop/TempFile/newReport/表格文档/" + DateUtil.format(new DateTime(), "yyyyMMdd-HH-mm-ss") + ".docx"));
}

private static Tbl createTable() {
ObjectFactory factory = new ObjectFactory();
Tbl table = factory.createTbl();

// 创建第一行
Tr row1 = factory.createTr();
addTableCell(row1, "Cell 1");
addTableCell(row1, "Cell 2");
table.getContent().add(row1);

// 创建第二行
Tr row2 = factory.createTr();
addTableCell(row2, "Cell 3");
addTableCell(row2, "Cell 4");
table.getContent().add(row2);

return table;
}

/**
* 创建单元格添加到表格行对象
*
* @param row 行对象
* @param content 单元格内容
*/
private static void addTableCell(Tr row, String content) {
ObjectFactory factory = new ObjectFactory();
Tc cell = factory.createTc();
P paragraph = factory.createP();
Text text = factory.createText();
text.setValue(content);
R r = factory.createR();
r.getContent().add(text);
paragraph.getContent().add(r);
cell.getContent().add(paragraph);
row.getContent().add(cell);
}

/**
* 合并单元格
*
* @param table 表格对象
* @param rowIndex 行索引
* @param cellStartIndex 单元格开始索引
* @param cellEndIndex 单元格结束索引
*/
private static void mergeTableCells(Tbl table, int rowIndex, int cellStartIndex, int cellEndIndex) {
List<Object> rows = table.getContent();
if (rowIndex < rows.size()) {
Tr row = (Tr) rows.get(rowIndex);
List<Object> cells = row.getContent();

// 合并单元格
for (int i = cellStartIndex + 1; i <= cellEndIndex; i++) {
TcPr tcPr = getOrCreateTcPr((Tc) cells.get(cellStartIndex));
TcPrInner.GridSpan gridSpan = new TcPrInner.GridSpan();
gridSpan.setVal(BigInteger.valueOf(cellEndIndex - cellStartIndex + 1));
tcPr.setGridSpan(gridSpan);
cells.remove(cellStartIndex + 1);
// 移除多余的单元格
}
}
}

/**
* 判断是否存在单元格属性对象
*
* @param cell
* @return
*/
private static TcPr getOrCreateTcPr(Tc cell) {
TcPr tcPr = cell.getTcPr();
if (tcPr == null) {
tcPr = new TcPr();
cell.setTcPr(tcPr);
}
return tcPr;
}
}