[整理]docx4j创建简单表格示例
原文见:http://programmingbb.blogspot.com/2014/08/using-docx4j-to-generate-docx-files.html .下面的代码稍微修改了下:
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import org.apache.commons.io.IOUtils;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context;
import org.docx4j.model.structure.PageDimensions;
import org.docx4j.model.structure.PageSizePaper;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.wml.Body;
import org.docx4j.wml.BooleanDefaultTrue;
import org.docx4j.wml.CTBorder;
import org.docx4j.wml.CTShd;
import org.docx4j.wml.CTTblPrBase.TblStyle;
import org.docx4j.wml.CTVerticalJc;
import org.docx4j.wml.Color;
import org.docx4j.wml.Drawing;
import org.docx4j.wml.HpsMeasure;
import org.docx4j.wml.Jc;
import org.docx4j.wml.JcEnumeration;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.R;
import org.docx4j.wml.RFonts;
import org.docx4j.wml.RPr;
import org.docx4j.wml.STBorder;
import org.docx4j.wml.STVerticalJc;
import org.docx4j.wml.SectPr;
import org.docx4j.wml.SectPr.PgMar;
import org.docx4j.wml.Tbl;
import org.docx4j.wml.TblPr;
import org.docx4j.wml.TblWidth;
import org.docx4j.wml.Tc;
import org.docx4j.wml.TcMar;
import org.docx4j.wml.TcPr;
import org.docx4j.wml.TcPrInner.GridSpan;
import org.docx4j.wml.TcPrInner.TcBorders;
import org.docx4j.wml.TcPrInner.VMerge;
import org.docx4j.wml.Text;
import org.docx4j.wml.Tr;
import org.docx4j.wml.U;
import org.docx4j.wml.UnderlineEnumeration;
//原文见:http://programmingbb.blogspot.com/2014/08/using-docx4j-to-generate-docx-files.html
public class Docx4j_创建表格_S5_Test {
public static void main(String[] args) throws Exception {
Docx4j_创建表格_S5_Test t = new Docx4j_创建表格_S5_Test();
t.testDocx4jCreateTable();
}
public void testDocx4jCreateTable() throws Exception {
boolean landscape = false;
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
.createPackage(PageSizePaper.A4, landscape);
ObjectFactory factory = Context.getWmlObjectFactory();
setPageMargins(wordMLPackage, factory);
String imgFilePath = "f:/saveFile/tmp/2sql日志.jpg";
Tbl table = createTableWithContent(wordMLPackage, factory, imgFilePath);
wordMLPackage.getMainDocumentPart().addObject(table);
wordMLPackage.save(new File("f:/saveFile/temp/sys_"
+ System.currentTimeMillis() + ".docx"));
}
public Tbl createTableWithContent(WordprocessingMLPackage wordMLPackage,
ObjectFactory factory, String imgFilePath) throws Exception {
Tbl table = factory.createTbl();
// for TEST: this adds borders to all cells
TblPr tblPr = new TblPr();
TblStyle tblStyle = new TblStyle();
tblStyle.setVal("TableGrid");
tblPr.setTblStyle(tblStyle);
table.setTblPr(tblPr);
Tr tableRow = factory.createTr();
// a default table cell style
Docx4jStyle_S3 defStyle = new Docx4jStyle_S3();
defStyle.setBold(false);
defStyle.setItalic(false);
defStyle.setUnderline(false);
defStyle.setHorizAlignment(JcEnumeration.CENTER);
// a specific table cell style
Docx4jStyle_S3 style = new Docx4jStyle_S3();
style.setBold(true);
style.setItalic(true);
style.setUnderline(true);
style.setFontSize("40");
style.setFontColor("FF0000");
style.setCnFontFamily("微软雅黑");
style.setEnFontFamily("Times New Roman");
style.setTop(300);
style.setBackground("CCFFCC");
style.setVerticalAlignment(STVerticalJc.CENTER);
style.setHorizAlignment(JcEnumeration.CENTER);
style.setBorderTop(true);
style.setBorderBottom(true);
style.setNoWrap(true);
addTableCell(factory, tableRow, "测试Field 1", 3500, style, 1, null);
// start vertical merge for Filed 2 and Field 3 on 3 rows
addTableCell(factory, tableRow, "测试Field 2", 3500, defStyle, 1,
"restart");
addTableCell(factory, tableRow, "测试Field 3", 1500, defStyle, 1,
"restart");
table.getContent().add(tableRow);
tableRow = factory.createTr();
addTableCell(factory, tableRow, "Text", 3500, defStyle, 1, null);
addTableCell(factory, tableRow, "", 3500, defStyle, 1, "");
addTableCell(factory, tableRow, "", 1500, defStyle, 1, "");
table.getContent().add(tableRow);
tableRow = factory.createTr();
addTableCell(factory, tableRow, "Interval", 3500, defStyle, 1, null);
addTableCell(factory, tableRow, "", 3500, defStyle, 1, "close");
addTableCell(factory, tableRow, "", 1500, defStyle, 1, "close");
table.getContent().add(tableRow);
// add an image horizontally merged on 3 cells
String filenameHint = null;
String altText = null;
int id1 = 0;
int id2 = 1;
byte[] bytes = getImageBytes(imgFilePath);
P pImage;
try {
pImage = newImage(wordMLPackage, factory, bytes, filenameHint,
altText, id1, id2, 8500);
tableRow = factory.createTr();
addTableCell(factory, tableRow, pImage, 8500, defStyle, 3, null);
table.getContent().add(tableRow);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
public byte[] getImageBytes(String imgFilePath) throws Exception {
return IOUtils.toByteArray(new FileInputStream(imgFilePath));
}
public void addTableCell(ObjectFactory factory, Tr tableRow, P image,
int width, Docx4jStyle_S3 style, int horizontalMergedCells,
String verticalMergedVal) {
Tc tableCell = factory.createTc();
addImageCellStyle(tableCell, image, style);
setCellWidth(tableCell, width);
setCellVMerge(tableCell, verticalMergedVal);
setCellHMerge(tableCell, horizontalMergedCells);
tableRow.getContent().add(tableCell);
}
public void addTableCell(ObjectFactory factory, Tr tableRow,
String content, int width, Docx4jStyle_S3 style,
int horizontalMergedCells, String verticalMergedVal) {
Tc tableCell = factory.createTc();
addCellStyle(factory, tableCell, content, style);
setCellWidth(tableCell, width);
setCellVMerge(tableCell, verticalMergedVal);
setCellHMerge(tableCell, horizontalMergedCells);
if (style.isNoWrap()) {
setCellNoWrap(tableCell);
}
tableRow.getContent().add(tableCell);
}
public void addCellStyle(ObjectFactory factory, Tc tableCell,
String content, Docx4jStyle_S3 style) {
if (style != null) {
P paragraph = factory.createP();
Text text = factory.createText();
text.setValue(content);
R run = factory.createR();
run.getContent().add(text);
paragraph.getContent().add(run);
setHorizontalAlignment(paragraph, style.getHorizAlignment());
RPr runProperties = factory.createRPr();
if (style.isBold()) {
addBoldStyle(runProperties);
}
if (style.isItalic()) {
addItalicStyle(runProperties);
}
if (style.isUnderline()) {
addUnderlineStyle(runProperties);
}
setFontSize(runProperties, style.getFontSize());
setFontColor(runProperties, style.getFontColor());
setFontFamily(runProperties, style.getCnFontFamily(),style.getEnFontFamily());
setCellMargins(tableCell, style.getTop(), style.getRight(),
style.getBottom(), style.getLeft());
setCellColor(tableCell, style.getBackground());
setVerticalAlignment(tableCell, style.getVerticalAlignment());
setCellBorders(tableCell, style.isBorderTop(),
style.isBorderRight(), style.isBorderBottom(),
style.isBorderLeft());
run.setRPr(runProperties);
tableCell.getContent().add(paragraph);
}
}
public void addImageCellStyle(Tc tableCell, P image, Docx4jStyle_S3 style) {
setCellMargins(tableCell, style.getTop(), style.getRight(),
style.getBottom(), style.getLeft());
setCellColor(tableCell, style.getBackground());
setVerticalAlignment(tableCell, style.getVerticalAlignment());
setHorizontalAlignment(image, style.getHorizAlignment());
setCellBorders(tableCell, style.isBorderTop(), style.isBorderRight(),
style.isBorderBottom(), style.isBorderLeft());
tableCell.getContent().add(image);
}
public P newImage(WordprocessingMLPackage wordMLPackage,
ObjectFactory factory, byte[] bytes, String filenameHint,
String altText, int id1, int id2, long cx) throws Exception {
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage
.createImagePart(wordMLPackage, bytes);
Inline inline = imagePart.createImageInline(filenameHint, altText, id1,
id2, cx, false);
// Now add the inline in w:p/w:r/w:drawing
P p = factory.createP();
R run = factory.createR();
p.getContent().add(run);
Drawing drawing = factory.createDrawing();
run.getContent().add(drawing);
drawing.getAnchorOrInline().add(inline);
return p;
}
public void setCellBorders(Tc tableCell, boolean borderTop,
boolean borderRight, boolean borderBottom, boolean borderLeft) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
CTBorder border = new CTBorder();
// border.setColor("auto");
border.setColor("0000FF");
border.setSz(new BigInteger("20"));
border.setSpace(new BigInteger("0"));
border.setVal(STBorder.SINGLE);
TcBorders borders = new TcBorders();
if (borderBottom) {
borders.setBottom(border);
}
if (borderTop) {
borders.setTop(border);
}
if (borderLeft) {
borders.setLeft(border);
}
if (borderRight) {
borders.setRight(border);
}
tableCellProperties.setTcBorders(borders);
}
public void setCellWidth(Tc tableCell, int width) {
if (width > 0) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
TblWidth tableWidth = new TblWidth();
tableWidth.setType("dxa");
tableWidth.setW(BigInteger.valueOf(width));
tableCellProperties.setTcW(tableWidth);
}
}
public void setCellNoWrap(Tc tableCell) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
BooleanDefaultTrue b = new BooleanDefaultTrue();
b.setVal(true);
tableCellProperties.setNoWrap(b);
}
public void setCellVMerge(Tc tableCell, String mergeVal) {
if (mergeVal != null) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
VMerge merge = new VMerge();
if (!"close".equals(mergeVal)) {
merge.setVal(mergeVal);
}
tableCellProperties.setVMerge(merge);
}
}
public void setCellHMerge(Tc tableCell, int horizontalMergedCells) {
if (horizontalMergedCells > 1) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
GridSpan gridSpan = new GridSpan();
gridSpan.setVal(new BigInteger(String
.valueOf(horizontalMergedCells)));
tableCellProperties.setGridSpan(gridSpan);
tableCell.setTcPr(tableCellProperties);
}
}
public void setCellColor(Tc tableCell, String color) {
if (color != null) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
CTShd shd = new CTShd();
shd.setFill(color);
tableCellProperties.setShd(shd);
}
}
public void setCellMargins(Tc tableCell, int top, int right, int bottom,
int left) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
TcMar margins = new TcMar();
if (bottom > 0) {
TblWidth bW = new TblWidth();
bW.setType("dxa");
bW.setW(BigInteger.valueOf(bottom));
margins.setBottom(bW);
}
if (top > 0) {
TblWidth tW = new TblWidth();
tW.setType("dxa");
tW.setW(BigInteger.valueOf(top));
margins.setTop(tW);
}
if (left > 0) {
TblWidth lW = new TblWidth();
lW.setType("dxa");
lW.setW(BigInteger.valueOf(left));
margins.setLeft(lW);
}
if (right > 0) {
TblWidth rW = new TblWidth();
rW.setType("dxa");
rW.setW(BigInteger.valueOf(right));
margins.setRight(rW);
}
tableCellProperties.setTcMar(margins);
}
public void setVerticalAlignment(Tc tableCell, STVerticalJc align) {
if (align != null) {
TcPr tableCellProperties = tableCell.getTcPr();
if (tableCellProperties == null) {
tableCellProperties = new TcPr();
tableCell.setTcPr(tableCellProperties);
}
CTVerticalJc valign = new CTVerticalJc();
valign.setVal(align);
tableCellProperties.setVAlign(valign);
}
}
public void setFontSize(RPr runProperties, String fontSize) {
if (fontSize != null && !fontSize.isEmpty()) {
HpsMeasure size = new HpsMeasure();
size.setVal(new BigInteger(fontSize));
runProperties.setSz(size);
runProperties.setSzCs(size);
}
}
public void setFontFamily(RPr runProperties, String cnFontFamily,String enFontFamily) {
if (cnFontFamily != null||enFontFamily!=null) {
RFonts rf = runProperties.getRFonts();
if (rf == null) {
rf = new RFonts();
runProperties.setRFonts(rf);
}
if(cnFontFamily!=null){
rf.setEastAsia(cnFontFamily);
}
if(enFontFamily!=null){
rf.setAscii(enFontFamily);
}
}
}
public void setFontColor(RPr runProperties, String color) {
if (color != null) {
Color c = new Color();
c.setVal(color);
runProperties.setColor(c);
}
}
public void setHorizontalAlignment(P paragraph, JcEnumeration hAlign) {
if (hAlign != null) {
PPr pprop = new PPr();
Jc align = new Jc();
align.setVal(hAlign);
pprop.setJc(align);
paragraph.setPPr(pprop);
}
}
public void addBoldStyle(RPr runProperties) {
BooleanDefaultTrue b = new BooleanDefaultTrue();
b.setVal(true);
runProperties.setB(b);
}
public void addItalicStyle(RPr runProperties) {
BooleanDefaultTrue b = new BooleanDefaultTrue();
b.setVal(true);
runProperties.setI(b);
}
public void addUnderlineStyle(RPr runProperties) {
U val = new U();
val.setVal(UnderlineEnumeration.SINGLE);
runProperties.setU(val);
}
public void setPageMargins(WordprocessingMLPackage wordMLPackage,
ObjectFactory factory) {
try {
Body body = wordMLPackage.getMainDocumentPart().getContents()
.getBody();
PageDimensions page = new PageDimensions();
PgMar pgMar = page.getPgMar();
pgMar.setBottom(BigInteger.valueOf(pixelsToDxa(50)));
pgMar.setTop(BigInteger.valueOf(pixelsToDxa(50)));
pgMar.setLeft(BigInteger.valueOf(pixelsToDxa(50)));
pgMar.setRight(BigInteger.valueOf(pixelsToDxa(50)));
SectPr sectPr = factory.createSectPr();
body.setSectPr(sectPr);
sectPr.setPgMar(pgMar);
} catch (Exception e) {
e.printStackTrace();
}
}
// get dots per inch
public static int getDPI() {
return GraphicsEnvironment.isHeadless() ? 96 : Toolkit
.getDefaultToolkit().getScreenResolution();
}
public int pixelsToDxa(int pixels) {
return (1440 * pixels / getDPI());
}
}
class Docx4jStyle_S3 {
private boolean bold;
private boolean italic;
private boolean underline;
private String fontSize;
private String fontColor;
private String cnFontFamily;
private String enFontFamily;
// cell margins
private int left;
private int bottom;
private int top;
private int right;
private String background;
private STVerticalJc verticalAlignment;
private JcEnumeration horizAlignment;
private boolean borderLeft;
private boolean borderRight;
private boolean borderTop;
private boolean borderBottom;
private boolean noWrap;
public boolean isBold() {
return bold;
}
public void setBold(boolean bold) {
this.bold = bold;
}
public boolean isItalic() {
return italic;
}
public void setItalic(boolean italic) {
this.italic = italic;
}
public boolean isUnderline() {
return underline;
}
public void setUnderline(boolean underline) {
this.underline = underline;
}
public String getFontSize() {
return fontSize;
}
public void setFontSize(String fontSize) {
this.fontSize = fontSize;
}
public String getFontColor() {
return fontColor;
}
public void setFontColor(String fontColor) {
this.fontColor = fontColor;
}
public String getCnFontFamily() {
return cnFontFamily;
}
public void setCnFontFamily(String cnFontFamily) {
this.cnFontFamily = cnFontFamily;
}
public String getEnFontFamily() {
return enFontFamily;
}
public void setEnFontFamily(String enFontFamily) {
this.enFontFamily = enFontFamily;
}
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getBottom() {
return bottom;
}
public void setBottom(int bottom) {
this.bottom = bottom;
}
public int getTop() {
return top;
}
public void setTop(int top) {
this.top = top;
}
public int getRight() {
return right;
}
public void setRight(int right) {
this.right = right;
}
public String getBackground() {
return background;
}
public void setBackground(String background) {
this.background = background;
}
public STVerticalJc getVerticalAlignment() {
return verticalAlignment;
}
public void setVerticalAlignment(STVerticalJc verticalAlignment) {
this.verticalAlignment = verticalAlignment;
}
public JcEnumeration getHorizAlignment() {
return horizAlignment;
}
public void setHorizAlignment(JcEnumeration horizAlignment) {
this.horizAlignment = horizAlignment;
}
public boolean isBorderLeft() {
return borderLeft;
}
public void setBorderLeft(boolean borderLeft) {
this.borderLeft = borderLeft;
}
public boolean isBorderRight() {
return borderRight;
}
public void setBorderRight(boolean borderRight) {
this.borderRight = borderRight;
}
public boolean isBorderTop() {
return borderTop;
}
public void setBorderTop(boolean borderTop) {
this.borderTop = borderTop;
}
public boolean isBorderBottom() {
return borderBottom;
}
public void setBorderBottom(boolean borderBottom) {
this.borderBottom = borderBottom;
}
public boolean isNoWrap() {
return noWrap;
}
public void setNoWrap(boolean noWrap) {
this.noWrap = noWrap;
}
}
结果为:
全文完。