首先声明一些基本概念:
XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
XWPFRun代表具有同样风格的一段文本
XWPFTable代表一个表格
XWPFTableRow代表表格的一行
XWPFTableCell代表表格的一个单元格
XWPFChar 表示.docx文件中的图表
XWPFHyperlink 表示超链接
XWPFPicture 代表图片
注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。
先看效果图:(完全是由代码导出)
1.导入jar包:
(虽然只有两个,但是会自动依赖其他jar包进来)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
这是依赖包:
2. 代码部分:
package cn.hxc.myWorld.myWorld;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
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.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
import cn.hxc.myWorld.util.XWPFHelper;
import cn.hxc.myWorld.util.XWPFHelperTable;
/**
* @Description 导出word文档
* @Author Huangxiaocong
* 2018年12月1日 下午12:12:15
*/
public class ExportWord {
private XWPFHelperTable xwpfHelperTable = null;
private XWPFHelper xwpfHelper = null;
public ExportWord() {
xwpfHelperTable = new XWPFHelperTable();
xwpfHelper = new XWPFHelper();
}
/**
* 创建好文档的基本 标题,表格 段落等部分
* @return
* @Author Huangxiaocong 2018年12月16日
*/
public XWPFDocument createXWPFDocument() {
XWPFDocument doc = new XWPFDocument();
createTitleParagraph(doc);
createTableParagraph(doc, 10, 6);
return doc;
}
/**
* 创建表格的标题样式
* @param document
* @Author Huangxiaocong 2018年12月16日 下午5:28:38
*/
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(); //换行
}
/**
* 设置表格
* @param document
* @param rows
* @param cols
* @Author Huangxiaocong 2018年12月16日
*/
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, 1, 1, 5);
xwpfHelperTable.mergeCellsVertically(infoTable, 0, 3, 6);
for(int col = 3; col < 7; col++) {
xwpfHelperTable.mergeCellsHorizontal(infoTable, col, 1, 5);
}
//设置表格样式
List<XWPFTableRow> rowList = infoTable.getRows();
for(int i = 0; i < rowList.size(); i++) {
XWPFTableRow infoTableRow = rowList.get(i);
List<XWPFTableCell> cellList = infoTableRow.getTableCells();
for(int j = 0; j < cellList.size(); j++) {
XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0);
cellParagraph.setAlignment(ParagraphAlignment.CENTER);
XWPFRun cellParagraphRun = cellParagraph.createRun();
cellParagraphRun.setFontSize(12);
if(i % 2 != 0) {
cellParagraphRun.setBold(true);
}
}
}
xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);
}
/**
* 往表格中填充数据
* @param dataList
* @param document
* @throws IOException
* @Author Huangxiaocong 2018年12月16日
*/
@SuppressWarnings("unchecked")
public void exportCheckWord(Map<String, Object> dataList, XWPFDocument document, String savePath) throws IOException {
XWPFParagraph paragraph = document.getParagraphArray(0);
XWPFRun titleFun = paragraph.getRuns().get(0);
titleFun.setText(String.valueOf(dataList.get("TITLE")));
List<List<Object>> tableData = (List<List<Object>>) dataList.get("TABLEDATA");
XWPFTable table = document.getTableArray(0);
fillTableData(table, tableData);
xwpfHelper.saveDocument(document, savePath);
}
/**
* 往表格中填充数据
* @param table
* @param tableData
* @Author Huangxiaocong 2018年12月16日
*/
public void fillTableData(XWPFTable table, List<List<Object>> tableData) {
List<XWPFTableRow> rowList = table.getRows();
for(int i = 0; i < tableData.size(); i++) {
List<Object> list = tableData.get(i);
List<XWPFTableCell> cellList = rowList.get(i).getTableCells();
for(int j = 0; j < list.size(); j++) {
XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0);
XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);
cellParagraphRun.setText(String.valueOf(list.get(j)));
}
}
}
}
下面是用到的工具类:
package cn.hxc.myWorld.util;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
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.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.apache.poi.xwpf.usermodel.XWPFRelation;
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.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
import cn.hxc.myWorld.domain.ParagraphStyle;
import cn.hxc.myWorld.domain.TextStyle;
/**
* @Description 设置docx文档的样式及一些操作
* @Author Huangxiaocong
* 2018年12月1日 下午12:18:41
* 基本概念说明:XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
* XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
* XWPFRun代表具有同样风格的一段文本
* XWPFTable代表一个表格
* XWPFTableRow代表表格的一行
* XWPFTableCell代表表格的一个单元格
* XWPFChar 表示.docx文件中的图表
* XWPFHyperlink 表示超链接
* XWPFPicture 代表图片
*
* 注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。
*/
public class XWPFHelper {
private static Logger logger = Logger.getLogger(XWPFHelper.class.toString());
/**
* 创建一个word对象
* @return
* @Author Huangxiaocong 2018年12月1日 上午11:56:35
*/
public XWPFDocument createDocument() {
XWPFDocument document = new XWPFDocument();
return document;
}
/**
* 打开word文档
* @param path 文档所在路径
* @return
* @throws IOException
* @Author Huangxiaocong 2018年12月1日 下午12:30:07
*/
public XWPFDocument openDoc(String path) throws IOException {
InputStream is = new FileInputStream(path);
return new XWPFDocument(is);
}
/**
* 保存word文档
* @param document 文档对象
* @param savePath 保存路径
* @throws IOException
* @Author Huangxiaocong 2018年12月1日 下午12:32:37
*/
public void saveDocument(XWPFDocument document, String savePath) throws IOException {
OutputStream os = new FileOutputStream(savePath);
document.write(os);
os.close();
}
/**
* 设置段落文本样式 设置超链接及样式
* @param paragraph
* @param textStyle
* @param url
* @Author Huangxiaocong 2018年12月1日 下午3:56:32
*/
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());
//...
}
//设置字体大小
}
/**
* 设置段落的基本样式 设置段落间距信息, 一行 = 100 一磅=20
* @param paragraph
* @param paragStyle
* @Author Huangxiaocong 2018年12月1日 下午4:27:17
*/
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); //
}
}
}
/**
* 设置段落缩进信息 1厘米 约等于 567
* @param paragraph
* @param paragStyle
* @Author Huangxiaocong 2018年12月1日 下午7:59:35
*/
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()));
}
//再进行其他设置
//...
}
/**
* 设置段落对齐 方式
* @param paragraph
* @param pAlign
* @param valign
* @Author Huangxiaocong 2018年12月1日 下午8:54:43
*/
public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {
if(pAlign != null) {
paragraph.setAlignment(pAlign);
}
if(valign != null) {
paragraph.setVerticalAlignment(valign);
}
}
/**
* 得到段落的CTPPr
* @param paragraph
* @return
* @Author Huangxiaocong 2018年12月1日 下午7:36:10
*/
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;
}
/**
* 得到XWPFRun的CTRPr
* @param paragraph
* @param pRun
* @return
* @Author Huangxiaocong 2018年12月1日 下午7:46:01
*/
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;
}
/**
* 复制表格
* @param targetTable
* @param sourceTable
* @Author Huangxiaocong 2018年12月1日 下午1:40:01
*/
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);
}
}
}
/**
* 复制单元格
* @param targetRow
* @param sourceRow
* @Author Huangxiaocong 2018年12月1日 下午1:33:22
*/
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);
}
}
/**
* 复制单元格(列) 从sourceCell到targetCell
* @param targetCell
* @param sourceCell
* @Author Huangxiaocong 2018年12月1日 下午1:27:38
*/
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);
}
}
/**
* 复制段落,从sourceParag到targetParag
* @param targetParag
* @param sourceParag
* @Author Huangxiaocong 2018年12月1日 下午1:16:26
*/
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);
}
}
/**
* 复制XWPFRun 从sourceRun到targetRun
* @param targetRun
* @param sourceRun
* @Author Huangxiaocong 2018年12月1日 下午12:56:53
*/
public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) {
//设置targetRun属性
targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());
targetRun.setText(sourceRun.text());//设置文本
//处理图片
List<XWPFPicture> 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);
}
}
}
/**
* 复制图片从sourcePicture到 targetRun(XWPFPicture --> XWPFRun)
* @param targetRun
* @param source
* @throws IOException
* @throws InvalidFormatException
* @Author Huangxiaocong 2018年12月1日 下午12:57:33
*/
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();//分行
}
}
工具类二:
package cn.hxc.myWorld.util;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.xwpf.usermodel.BodyElementType;
import org.apache.poi.xwpf.usermodel.IBodyElement;
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.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol;
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.CTTrPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
/**
* @Description 操作word的基本工具类
* 2018年12月3日 上午11:12:18
* @Author Huangxiaocong
*/
public class XWPFHelperTable {
/**
* 删除指定位置的表格,被删除表格后的索引位置
* @param document
* @param pos
* @Author Huangxiaocong 2018年12月1日 下午10:32:43
*/
public void deleteTableByIndex(XWPFDocument document, int pos) {
Iterator<IBodyElement> 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);
}
/**
* 获得指定位置的表格
* @param document
* @param index
* @return
* @Author Huangxiaocong 2018年12月1日 下午10:34:14
*/
public XWPFTable getTableByIndex(XWPFDocument document, int index) {
List<XWPFTable> tableList = document.getTables();
if(tableList == null || index < 0 || index > tableList.size()) {
return null;
}
return tableList.get(index);
}
/**
* 得到表格的内容(第一次跨行单元格视为一个,第二次跳过跨行合并的单元格)
* @param table
* @return
* @Author Huangxiaocong 2018年12月1日 下午10:46:41
*/
public List<List<String>> getTableRConten(XWPFTable table) {
List<List<String>> tableContextList = new ArrayList<List<String>>();
for(int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
List<String> cellContentList = new ArrayList<String>();
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;
}
/**
* 获得一个表格的单元格的内容
* @param cell
* @return
* @Author Huangxiaocong 2018年12月2日 下午7:39:23
*/
public String getTableCellContent(XWPFTableCell cell) {
StringBuffer sb = new StringBuffer();
List<XWPFParagraph> cellParagList = cell.getParagraphs();
if(cellParagList != null && cellParagList.size() > 0) {
for(XWPFParagraph xwpfPr: cellParagList) {
List<XWPFRun> runs = xwpfPr.getRuns();
if(runs != null && runs.size() > 0) {
for(XWPFRun xwpfRun : runs) {
sb.append(xwpfRun.getText(0));
}
}
}
}
return sb.toString();
}
/**
* 得到表格内容,合并后的单元格视为一个单元格
* @param table
* @return
* @Author Huangxiaocong 2018年12月2日 下午7:47:19
*/
public List<List<String>> getTableContent(XWPFTable table) {
List<List<String>> tableContentList = new ArrayList<List<String>>();
for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
List<String> cellContentList = new ArrayList<String>();
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;
}
/**
* 跨列合并
* @param table
* @param row 所合并的行
* @param fromCell 起始列
* @param toCell 终止列
* @Description
* @Author Huangxiaocong 2018年11月26日 下午9:23:22
*/
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);
}
}
}
/**
* 跨行合并
* @param table
* @param col 合并的列
* @param fromRow 起始行
* @param toRow 终止行
* @Description
* @Author Huangxiaocong 2018年11月26日 下午9:09:19
*/
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);
}
}
}
/**
* @Description: 创建表格,创建后表格至少有1行1列,设置列宽
*/
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;
}
/**
* @Description: 设置表格总宽度与水平对齐方式
*/
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);
}
/**
* @Description: 得到Table的CTTblPr,不存在则新建
*/
public CTTblPr getTableCTTblPr(XWPFTable table) {
CTTbl ttbl = table.getCTTbl();
// 表格属性
CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
return tblPr;
}
/**
* 设置表格行高
* @param infoTable
* @param heigth 高度
* @param vertical 表格内容的显示方式:居中、靠右...
* @Author Huangxiaocong 2018年12月16日
*/
public void setTableHeight(XWPFTable infoTable, int heigth, STVerticalJc.Enum vertical) {
List<XWPFTableRow> rows = infoTable.getRows();
for(XWPFTableRow row : rows) {
CTTrPr trPr = row.getCtRow().addNewTrPr();
CTHeight ht = trPr.addNewTrHeight();
ht.setVal(BigInteger.valueOf(heigth));
List<XWPFTableCell> cells = row.getTableCells();
for(XWPFTableCell tableCell : cells ) {
CTTcPr cttcpr = tableCell.getCTTc().addNewTcPr();
cttcpr.addNewVAlign().setVal(vertical);
}
}
}
}
实体类(自己填写get/set方法):
/**
* @Description 文本样式
* 2018年12月1日 下午4:09:30
* @Author Huangxiaocong
*/
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; //底纹
//此处省略get/set方法...
}
/**
* @Description 段落样式
* 2018年12月1日 下午4:20:05
* @Author Huangxiaocong
*/
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;
//此处省略get/set方法...
}
最后是测试类:
package cn.hxc.myWorld.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import cn.hxc.myWorld.myWorld.ExportWord;
public class TestExportWord {
public static void main(String[] args) throws Exception {
ExportWord ew = new ExportWord();
XWPFDocument document = ew.createXWPFDocument();
List<List<Object>> list = new ArrayList<List<Object>>();
List<Object> tempList = new ArrayList<Object>();
tempList.add("姓名");
tempList.add("黄xx");
tempList.add("性别");
tempList.add("男");
tempList.add("出生日期");
tempList.add("2018-10-10");
list.add(tempList);
tempList = new ArrayList<Object>();
tempList.add("身份证号");
tempList.add("36073xxxxxxxxxxx");
list.add(tempList);
tempList = new ArrayList<Object>();
tempList.add("出生地");
tempList.add("江西");
tempList.add("名族");
tempList.add("汉");
tempList.add("婚否");
tempList.add("否");
list.add(tempList);
tempList = new ArrayList<Object>();
tempList.add("既往病史");
tempList.add("无");
list.add(tempList);
Map<String, Object> dataList = new HashMap<String, Object>();
dataList.put("TITLE", "个人体检表");
dataList.put("TABLEDATA", list);
ew.exportCheckWord(dataList, document, "E:/expWordTest.docx");
System.out.println("文档生成成功");
}
}
效果如图:
总的制作完毕。