Creare una tabella in poi è stato abbastanza facile ma ha tutorial molto limitati e non riesco a trovarne uno che possa creare una semplice cella unita in una tabella per generare un file docx.Come unire le celle (o applicare colspan) usando XWPFTable in POI in Java?
risposta
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 .
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));
}
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);
La tua soluzione ha funzionato per me, ma aggiungo leggermente la modifica aggiungendo: 'if (cell.getCTTc(). GetTcPr() == null) cell.getCTTc(). AddNewTcPr();' – IronRabbit
Grazie !! Ha funzionato meravigliosamente. –
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. –
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? –