1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > JAVA开发一个合并单元格报表_9 docx4j实现动态表格(编程式)单元格合并

JAVA开发一个合并单元格报表_9 docx4j实现动态表格(编程式)单元格合并

时间:2020-07-01 22:32:37

相关推荐

JAVA开发一个合并单元格报表_9 docx4j实现动态表格(编程式)单元格合并

/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;

}

}

运行结果文件下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。