[整理]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;
	}
}

 

    结果为:

    
[整理]docx4j创建简单表格示例
 

    全文完。