问题
I need to have a table with the cells on the first and second row merged.
Something like this:
Image of table (I can't post pics) http://i.stack.imgur.com/dAO6j.png
I have been reviewing all the questions related to this topic and I have found some answers for applying grid span to the cells, but I couldn't find a real solution.
Here is the code I have from examples obtained from google and from this site:
XWPFDocument document = new XWPFDocument();
XWPFTable table = document.createTable(7, 2);
fillTable(table);
XWPFTableCell cellRow1 = table.getRow(0).getCell(0);
XWPFTableCell cellRow2 = table.getRow(1).getCell(0);
cellRow1.getCTTc().addNewTcPr();
cellRow1.getCTTc().getTcPr().addNewGridSpan();
cellRow1.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));
cellRow2.getCTTc().addNewTcPr();
cellRow2.getCTTc().getTcPr().addNewGridSpan();
cellRow2.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));
FileOutputStream out = new FileOutputStream("Table.docx");
doc.write(out);
out.close();
What I get from this code is the following:
I tried to remove the "extra" cells with table.getRow(0).removeCell(1);
but it didn't work, am I doing something wrong?
回答1:
It seems xml has to be removed as well:
XWPFTableCell removed = tableRow.getCell(idx);
removed.getCTTc().newCursor().removeXml();
tableRow.removeCell(idx);
回答2:
To merge horizontally/vertically you need to create 2 CTHMerge and use the setVal:
- one for the cells that you will remain (STMerge.RESTART);
- a second one for the merged cells (STMerge.CONTINUE);
a) example of a horizontal merge for a 2x2 table:
|___________|___________| --> |___________ ___________|
|___________|___________| --> |___________ ___________|
// 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) example of a vertical merge:
// 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);
回答3:
You can also avoid creating the extra cells, instead of removing cells after the merge. It requires adding rows and cells sequentially (instead of using document.createTable()
)
For your example it would be:
- Create first rows with 1 cell, set text
- Create next row, and in it create new cell, set text
- Create next rows and set text
- Merge
来源:https://stackoverflow.com/questions/27209863/apache-poi-merge-cells-from-a-table-in-a-word-document