导入的jar
org.apache.poi poi-ooxml3.17 org.apache.poi poi3.17
导出word文档
public class ExportWord {
private XWPFHelperTable xwpfHelperTable = null;
private XWPFHelper xwpfHelper = null;
public ExportWord() {
xwpfHelperTable = new XWPFHelperTable();
xwpfHelper = new XWPFHelper();
}
public XWPFdocument createXWPFdocument(String text) {
XWPFdocument doc = new XWPFdocument();
createTitleParagraph(doc);
createTextParagraph(doc,text);
createTableParagraph(doc, 12, 4);
createBreakParagraph(doc);
return doc;
}
public void createTitleParagraph(XWPFdocument document) {
XWPFParagraph titleParagraph = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
titleParagraph.setAlignment(ParagraphAlignment.CENTER);//样式居中
XWPFRun titleFun = titleParagraph.createRun(); //创建文本对象
// titleFun.setText(titleName); //设置标题的名字
titleFun.setBold(true); //加粗
titleFun.setColor("000000");//设置颜色
titleFun.setFontSize(25); //字体大小
// titleFun.setFontFamily("");//设置字体
//...
titleFun.addBreak(); //换行
}
public void createTextParagraph(XWPFdocument document,String text) {
XWPFParagraph titleParagraph = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
titleParagraph.setAlignment(ParagraphAlignment.LEFT);//样式居中
XWPFRun titleFun = titleParagraph.createRun(); //创建文本对象
titleFun.setText(text); //设置标题的名字
titleFun.setColor("000000");//设置颜色
titleFun.setFontSize(8); //字体大小
titleFun.addBreak(); //换行
}
public void createBreakParagraph(XWPFdocument document) {
XWPFParagraph titleParagraph = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
titleParagraph.setAlignment(ParagraphAlignment.RIGHT);//样式居中
XWPFRun titleFun = titleParagraph.createRun(); //创建文本对象
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
titleFun.setText("办理时间:"+dateformat.format(new Date())); //设置标题的名字
titleFun.setBold(true); //加粗
titleFun.setColor("000000");//设置颜色
titleFun.setFontSize(12); //字体大小
// titleFun.setFontFamily("");//设置字体
//...
titleFun.addBreak(); //换行
}
public void createTableParagraph(XWPFdocument document, int rows, int cols) {
// xwpfHelperTable.createTable(xdoc, rowSize, cellSize, isSetColWidth, colWidths)
XWPFTable infoTable = document.createTable(rows, cols);
xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);
//合并表格
xwpfHelperTable.mergeCellsHorizontal(infoTable, 6, 1, 3);
xwpfHelperTable.mergeCellsVertically(infoTable, 0, 5, 6);
xwpfHelperTable.mergeCellsVertically(infoTable, 0, 7, 8);
for(int col = 5; col < 10; col++) {
xwpfHelperTable.mergeCellsHorizontal(infoTable, col, 0, 3);
}
//设置表格样式
List rowList = infoTable.getRows();
for(int i = 0; i < rowList.size(); i++) {
XWPFTableRow infoTableRow = rowList.get(i);
List cellList = infoTableRow.getTableCells();
for(int j = 0; j < cellList.size(); j++) {
XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);
cellParagraph.setAlignment(ParagraphAlignment.CENTER);
XWPFRun cellParagraphRun = cellParagraph.createRun();
cellParagraphRun.setFontSize(12);
cellParagraphRun.setBold(true);
}
}
xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);
}
@SuppressWarnings("unchecked")
public void exportCheckWord(Map dataList, XWPFdocument document, String savePath) throws IOException {
XWPFParagraph paragraph = document.getParagraphs().get(0);
XWPFRun titleFun = paragraph.getRuns().get(0);
titleFun.setText(String.valueOf(dataList.get("TITLE")));
List> tableData = (List>) dataList.get("TABLEDATA");
XWPFTable table = document.getTables().get(0);
fillTableData(table, tableData);
xwpfHelper.savedocument(document, savePath);
}
public void fillTableData(XWPFTable table, List> tableData) {
List rowList = table.getRows();
for(int i = 0; i < tableData.size(); i++) {
List
实体类
public class ParagraphStyle {
private boolean isSpace; //是否缩进
private String before; //段前磅数
private String after; //段后磅数
private String beforeLines; //段前行数
private String afterLines; //段后行数
private boolean isLine; //是否间距
private String line; //间距距离
//段落缩进信息
private String firstLine;
private String firstLineChar;
private String hanging;
private String hangingChar;
private String right;
private String rightChar;
private String left;
private String leftChar;
public boolean isSpace() {
return isSpace;
}
public void setSpace(boolean isSpace) {
this.isSpace = isSpace;
}
public String getBefore() {
return before;
}
public void setBefore(String before) {
this.before = before;
}
public String getAfter() {
return after;
}
public void setAfter(String after) {
this.after = after;
}
public String getBeforeLines() {
return beforeLines;
}
public void setBeforeLines(String beforeLines) {
this.beforeLines = beforeLines;
}
public String getAfterLines() {
return afterLines;
}
public void setAfterLines(String afterLines) {
this.afterLines = afterLines;
}
public boolean isLine() {
return isLine;
}
public void setLine(boolean isLine) {
this.isLine = isLine;
}
public String getLine() {
return line;
}
public void setLine(String line) {
this.line = line;
}
public String getFirstLine() {
return firstLine;
}
public void setFirstLine(String firstLine) {
this.firstLine = firstLine;
}
public String getFirstLineChar() {
return firstLineChar;
}
public void setFirstLineChar(String firstLineChar) {
this.firstLineChar = firstLineChar;
}
public String getHanging() {
return hanging;
}
public void setHanging(String hanging) {
this.hanging = hanging;
}
public String getHangingChar() {
return hangingChar;
}
public void setHangingChar(String hangingChar) {
this.hangingChar = hangingChar;
}
public String getRight() {
return right;
}
public void setRight(String right) {
this.right = right;
}
public String getRightChar() {
return rightChar;
}
public void setRightChar(String rightChar) {
this.rightChar = rightChar;
}
public String getLeft() {
return left;
}
public void setLeft(String left) {
this.left = left;
}
public String getLeftChar() {
return leftChar;
}
public void setLeftChar(String leftChar) {
this.leftChar = leftChar;
}
}
public class TextStyle {
private String url; // 超链接
private String text; //文本内容
private String fontFamily; //字体
private String fontSize; //字体大小
private String colorVal; //字体颜色
private String shdColor; //底纹颜色
private int position; //文本位置
private int spacingValue; //间距
private int indent; //缩进
private boolean isBlod; //加粗
private boolean isUnderLine; //下划线
private boolean underLineColor; //
private boolean isItalic; //倾斜
private boolean isStrike; //删除线
private boolean isDStrike; //双删除线
private boolean isShadow; //阴影
private boolean isVanish; //隐藏
private boolean isEmboss; //阳文
private boolean isImprint; //阴文
private boolean isOutline; //空心
private boolean isHightLight; //突出显示文本
private boolean isShd; //底纹
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getFontFamily() {
return fontFamily;
}
public void setFontFamily(String fontFamily) {
this.fontFamily = fontFamily;
}
public String getFontSize() {
return fontSize;
}
public void setFontSize(String fontSize) {
this.fontSize = fontSize;
}
public String getColorVal() {
return colorVal;
}
public void setColorVal(String colorVal) {
this.colorVal = colorVal;
}
public String getShdColor() {
return shdColor;
}
public void setShdColor(String shdColor) {
this.shdColor = shdColor;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public int getSpacingValue() {
return spacingValue;
}
public void setSpacingValue(int spacingValue) {
this.spacingValue = spacingValue;
}
public int getIndent() {
return indent;
}
public void setIndent(int indent) {
this.indent = indent;
}
public boolean isBlod() {
return isBlod;
}
public void setBlod(boolean isBlod) {
this.isBlod = isBlod;
}
public boolean isUnderLine() {
return isUnderLine;
}
public void setUnderLine(boolean isUnderLine) {
this.isUnderLine = isUnderLine;
}
public boolean isUnderLineColor() {
return underLineColor;
}
public void setUnderLineColor(boolean underLineColor) {
this.underLineColor = underLineColor;
}
public boolean isItalic() {
return isItalic;
}
public void setItalic(boolean isItalic) {
this.isItalic = isItalic;
}
public boolean isStrike() {
return isStrike;
}
public void setStrike(boolean isStrike) {
this.isStrike = isStrike;
}
public boolean isDStrike() {
return isDStrike;
}
public void setDStrike(boolean isDStrike) {
this.isDStrike = isDStrike;
}
public boolean isShadow() {
return isShadow;
}
public void setShadow(boolean isShadow) {
this.isShadow = isShadow;
}
public boolean isVanish() {
return isVanish;
}
public void setVanish(boolean isVanish) {
this.isVanish = isVanish;
}
public boolean isEmboss() {
return isEmboss;
}
public void setEmboss(boolean isEmboss) {
this.isEmboss = isEmboss;
}
public boolean isImprint() {
return isImprint;
}
public void setImprint(boolean isImprint) {
this.isImprint = isImprint;
}
public boolean isOutline() {
return isOutline;
}
public void setOutline(boolean isOutline) {
this.isOutline = isOutline;
}
public boolean isHightLight() {
return isHightLight;
}
public void setHightLight(boolean isHightLight) {
this.isHightLight = isHightLight;
}
public boolean isShd() {
return isShd;
}
public void setShd(boolean isShd) {
this.isShd = isShd;
}
}
工具类
public class XWPFHelper {
private static Logger logger = Logger.getLogger(XWPFHelper.class.toString());
public XWPFdocument createdocument() {
XWPFdocument document = new XWPFdocument();
return document;
}
public XWPFdocument openDoc(String path) throws IOException {
InputStream is = new FileInputStream(path);
return new XWPFdocument(is);
}
public void savedocument(XWPFdocument document, String savePath) throws IOException {
OutputStream os = new FileOutputStream(savePath);
document.write(os);
os.close();
}
public void addParagraphTextHyperlink(XWPFParagraph paragraph, TextStyle textStyle) {
String id = paragraph.getdocument().getPackagePart().
addExternalRelationship(textStyle.getUrl(),
XWPFRelation.HYPERlink.getRelation()).getId();
//追加链接并将其绑定到关系中
CTHyperlink clink = paragraph.getCTP().addNewHyperlink();
clink.setId(id);
//创建链接文本
CTText ctText = CTText.Factory.newInstance();
ctText.setStringValue(textStyle.getText());
CTR ctr = CTR.Factory.newInstance();
CTRPr rpr = ctr.addNewRPr();
//以下设置各种样式 详情看TextStyle类
if(textStyle.getFontFamily() != "" && textStyle.getFontFamily() != null ) {
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setAscii(textStyle.getFontFamily());
//...
}
//设置字体大小
}
public void setParagraphSpacingInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle, STLineSpacingRule.Enum linevalue) {
CTPPr pPPr = getParagraphCTPPr(paragraph);
CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing() : pPPr.addNewSpacing();
if(paragStyle.isSpace()) {
//段前磅数
if(paragStyle.getBefore() != null) {
pSpacing.setBefore(new BigInteger(paragStyle.getBefore()));
}
//段后磅数
if(paragStyle.getAfter() != null) {
pSpacing.setAfter(new BigInteger(paragStyle.getAfter()));
}
//依次设置段前行数、段后行数
//...
}
//间距
if(paragStyle.isLine()) {
if(paragStyle.getLine() != null) {
pSpacing.setLine(new BigInteger(paragStyle.getLine()));
}
if(linevalue != null) {
pSpacing.setLineRule(linevalue); //
}
}
}
public void setParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) {
CTPPr pPPr = getParagraphCTPPr(paragraph);
CTInd pInd = pPPr.getInd() != null ? pPPr.getInd() : pPPr.addNewInd();
if(paragStyle.getFirstLine() != null) {
pInd.setFirstLine(new BigInteger(paragStyle.getFirstLine()));
}
//再进行其他设置
//...
}
public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {
if(pAlign != null) {
paragraph.setAlignment(pAlign);
}
if(valign != null) {
paragraph.setVerticalAlignment(valign);
}
}
public CTPPr getParagraphCTPPr(XWPFParagraph paragraph) {
CTPPr pPPr = null;
if(paragraph.getCTP() != null) {
if(paragraph.getCTP().getPPr() != null) {
pPPr = paragraph.getCTP().getPPr();
} else {
pPPr = paragraph.getCTP().addNewPPr();
}
}
return pPPr;
}
public CTRPr getRunCTRPr(XWPFParagraph paragraph, XWPFRun pRun) {
CTRPr ctrPr = null;
if(pRun.getCTR() != null) {
ctrPr = pRun.getCTR().getRPr();
if(ctrPr == null) {
ctrPr = pRun.getCTR().addNewRPr();
}
} else {
ctrPr = paragraph.getCTP().addNewR().addNewRPr();
}
return ctrPr;
}
public void copyTable(XWPFTable targetTable, XWPFTable sourceTable) {
//复制表格属性
targetTable.getCTTbl().setTblPr(sourceTable.getCTTbl().getTblPr());
//复制行
for(int i = 0; i < sourceTable.getRows().size(); i++) {
XWPFTableRow targetRow = targetTable.getRow(i);
XWPFTableRow sourceRow = sourceTable.getRow(i);
if(targetRow == null) {
targetTable.addRow(sourceRow);
} else {
copyTableRow(targetRow, sourceRow);
}
}
}
public void copyTableRow(XWPFTableRow targetRow, XWPFTableRow sourceRow) {
//复制样式
if(sourceRow != null) {
targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
}
//复制单元格
for(int i = 0; i < sourceRow.getTableCells().size(); i++) {
XWPFTableCell tCell = targetRow.getCell(i);
XWPFTableCell sCell = sourceRow.getCell(i);
if(tCell == sCell) {
tCell = targetRow.addNewTableCell();
}
copyTableCell(tCell, sCell);
}
}
public void copyTableCell(XWPFTableCell targetCell, XWPFTableCell sourceCell) {
//表格属性
if(sourceCell.getCTTc() != null) {
targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
}
//删除段落
for(int pos = 0; pos < targetCell.getParagraphs().size(); pos++) {
targetCell.removeParagraph(pos);
}
//添加段落
for(XWPFParagraph sourceParag : sourceCell.getParagraphs()) {
XWPFParagraph targetParag = targetCell.addParagraph();
copyParagraph(targetParag, sourceParag);
}
}
public void copyParagraph(XWPFParagraph targetParag, XWPFParagraph sourceParag) {
targetParag.getCTP().setPPr(sourceParag.getCTP().getPPr()); //设置段落样式
//移除所有的run
for(int pos = targetParag.getRuns().size() - 1; pos >= 0; pos-- ) {
targetParag.removeRun(pos);
}
//copy新的run
for(XWPFRun sRun : sourceParag.getRuns()) {
XWPFRun tarRun = targetParag.createRun();
copyRun(tarRun, sRun);
}
}
public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) {
//设置targetRun属性
targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());
targetRun.setText(sourceRun.getText(1));//设置文本
//处理图片
List pictures = sourceRun.getEmbeddedPictures();
for(XWPFPicture picture : pictures) {
try {
copyPicture(targetRun, picture);
} catch (InvalidFormatException e) {
e.printStackTrace();
logger.log(Level.WARNING, "copyRun", e);
} catch (IOException e) {
e.printStackTrace();
logger.log(Level.WARNING, "copyRun", e);
}
}
}
public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throws InvalidFormatException, IOException {
XWPFPictureData picData = sourcePicture.getPictureData();
String fileName = picData.getFileName(); //图片的名称
InputStream picInIsData = new ByteArrayInputStream(picData.getData());
int picType = picData.getPictureType();
int width = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCx();
int height = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCy();
targetRun.addPicture(picInIsData, picType, fileName, width, height);
// targetRun.addBreak();//分行
}
}
工具类二
public class XWPFHelperTable {
public void deleteTableByIndex(XWPFdocument document, int pos) {
Iterator bodyElement = document.getBodyElementsIterator();
int eIndex = 0, tableIndex = -1;
while(bodyElement.hasNext()) {
IBodyElement element = bodyElement.next();
BodyElementType elementType = element.getElementType();
if(elementType == BodyElementType.TABLE) {
tableIndex++;
if(tableIndex == pos) {
break;
}
}
eIndex++;
}
document.removeBodyElement(eIndex);
}
public XWPFTable getTableByIndex(XWPFdocument document, int index) {
List tableList = document.getTables();
if(tableList == null || index < 0 || index > tableList.size()) {
return null;
}
return tableList.get(index);
}
public List> getTableRConten(XWPFTable table) {
List> tableContextList = new ArrayList>();
for(int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
List cellContentList = new ArrayList();
for(int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++ ) {
XWPFTableCell cell = row.getCell(colIndex);
CTTc ctTc = cell.getCTTc();
if(ctTc.isSetTcPr()) {
CTTcPr tcPr = ctTc.getTcPr();
if(tcPr.isSetHMerge()) {
CTHMerge hMerge = tcPr.getHMerge();
if(STMerge.RESTART.equals(hMerge.getVal())) {
cellContentList.add(getTableCellContent(cell));
}
} else if(tcPr.isSetVMerge()) {
CTVMerge vMerge = tcPr.getVMerge();
if(STMerge.RESTART.equals(vMerge.getVal())) {
cellContentList.add(getTableCellContent(cell));
}
} else {
cellContentList.add(getTableCellContent(cell));
}
}
}
tableContextList.add(cellContentList);
}
return tableContextList;
}
public String getTableCellContent(XWPFTableCell cell) {
StringBuffer sb = new StringBuffer();
List cellParagList = cell.getParagraphs();
if(cellParagList != null && cellParagList.size() > 0) {
for(XWPFParagraph xwpfPr: cellParagList) {
List runs = xwpfPr.getRuns();
if(runs != null && runs.size() > 0) {
for(XWPFRun xwpfRun : runs) {
sb.append(xwpfRun.getText(0));
}
}
}
}
return sb.toString();
}
public List> getTableContent(XWPFTable table) {
List> tableContentList = new ArrayList>();
for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
List cellContentList = new ArrayList();
for (int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++) {
XWPFTableCell cell = row.getCell(colIndex);
cellContentList.add(getTableCellContent(cell));
}
tableContentList.add(cellContentList);
}
return tableContentList;
}
public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
for(int cellIndex = fromCell; cellIndex <= toCell; cellIndex++ ) {
XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
if(cellIndex == fromCell) {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
for(int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
//第一个合并单元格用重启合并值设置
if(rowIndex == fromRow) {
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
//合并第一个单元格的单元被设置为“继续”
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
}
public XWPFTable createTable(XWPFdocument xdoc, int rowSize, int cellSize,
boolean isSetColWidth, int[] colWidths) {
XWPFTable table = xdoc.createTable(rowSize, cellSize);
if (isSetColWidth) {
CTTbl ttbl = table.getCTTbl();
CTTblGrid tblGrid = ttbl.addNewTblGrid();
for (int j = 0, len = Math.min(cellSize, colWidths.length); j < len; j++) {
CTTblGridCol gridCol = tblGrid.addNewGridCol();
gridCol.setW(new BigInteger(String.valueOf(colWidths[j])));
}
}
return table;
}
public void setTableWidthAndHAlign(XWPFTable table, String width,
STJc.Enum enumValue) {
CTTblPr tblPr = getTableCTTblPr(table);
// 表格宽度
CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
if (enumValue != null) {
CTJc cTJc = tblPr.addNewJc();
cTJc.setVal(enumValue);
}
// 设置宽度
tblWidth.setW(new BigInteger(width));
tblWidth.setType(STTblWidth.DXA);
}
public CTTblPr getTableCTTblPr(XWPFTable table) {
CTTbl ttbl = table.getCTTbl();
// 表格属性
CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
return tblPr;
}
public void setTableHeight(XWPFTable infoTable, int heigth, STVerticalJc.Enum vertical) {
List rows = infoTable.getRows();
for(XWPFTableRow row : rows) {
CTTrPr trPr = row.getCtRow().addNewTrPr();
CTHeight ht = trPr.addNewTrHeight();
ht.setVal(BigInteger.valueOf(heigth));
List cells = row.getTableCells();
for(XWPFTableCell tableCell : cells ) {
CTTcPr cttcpr = tableCell.getCTTc().addNewTcPr();
cttcpr.addNewVAlign().setVal(vertical);
}
}
}
}
测试类
public class TestExportWord {
private static Logger logger = LoggerFactory.getLogger(TestExportWord.class);
public static void export(String number,String name,String city,String bktype,String sex,String nation,
String country,String zjtype,String bank,String phone,String type) {
ExportWord ew = new ExportWord();
XWPFdocument document = ew.createXWPFdocument("(一式两联 "+type+"联)");
List> list = new ArrayList>();
List



