/information/viewInformation/other/258.a
凡是表格都会涉及到单元格合并效果,本篇文章主要是以编程式的方式给大家实现一些单元格合并的效果,包括有横向合并、纵向合并、多列(既包括横向也包含纵向)合并,在示例中我先用编程式的方式创建一个表格作为原表格,并且设置这个表格边框及背景色(待合并区域均有背景色区分),再创建一个表格用作于单元格合并,直接上截图和代码,参考如下:
待合并表格效果
合并后的表格效果
参考代码为:
packagecn.chendd.docx4j.examples;
importjava.io.File;
importjava.math.BigInteger;
importorg.docx4j.jaxb.Context;
importorg.docx4j.openpackaging.packages.WordprocessingMLPackage;
importorg.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
importorg.docx4j.wml.CTBorder;
importorg.docx4j.wml.CTShd;
importorg.docx4j.wml.CTVerticalJc;
importorg.docx4j.wml.Jc;
importorg.docx4j.wml.JcEnumeration;
importorg.docx4j.wml.ObjectFactory;
importorg.docx4j.wml.P;
importorg.docx4j.wml.PPr;
importorg.docx4j.wml.STBorder;
importorg.docx4j.wml.STShd;
importorg.docx4j.wml.STVerticalJc;
importorg.docx4j.wml.Tbl;
importorg.docx4j.wml.TblBorders;
importorg.docx4j.wml.TblPr;
importorg.docx4j.wml.TblWidth;
importorg.docx4j.wml.Tc;
importorg.docx4j.wml.TcPr;
importorg.docx4j.wml.TcPrInner.HMerge;
importorg.docx4j.wml.TcPrInner.TcBorders;
importorg.docx4j.wml.TcPrInner.VMerge;
importorg.docx4j.wml.Tr;
publicclassTableMergeTest {
publicstaticvoidmain(String[] args)throwsException {
WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
ObjectFactory objectFactory = Context.getWmlObjectFactory();
mainDocumentPart.addStyledParagraphOfText("Subtitle","创建原始Table表格");
//创建一个原始的table
Tbl dataTable =createDataTable(mainDocumentPart, objectFactory);
mainDocumentPart.addObject(dataTable);
mainDocumentPart.addStyledParagraphOfText("Subtitle","创建合并单元格Table表格");
//创建一个表格,用于合并单元格,方便
Tbl mergeTable =createDataTable(mainDocumentPart, objectFactory);
mainDocumentPart.addObject(mergeTable);
mergeTable1(mergeTable , wordPackage);
mergeTable2(mergeTable , wordPackage);
mergeTable3(mergeTable , wordPackage);
String outPath = System.getProperty("user.dir") +"/template/out/编程式表格--单元格合并.docx";
wordPackage.save(newFile(outPath));
}
//合并单元格第八九十行的,二三列,相当于是多列合并
privatestaticvoidmergeTable3(Tbl mergeTable,
WordprocessingMLPackage wordPackage) {
CTVerticalJc vjc =newCTVerticalJc();
vjc.setVal(STVerticalJc.CENTER);
//REMARK:先纵向合并再横向合并,或者先横向合并再纵向合并,都是可以的,某些地方的实现好像使用到了gridSpan函数
//先纵向合并单元格第7、8、9列
Tr tr = (Tr) mergeTable.getContent().get(7);
Tc beginTd = (Tc) tr.getContent().get(1);
VMerge merge =newVMerge();
merge.setVal("restart");
beginTd.getTcPr().setVMerge(merge);
beginTd.getTcPr().setVAlign(vjc);//上下垂直居中
Tr ttt = (Tr) mergeTable.getContent().get(8);
Tc aaa = (Tc) ttt.getContent().get(1);
VMerge ab =newVMerge();
ab.setVal("continue");
aaa.getTcPr().setVMerge(ab);
aaa.getTcPr().setVAlign(vjc);//上下垂直居中
Tr tr2 = (Tr) mergeTable.getContent().get(9);
Tc bbb = (Tc) tr2.getContent().get(1);
VMerge mm =newVMerge();
mm.setVal("continue");
bbb.getTcPr().setVMerge(mm);
bbb.getTcPr().setVAlign(vjc);//上下垂直居中
//横向合并第7行
intarrV1[][] =newint[][]{
{7,1},
{7,2}
};
intarrV2[][] =newint[][]{
{8,1},
{8,2}
};
intarrV3[][] =newint[][]{
{9,1},
{9,2}
};
//横向合并第7行
for(inti=0 ; i < arrV1.length; i++){
intays[] = arrV1[i];
Tr beginTr = (Tr) mergeTable.getContent().get(ays[0]);
Tc td = (Tc) beginTr.getContent().get(ays[1]);
HMerge vmerge =newHMerge();
if(i == 0){
vmerge.setVal("restart");
}else{
vmerge.setVal("continue");
}
td.getTcPr().setHMerge(vmerge);
td.getTcPr().setVAlign(vjc);//上下垂直居中
}
//横向合并第8行
for(inti=0 ; i < arrV2.length; i++){
intays[] = arrV2[i];
Tr beginTr = (Tr) mergeTable.getContent().get(ays[0]);
Tc td = (Tc) beginTr.getContent().get(ays[1]);
HMerge vmerge =newHMerge();
if(i == 0){
vmerge.setVal("restart");
}else{
vmerge.setVal("continue");
}
td.getTcPr().setHMerge(vmerge);
td.getTcPr().setVAlign(vjc);//上下垂直居中
}
//横向合并第9行
for(inti=0 ; i < arrV3.length; i++){
intays[] = arrV3[i];
Tr beginTr = (Tr) mergeTable.getContent().get(ays[0]);
Tc td = (Tc) beginTr.getContent().get(ays[1]);
HMerge vmerge =newHMerge();
if(i == 0){
vmerge.setVal("restart");
}else{
vmerge.setVal("continue");
}
td.getTcPr().setHMerge(vmerge);
td.getTcPr().setVAlign(vjc);//上下垂直居中
}
}
//合并单元格第六行的,所有格子
privatestaticvoidmergeTable2(Tbl mergeTable,
WordprocessingMLPackage wordPackage) {
Tr tr = (Tr) mergeTable.getContent().get(5);//第三行
Tc beginTd = (Tc) tr.getContent().get(0);
CTVerticalJc vjc =newCTVerticalJc();
vjc.setVal(STVerticalJc.CENTER);
beginTd.getTcPr().setVAlign(vjc);//上下垂直居中
HMerge beginMerge =newHMerge();
beginMerge.setVal("restart");
beginTd.getTcPr().setHMerge(beginMerge);
for(inti=1 ; i <= 3 ; i++){
Tc endTd = (Tc) tr.getContent().get(i);
HMerge endMerge =newHMerge();
endMerge.setVal("continue");
endTd.getTcPr().setHMerge(endMerge);
}
}
//合并单元格第二行与第三行的第一个格子,合并后将文本居中
privatestaticvoidmergeTable1(Tbl mergeTable , WordprocessingMLPackage wordPackage) {
Jc jc =newJc();
jc.setVal(JcEnumeration.LEFT);
mergeTable.getTblPr().setJc(jc);//设置表格居左
Tr beginTr = (Tr) mergeTable.getContent().get(2);//第三行
Tc beginTd = (Tc) beginTr.getContent().get(0);
VMerge beginMerge =newVMerge();
beginMerge.setVal("restart");
beginTd.getTcPr().setVMerge(beginMerge);
Tr endTr = (Tr) mergeTable.getContent().get(3);//第四行
Tc endTd = (Tc) endTr.getContent().get(0);
VMerge endMerge =newVMerge();
endMerge.setVal("continue");
endTd.getTcPr().setVMerge(endMerge);
CTVerticalJc vjc =newCTVerticalJc();
vjc.setVal(STVerticalJc.CENTER);
beginTd.getTcPr().setVAlign(vjc);//上下垂直居中
}
publicstaticTbl createDataTable(MainDocumentPart mainDocumentPart,
ObjectFactory objectFactory) {
Tbl table = objectFactory.createTbl();
//创建数据行
PPr ppr =newPPr();
Jc jc =newJc();
jc.setVal(JcEnumeration.CENTER);
ppr.setJc(jc);//单元格文本居中使用
/*Spacing spacing = new Spacing();
spacing.setAfter(BigInteger.ZERO);//删除创建段落P后的文本间距
ppr.setSpacing(spacing);*/
for(inti= 1 ; i <= 10 ; i++){
Tr dataTr = objectFactory.createTr();
for(intj=1 ; j <= 4 ; j++){
Tc tc = objectFactory.createTc();
tc.setTcPr(newTcPr());
String text = i +"_"+ j;
P p = mainDocumentPart.createParagraphOfText(text);//创建的段落P有后段文本的间距
if(i == 3 && j == 1){
text = (i - 1) +"_"+ j;
CTShd shd =newCTShd();
shd.setVal(STShd.CLEAR);
shd.setColor("auto");
shd.setFill("C00000");
tc.getTcPr().setShd(shd);
p = mainDocumentPart.createParagraphOfText(text);
p.setPPr(ppr);
}
if(i == 4 && j == 1){
text = (i - 2) +"_"+ j;
CTShd shd =newCTShd();
shd.setVal(STShd.CLEAR);
shd.setColor("auto");
shd.setFill("C00000");
tc.getTcPr().setShd(shd);
p = mainDocumentPart.createParagraphOfText(text);
p.setPPr(ppr);
}
if(i == 6){
text = i +"_"+ i;
CTShd shd =newCTShd();
shd.setVal(STShd.CLEAR);
shd.setColor("auto");
shd.setFill("FFC000");
tc.getTcPr().setShd(shd);
p = mainDocumentPart.createParagraphOfText(text);
p.setPPr(ppr);
}
if(i >= 8 && (j == 2 || j == 3)){
text = 8 +"_"+ 8;
CTShd shd =newCTShd();
shd.setVal(STShd.CLEAR);
shd.setColor("auto");
shd.setFill("00B050");
tc.getTcPr().setShd(shd);
p = mainDocumentPart.createParagraphOfText(text);
p.setPPr(ppr);
}
//设置文本居中
tc.getContent().add(p);
tc.getTcPr().setTcBorders(getTcBorders());
dataTr.getContent().add(tc);
}
table.getContent().add(dataTr);
}
table.setTblPr(newTblPr());
table.getTblPr().setTblBorders(getTblBorders());//设置表格线
table.getTblPr().setTblW(getTblWidth(8000));
returntable;
}
//设置表格宽度
privatestaticTblWidth getTblWidth(intw) {
TblWidth width =newTblWidth();
width.setW(BigInteger.valueOf(w));
width.setType(TblWidth.TYPE_DXA);
returnwidth;
}
//表格边框
privatestaticTblBorders getTblBorders() {
//构造边框样式
CTBorder border =newCTBorder();
border.setColor("red");
border.setSz(newBigInteger("4"));
border.setSpace(newBigInteger("0"));
border.setVal(STBorder.SINGLE);
//设置边框的上下左右边框
TblBorders borders =newTblBorders();
borders.setTop(border);
borders.setBottom(border);
borders.setLeft(border);
borders.setRight(border);
returnborders;
}
//单元格边框
privatestaticTcBorders getTcBorders() {
//构造边框样式
CTBorder border =newCTBorder();
border.setColor("blue");
border.setSz(newBigInteger("15"));
border.setSpace(newBigInteger("0"));
border.setVal(STBorder.SINGLE);
//设置边框的上下左右边框
TcBorders borders =newTcBorders();
borders.setTop(border);
borders.setBottom(border);
borders.setLeft(border);
borders.setRight(border);
returnborders;
}
}
运行结果文件下载