最近在Git上看到一个导出表信息到word的项目(名字叫DBDocTool),下载后运行出错,看了下是用poi-3.10导出的,懒得修改别人的代码,自己随手写了个,代码如下:
import java.io.FileOutputStream;
import java.math.BigInteger;
import org.apache.poi.xwpf.usermodel.Borders;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.TextAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
public class POI_创建简单Word2007_S2_Test {
public static void main(String[] args) throws Exception {
POI_创建简单Word2007_S2_Test t = new POI_创建简单Word2007_S2_Test();
t.createSimpleTable("f:/saveFile/temp/sys_"+ System.currentTimeMillis() + ".docx");
}
public void createSimpleTable(String savePath) throws Exception {
XWPFDocument xdoc = new XWPFDocument();
XWPFParagraph xp = xdoc.createParagraph();
XWPFRun r1 = xp.createRun();
r1.setText("测试一个简单的表格");
r1.setFontFamily("宋体");
r1.setFontSize(12);
r1.setTextPosition(10);
r1.setBold(true);
xp.setAlignment(ParagraphAlignment.CENTER);
XWPFTable xTable = xdoc.createTable(5, 7);
CTTbl ttbl = xTable.getCTTbl();
CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl
.getTblPr();
CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr
.addNewTblW();
tblWidth.setW(new BigInteger("8600"));
tblWidth.setType(STTblWidth.DXA);
int i = 0;
xTable.getRow(i).setHeight(380);
setCellText(xdoc, xTable.getRow(i).getCell(0), "列名", "CCCCCC",
getCellWidth(0));
setCellText(xdoc, xTable.getRow(i).getCell(1), "注释", "CCCCCC",
getCellWidth(1));
setCellText(xdoc, xTable.getRow(i).getCell(2), "类型", "CCCCCC",
getCellWidth(2));
setCellText(xdoc, xTable.getRow(i).getCell(3), "默认值", "CCCCCC",
getCellWidth(3));
setCellText(xdoc, xTable.getRow(i).getCell(4), "标识", "CCCCCC",
getCellWidth(4));
setCellText(xdoc, xTable.getRow(i).getCell(5), "主键", "CCCCCC",
getCellWidth(5));
setCellText(xdoc, xTable.getRow(i).getCell(6), "空值", "CCCCCC",
getCellWidth(6));
i++;
for (int i2 = i; i2 < 5; i2++) {
for (int j = 0; j < 7; j++) {
setCellText(xdoc, xTable.getRow(i2).getCell(j), "测试", null,
getCellWidth(i));
}
}
XWPFTableRow row = xTable.insertNewTableRow(0);
row.setHeight(380);
XWPFTableCell cell = row.addNewTableCell();
CTTc cttc = cell.getCTTc();
CTTcPr cellPr = cttc.addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cellPr.addNewTcW().setW(BigInteger.valueOf(getCellWidth(0)));
cell.setColor("CCCCCC");
cell.setText("中文名称");
cell = row.addNewTableCell();
cttc = cell.getCTTc();
cellPr = cttc.addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cellPr.addNewTcW().setW(BigInteger.valueOf(getCellWidth(1)));
cell.setText("测试测试");
cell = row.addNewTableCell();
cttc = cell.getCTTc();
cellPr = cttc.addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cellPr.addNewTcW().setW(BigInteger.valueOf(getCellWidth(2)));
cell.setColor("CCCCCC");
cell.setText("英文名称");
cell = row.addNewTableCell();
cttc = cell.getCTTc();
cellPr = cttc.addNewTcPr();
cellPr.addNewGridSpan().setVal(BigInteger.valueOf(4));
cellPr.addNewHMerge().setVal(STMerge.CONTINUE);
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cttc.getPList().get(0).addNewR().addNewT().setStringValue("测试水平垂直居中");
row = xTable.insertNewTableRow(1);
row.setHeight(380);
cell = row.addNewTableCell();
cttc = cell.getCTTc();
cellPr = cttc.addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cellPr.addNewTcW().setW(BigInteger.valueOf(getCellWidth(0)));
cell.setColor("CCCCCC");
cell.setText("功能描述");
cell = row.addNewTableCell();
cttc = cell.getCTTc();
cellPr = cttc.addNewTcPr();
cellPr.addNewGridSpan().setVal(BigInteger.valueOf(6));
cellPr.addNewHMerge().setVal(STMerge.CONTINUE);
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cttc.getPList().get(0).addNewR().addNewT().setStringValue("测试功能描述");
XWPFParagraph p1 = xdoc.createParagraph();
p1.setAlignment(ParagraphAlignment.CENTER);
p1.setVerticalAlignment(TextAlignment.CENTER);
r1 = p1.createRun();
r1.setBold(true);
r1.setText("默认单倍行距");
r1.setFontSize(13);
p1 = xdoc.createParagraph();
p1.setAlignment(ParagraphAlignment.CENTER);
p1.setVerticalAlignment(TextAlignment.CENTER);
CTPPr pr = p1.getCTP().getPPr() != null ? p1.getCTP().getPPr() : p1.getCTP().addNewPPr();
CTSpacing spacing =pr.addNewSpacing();
spacing.setLine(new BigInteger("360"));
spacing.setLineRule(STLineSpacingRule.AUTO);
r1 = p1.createRun();
r1.setBold(true);
r1.setText("测试1.5倍行距");
r1.setFontSize(13);
p1 = xdoc.createParagraph();
p1.setAlignment(ParagraphAlignment.CENTER);
p1.setBorderBottom(Borders.DOUBLE);
p1.setBorderTop(Borders.DOUBLE);
p1.setBorderRight(Borders.DOUBLE);
p1.setBorderLeft(Borders.DOUBLE);
p1.setBorderBetween(Borders.SINGLE);
p1.setSpacingBeforeLines(100);
p1.setAlignment(ParagraphAlignment.CENTER);
p1.setVerticalAlignment(TextAlignment.CENTER);
r1 = p1.createRun();
r1.setBold(true);
r1.setText("学而时习之");
r1.setFontSize(13);
CTRPr rpr= r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setAscii("黑体");
fonts.setEastAsia("黑体");
fonts.setHAnsi("黑体");
FileOutputStream fos = new FileOutputStream(savePath);
xdoc.write(fos);
fos.close();
}
private static void setCellText(XWPFDocument xDocument, XWPFTableCell cell,
String text, String bgcolor, int width) {
CTTc cttc = cell.getCTTc();
CTTcPr cellPr = cttc.addNewTcPr();
cellPr.addNewTcW().setW(BigInteger.valueOf(width));
cell.setColor(bgcolor);
cell.setVerticalAlignment(XWPFVertAlign.CENTER);
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cell.setText(text);
}
private static int getCellWidth(int index) {
int cwidth = 1000;
if (index == 0) {
cwidth = 1600;
} else if (index == 1) {
cwidth = 3000;
} else if (index == 2) {
cwidth = 1200;
} else if (index == 3) {
cwidth = 900;
} else if (index == 4) {
cwidth = 600;
} else if (index == 5) {
cwidth = 600;
} else if (index == 6) {
cwidth = 700;
}
return cwidth;
}
}
结果为:
全文完。