2013-04-13 11 views

Odpowiedz

7

Jeśli utworzono tabelę, wiersz wewnątrz tabeli i komórki w środku rzędu, można dodać gridSpan do właściwości komórek:

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

Uwaga: komórka jest org.apache.poi.xwpf.usermodel.XWPFTableCell .

4

Tworzenie oddzielnego XWPFTable dla każdego wiersza tabeli będzie działało i powinno być idealnie dokładne. Wszystkie tabele są scalane za kulisami do jednej tabeli w ostatecznym dokumencie tekstowym. trzeba będzie wszystkie te słoiki poi-3.9.jar, poi-ooxml-3.9.jar i 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

Dzięki !! Pracował cudownie. –

+0

Oczywiście, głosowałem na tę odpowiedź. Nie sądzę, że istnieje sposób, który mogę zaakceptować jako odpowiedź, ponieważ nie zadałem pierwotnego pytania. Daj mi znać, jeśli to rzeczywiście możliwe. –

+0

Witam, próbowałem tego użyć i poprawnie ustawiono rozpiętość komórki, ale pozostawiam komórki poza tabelą (po prawej) równe rozmiarowi rozpiętości. Próbowałem je przyciąć, usuwając je za pomocą XWPFTableRow.removeCell (pos). Potwierdziłem, że są one usuwane w obiekcie wiersza Java, ale gdy tabela renderuje się i jest wyświetlana w programie Word, wciąż tam są. Czy wiesz, jak usunąć te nadmiarowe komórki? –

2

Aby połączyć poziomo/pionowo trzeba utworzyć 2 CTHMerge i użyć SETVAL:

  • jeden dla komórek, które będą pozostawać (STMerge.RESTART);
  • druga dla scalonych komórek (STMerge.CONTINUE);

a) Przykładem poziomej scalania tabeli 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) Przykład pionowej połączyć (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

Twoje rozwiązanie sprawdziło się, ale dodałem, aby nieco zmodyfikować je, dodając: 'if (cell.getCTTc(). GetTcPr() == null) cell.getCTTc(). AddNewTcPr();' – IronRabbit

Powiązane problemy