2013-04-13 21 views

risposta

7

Se sono stati creati tabella, riga all'interno di una tabella e la cella all'interno di una riga, è possibile aggiungere gridSpan alla cella proprietà:

if (cell.getCTTc().getTcPr() == null) cell.getCTTc().addNewTcPr(); 
if (cell.getCTTc().getTcPr().getGridSpan() == null) cell.getCTTc().getTcPr().addNewGridSpan(); 
cell.getCTTc().getTcPr().getGridSpan().setVal(2); 

Nota: cella è org.apache.poi.xwpf.usermodel.XWPFTableCell .

4

Creazione di un separato XWPFTable per ogni riga della tabella funzionerà e dovrebbe essere perfettamente soddisfacente. Tutte le tabelle sono unite dietro le quinte di una tabella nell'ultimo documento di parole. Avrete bisogno di tutti questi vasi, poi-3.9.jar, poi-ooxml-3.9.jar e poi-ooxml-schemas-3.9.jar

XWPFTable table1 = document.createTable(1,1); // This is your row 1 
XWPFTable table2 = document.createTable(1,3); // This is your row 2 

// Now it's time to span each column of table1 and table2 to a span of your choice 
// lets say 6 is the total span required assuming there's some row with 6 columns. 

spanCellsAcrossRow(table1, 0, 0, 6); 
spanCellsAcrossRow(table2, 0, 0, 2); 
spanCellsAcrossRow(table2, 0, 1, 2); 
spanCellsAcrossRow(table2, 0, 2, 2); 

private void spanCellsAcrossRow(XWPFTable table, int rowNum, int colNum, int span) { 
    XWPFTableCell cell = table.getRow(rowNum).getCell(colNum); 
    cell.getCTTc().getTcPr().addNewGridSpan(); 
    cell.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf((long)span)); 
} 
+0

Grazie !! Ha funzionato meravigliosamente. –

+0

Certo, ho votato questa risposta. Non penso che ci sia un modo in cui posso accettare come risposta, dal momento che non ho fatto la domanda originale. Fammi sapere se questo è effettivamente possibile. –

+0

Salve, ho provato a utilizzarlo e imposta correttamente lo span di una cella, ma ho lasciato le celle al di fuori della tabella (a destra) uguale alla dimensione di span. Ho provato a eliminarli rimuovendoli con XWPFTableRow.removeCell (pos). Ho confermato che sono stati rimossi nell'oggetto java row, ma quando la tabella viene visualizzata e visualizzata in Word, sono ancora lì. Sai come far andare via queste cellule in eccesso? –

2

Per unire orizzontale/verticale è necessario creare 2 CTHMerge e utilizzare il SETVAL:

  • uno per le celle che si rimarrà (STMerge.RESTART);
  • un secondo per le celle unite (STMerge.CONTINUE);

a) per un esempio orizzontale unione per tabella 2x2 (image with example):

| ___________ | ___________ | -> | ___________ ___________ |
| ___________ | ___________ | -> | ___________ ___________ |

// First Row 
CTHMerge hMerge = CTHMerge.Factory.newInstance(); 
vmerge.setVal(STMerge.RESTART); 
table.getRow(0).getCell(0).getCTTc().getTcPr().setHMerge(hMerge); 
table.getRow(1).getCell(0).getCTTc().getTcPr().setHMerge(hMerge); 

// Secound Row cell will be merged/"deleted" 
CTHMerge hMerge1 = CTHMerge.Factory.newInstance(); 
hMerge.setVal(STMerge.CONTINUE); 
table.getRow(0).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1); 
table.getRow(1).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1); 

b) esempio di verticale unione (image with example)

// First Row 
CTVMerge vmerge = CTVMerge.Factory.newInstance(); 
vmerge.setVal(STMerge.RESTART); 
table.getRow(0).getCell(0).getCTTc().getTcPr().setVMerge(vmerge); 
table.getRow(0).getCell(1).getCTTc().getTcPr().setVMerge(vmerge); 

// Secound Row cell will be merged 
CTVMerge vmerge1 = CTVMerge.Factory.newInstance(); 
vmerge.setVal(STMerge.CONTINUE); 
table.getRow(1).getCell(0).getCTTc().getTcPr().setVMerge(vmerge1); 
table.getRow(1).getCell(1).getCTTc().getTcPr().setVMerge(vmerge1); 
+0

La tua soluzione ha funzionato per me, ma aggiungo leggermente la modifica aggiungendo: 'if (cell.getCTTc(). GetTcPr() == null) cell.getCTTc(). AddNewTcPr();' – IronRabbit