`
53873039oycg
  • 浏览: 823915 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]poi word2007表格单元格合并

    博客分类:
  • poi
 
阅读更多

        代码参考了http://stackoverflow.com/questions/24907541/row-span-with-xwpftable,代码如下

       

import java.io.FileOutputStream;
import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;

public class POI_表格合并_S3_Test {
	public static void main(String[] args) throws Exception {
		POI_表格合并_S3_Test t=new POI_表格合并_S3_Test();
		XWPFDocument document = new XWPFDocument();
		t.megerTableCell(document);
		t.saveDocument(document, "f:/saveFile/temp/sys_"+ System.currentTimeMillis() + ".docx");
	}

	public void megerTableCell(XWPFDocument document) {
		XWPFTable table1 = document.createTable(6, 8); 
		setTableWidth(table1, "8000");
        fillTable(table1);
        mergeCellsVertically(table1, 1, 1,4);
        mergeCellsVertically(table1, 4, 2, 4);
        mergeCellsHorizontal(table1,0,3,5);
        mergeCellsHorizontal(table1,2,2,3);
        mergeCellsHorizontal(table1,2,6,7);
	}

	public  void fillTable(XWPFTable table) {
        for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) {
            XWPFTableRow row = table.getRow(rowIndex);
            row.setHeight(380);
            for (int colIndex = 0; colIndex < row.getTableCells().size(); colIndex++) {
                XWPFTableCell cell = row.getCell(colIndex);
                if(rowIndex%2==0){
                	 setCellText(cell, " cell " + rowIndex + colIndex + " ", "D4DBED", 1000);
                }else{
                	 setCellText(cell, " cell " + rowIndex + colIndex + " ", "AEDE72", 1000);
                }
            }
        }
    }
	
	public  void setCellText(XWPFTableCell cell,String text, String bgcolor, int width) {
		CTTc cttc = cell.getCTTc();
		CTTcPr cellPr = cttc.addNewTcPr();
		cellPr.addNewTcW().setW(BigInteger.valueOf(width));
		//cell.setColor(bgcolor);
		CTTcPr ctPr = cttc.addNewTcPr();
		CTShd ctshd = ctPr.addNewShd();
		ctshd.setFill(bgcolor);
		ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
		cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
		cell.setText(text);
	}
	

	/**
	 * @Description: 跨列合并
	 */
	public  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if ( cellIndex == fromCell ) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
	
	/**
	 * @Description: 跨行合并
	 * @see http://stackoverflow.com/questions/24907541/row-span-with-xwpftable
	 */
    public  void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if ( rowIndex == fromRow ) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    
	public void setTableWidth(XWPFTable table,String width){
		CTTbl ttbl = table.getCTTbl();
		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
		CTJc cTJc=tblPr.addNewJc();
		cTJc.setVal(STJc.Enum.forString("center"));
		tblWidth.setW(new BigInteger(width));
		tblWidth.setType(STTblWidth.DXA);
	}
	
	public void saveDocument(XWPFDocument document, String savePath)
			throws Exception {
		FileOutputStream fos = new FileOutputStream(savePath);
		document.write(fos);
		fos.close();
	}
}

   结果如下

  

 

   全文完

 

  • 大小: 52 KB
分享到:
评论
6 楼 lu438248129 2017-09-14  
楼主  为啥我用你的代码,跨列的合并没问题,但是跨行的合并有问题,例如第一行,第4,5,6列就无法合并?是用的poi版本的问题?
5 楼 h702109382 2017-08-30  
很好的资源,谢谢
4 楼 xiaolei1004 2016-10-28  
very good!!![b][/b]
3 楼 huanyue6660 2016-08-05  
拖动表格的时候列会还原,这是怎么回事?
2 楼 since2014 2015-04-21  
奥,我找到原因了,我使用wps打开就出现问题,用office打开就是正常的
1 楼 since2014 2015-04-21  
运行你上面的就能出来你图片中的表格?为什么我用你的代码出来的表格没有颜色,列宽也不正常?

相关推荐

Global site tag (gtag.js) - Google Analytics