Reputation: 461
How to make this table to auto-fit to document page width, when the column size increases, using apache-poi and aligning that table to center.
This code generates a word Document extracting data from Java to word file located in c drive. I have manually set width but it now works fine. If would be valuable for me if proper guidance is provided
public Word2Doc() throws Exception {
System.out.println("This is Word To Document Class");
File file = null;
FileOutputStream fos = null;
XWPFDocument document = null;
XWPFParagraph para = null;
XWPFRun run = null;
try {
// Create the first paragraph and set it's text.
document = new XWPFDocument();
para = document.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);
para.setSpacingAfter(100);
para.setSpacingAfterLines(10);
run = para.createRun();
for(int i=1; i<=5; i++)
run.setText("Test Name \009\009\009 Value \t\t\t\t Normal Ranges\013\013");
run.addBreak(); // similar to new line
run.addBreak();
XWPFTable table = document.createTable(4, 3);
table.setRowBandSize(1);
table.setWidth(1);
table.setColBandSize(1);
table.setCellMargins(1, 1, 100, 30);
table.setStyleID("finest");
table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");
table.getRow(2).getCell(1).setText("fine");
XWPFParagraph p1 = table.getRow(0).getCell(0).getParagraphs().get(0);
p1.setAlignment(ParagraphAlignment.CENTER);
XWPFRun r1 = p1.createRun();
r1.setBold(true);
r1.setText("Test Name");
r1.setItalic(true);
r1.setFontFamily("Courier");
r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
r1.setTextPosition(100);
//Locating the cell values
table.getRow(0).getCell(1).setText("Value");
table.getRow(0).getCell(2).setText("Normal Ranges");
table.getRow(2).getCell(2).setText("numeric values");
table.setWidth(120);
file = new File("c:\\nwhpe.docx");
if(file.exists())
file.delete();
FileOutputStream out = new FileOutputStream(file);
document.write(out);
out.close();
}
}
public static void main(String ar[]) throws Exception{
new Word2Doc();
}
}
Upvotes: 9
Views: 22748
Reputation: 1
For me the solution was to unset all previously set widths and reset table layout type to AUTOFIT:
CTTbl ctTbl = table.getCTTbl();
CTTblGrid ctTblGrid = ctTbl.getTblGrid();
ctTblGrid.getGridColList().forEach(CTTblGridCol::unsetW);
CTTblLayoutType type = ctTbl.getTblPr().addNewTblLayout();
type.setType(STTblLayoutType.AUTOFIT);
But I handle docx converted from html.
Upvotes: 0
Reputation: 4609
Just use "100%":
package io.github.baijifeilong.excel;
import lombok.SneakyThrows;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import java.io.FileOutputStream;
/**
* Created by [email protected] at 2019-08-21 13:49
*/
public class WordDemo {
@SneakyThrows
public static void main(String[] args) {
XWPFDocument document = new XWPFDocument();
XWPFTable table = document.createTable(3, 4);
table.setWidth("100%");
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
table.getRow(i).getCell(j).setText(String.format("%d:%d", i + i, j + 1));
}
}
document.write(new FileOutputStream("hello.docx"));
}
}
Upvotes: 7
Reputation: 31
You can set the width of a table in percent of the actual page size. First, get the width of the page:
CTSectPr sectPr = document.getDocument().getBody().getSectPr();
CTPageSz pageSize = sectPr.getPgSz();
double pageWidth = pageSize.getW().doubleValue();
Second step, get the margins of the page and calculate the effective page size:
CTPageMar pageMargin = sectPr.getPgMar();
double pageMarginLeft = pageMargin.getLeft().doubleValue();
double pageMarginRight = pageMargin.getRight().doubleValue();
double effectivePageWidth = pageWidth - pageMarginLeft - pageMarginRight;
Now, let's say you want the table to have a width of 60% of the effective page size. Then you calculate the size for your table. (If you want the table to fit to the actual page size, simply use 1.0):
double widthInPercent = 0.6;
int size = (int) (effectivePageWidth * widthInPercent);
Finally, set this size to your table:
CTTblWidth width = table.getCTTbl().addNewTblPr().addNewTblW();
width.setType(STTblWidth.DXA);
width.setW(new BigInteger(size + ""));
Hope this helps!
Best, Holger
Upvotes: 3
Reputation: 89
To set the width of a table:
XWPFTable table = doc.createTable(nRows, nCols);
table.getCTTbl().addNewTblPr().addNewTblW().setW(BigInteger.valueOf(10000));
To set column width:
cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(2000));
If data increases in cell it effects the width of column i.e column width also will increase so to avoid this kind of problems we need to check length of string value in cell and we need to add \n (new line) in string by doing this we can set width of column.
In my project i have struggled alot to set column width and i have solved this issue by controlling data in cell.
Upvotes: 4
Reputation: 434
to set the table to auto fit , basically it's just extending the width to a specific size. example
CTTbl table = poiTable.getCTTbl();
CTTblPr pr = table.getTblPr();
CTTblWidth tblW = pr.getTblW();
tblW.setW(BigInteger.valueOf(5000));
tblW.setType(STTblWidth.PCT);
pr.setTblW(tblW);
table.setTblPr(pr);
as for aligning the table to the center
CTJc jc = pr.addNewJc();
jc.setVal(STJc.RIGHT);
pr.setJc(jc);
Upvotes: 12