1. 程式人生 > >[簡單]poi word2007表格單元格合併

[簡單]poi word2007表格單元格合併

Java程式碼 

 收藏程式碼

  1. import java.io.FileOutputStream;  
  2. import java.math.BigInteger;  
  3.   
  4. import org.apache.poi.xwpf.usermodel.XWPFDocument;  
  5. import org.apache.poi.xwpf.usermodel.XWPFTable;  
  6. import org.apache.poi.xwpf.usermodel.XWPFTableCell;  
  7. import org.apache.poi.xwpf.usermodel.XWPFTableRow;  
  8. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;  
  9. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;  
  10. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;  
  11. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;  
  12. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;  
  13. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;  
  14. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;  
  15. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;  
  16. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;  
  17. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;  
  18. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;  
  19.   
  20. public class POI_表格合併_S3_Test {  
  21.     public static void main(String[] args) throws Exception {  
  22.         POI_表格合併_S3_Test t=new POI_表格合併_S3_Test();  
  23.         XWPFDocument document = new XWPFDocument();  
  24.         t.megerTableCell(document);  
  25.         t.saveDocument(document, "f:/saveFile/temp/sys_"+ System.currentTimeMillis() + ".docx");  
  26.     }  
  27.   
  28.     public void megerTableCell(XWPFDocument document) {  
  29.         XWPFTable table1 = document.createTable(6, 8);   
  30.         setTableWidth(table1, "8000");  
  31.         fillTable(table1);  
  32.         mergeCellsVertically(table1, 1, 1,4);  
  33.         mergeCellsVertically(table1, 4, 2, 4);  
  34.         mergeCellsHorizontal(table1,0,3,5);  
  35.         mergeCellsHorizontal(table1,2,2,3);  
  36.         mergeCellsHorizontal(table1,2,6,7);  
  37.     }  
  38.   
  39.     public  void fillTable(XWPFTable table) {  
  40.         for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) {  
  41.             XWPFTableRow row = table.getRow(rowIndex);  
  42.             row.setHeight(380);  
  43.             for (int colIndex = 0; colIndex < row.getTableCells().size(); colIndex++) {  
  44.                 XWPFTableCell cell = row.getCell(colIndex);  
  45.                 if(rowIndex%2==0){  
  46.                      setCellText(cell, " cell " + rowIndex + colIndex + " ", "D4DBED", 1000);  
  47.                 }else{  
  48.                      setCellText(cell, " cell " + rowIndex + colIndex + " ", "AEDE72", 1000);  
  49.                 }  
  50.             }  
  51.         }  
  52.     }  
  53.       
  54.     public  void setCellText(XWPFTableCell cell,String text, String bgcolor, int width) {  
  55.         CTTc cttc = cell.getCTTc();  
  56.         CTTcPr cellPr = cttc.addNewTcPr();  
  57.         cellPr.addNewTcW().setW(BigInteger.valueOf(width));  
  58.         //cell.setColor(bgcolor);  
  59.         CTTcPr ctPr = cttc.addNewTcPr();  
  60.         CTShd ctshd = ctPr.addNewShd();  
  61.         ctshd.setFill(bgcolor);  
  62.         ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);  
  63.         cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);  
  64.         cell.setText(text);  
  65.     }  
  66.       
  67.   
  68.     /** 
  69.      * @Description: 跨列合併 
  70.      */  
  71.     public  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {  
  72.         for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {  
  73.             XWPFTableCell cell = table.getRow(row).getCell(cellIndex);  
  74.             if ( cellIndex == fromCell ) {  
  75.                 // The first merged cell is set with RESTART merge value  
  76.                 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);  
  77.             } else {  
  78.                 // Cells which join (merge) the first one, are set with CONTINUE  
  79.                 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);  
  80.             }  
  81.         }  
  82.     }  
  83.       
  84.     /** 
  85.      * @Description: 跨行合併 
  86.      * @see http://stackoverflow.com/questions/24907541/row-span-with-xwpftable 
  87.      */  
  88.     public  void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {  
  89.         for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {  
  90.             XWPFTableCell cell = table.getRow(rowIndex).getCell(col);  
  91.             if ( rowIndex == fromRow ) {  
  92.                 // The first merged cell is set with RESTART merge value  
  93.                 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);  
  94.             } else {  
  95.                 // Cells which join (merge) the first one, are set with CONTINUE  
  96.                 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);  
  97.             }  
  98.         }  
  99.     }  
  100.       
  101.     public void setTableWidth(XWPFTable table,String width){  
  102.         CTTbl ttbl = table.getCTTbl();  
  103.         CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();  
  104.         CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();  
  105.         CTJc cTJc=tblPr.addNewJc();  
  106.         cTJc.setVal(STJc.Enum.forString("center"));  
  107.         tblWidth.setW(new BigInteger(width));  
  108.         tblWidth.setType(STTblWidth.DXA);  
  109.     }  
  110.       
  111.     public void saveDocument(XWPFDocument document, String savePath)  
  112.             throws Exception {  
  113.         FileOutputStream fos = new FileOutputStream(savePath);  
  114.         document.write(fos);  
  115.         fos.close();  
  116.     }  
  117. }  

   結果如下: