packagecn.hxc.myWorld.util;importjava.io.ByteArrayInputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.math.BigInteger;importjava.util.List;importjava.util.logging.Level;importjava.util.logging.Logger;importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;importorg.apache.poi.xwpf.usermodel.ParagraphAlignment;importorg.apache.poi.xwpf.usermodel.TextAlignment;importorg.apache.poi.xwpf.usermodel.XWPFDocument;importorg.apache.poi.xwpf.usermodel.XWPFParagraph;importorg.apache.poi.xwpf.usermodel.XWPFPicture;importorg.apache.poi.xwpf.usermodel.XWPFPictureData;importorg.apache.poi.xwpf.usermodel.XWPFRelation;importorg.apache.poi.xwpf.usermodel.XWPFRun;importorg.apache.poi.xwpf.usermodel.XWPFTable;importorg.apache.poi.xwpf.usermodel.XWPFTableCell;importorg.apache.poi.xwpf.usermodel.XWPFTableRow;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;importorg.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;importcn.hxc.myWorld.domain.ParagraphStyle;importcn.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 classXWPFHelper {private static Logger logger = Logger.getLogger(XWPFHelper.class.toString());/*** 创建一个word对象
*@return* @Author Huangxiaocong 2018年12月1日 上午11:56:35*/
publicXWPFDocument createDocument() {
XWPFDocument document= newXWPFDocument();returndocument;
}/*** 打开word文档
*@parampath 文档所在路径
*@return*@throwsIOException
* @Author Huangxiaocong 2018年12月1日 下午12:30:07*/
public XWPFDocument openDoc(String path) throwsIOException {
InputStream is= newFileInputStream(path);return newXWPFDocument(is);
}/*** 保存word文档
*@paramdocument 文档对象
*@paramsavePath 保存路径
*@throwsIOException
* @Author Huangxiaocong 2018年12月1日 下午12:32:37*/
public void saveDocument(XWPFDocument document, String savePath) throwsIOException {
OutputStream os= newFileOutputStream(savePath);
document.write(os);
os.close();
}/*** 设置段落文本样式 设置超链接及样式
*@paramparagraph
*@paramtextStyle
*@paramurl
* @Author Huangxiaocong 2018年12月1日 下午3:56:32*/
public voidaddParagraphTextHyperlink(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
*@paramparagraph
*@paramparagStyle
* @Author Huangxiaocong 2018年12月1日 下午4:27:17*/
public voidsetParagraphSpacingInfo(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(newBigInteger(paragStyle.getBefore()));
}//段后磅数
if(paragStyle.getAfter() != null) {
pSpacing.setAfter(newBigInteger(paragStyle.getAfter()));
}//依次设置段前行数、段后行数//...
}//间距
if(paragStyle.isLine()) {if(paragStyle.getLine() != null) {
pSpacing.setLine(newBigInteger(paragStyle.getLine()));
}if(lineValue != null) {
pSpacing.setLineRule(lineValue);//}
}
}/*** 设置段落缩进信息 1厘米 约等于 567
*@paramparagraph
*@paramparagStyle
* @Author Huangxiaocong 2018年12月1日 下午7:59:35*/
public voidsetParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) {
CTPPr pPPr=getParagraphCTPPr(paragraph);
CTInd pInd= pPPr.getInd() != null ?pPPr.getInd() : pPPr.addNewInd();if(paragStyle.getFirstLine() != null) {
pInd.setFirstLine(newBigInteger(paragStyle.getFirstLine()));
}//再进行其他设置//...
}/*** 设置段落对齐 方式
*@paramparagraph
*@parampAlign
*@paramvalign
* @Author Huangxiaocong 2018年12月1日 下午8:54:43*/
public voidsetParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {if(pAlign != null) {
paragraph.setAlignment(pAlign);
}if(valign != null) {
paragraph.setVerticalAlignment(valign);
}
}/*** 得到段落的CTPPr
*@paramparagraph
*@return* @Author Huangxiaocong 2018年12月1日 下午7:36:10*/
publicCTPPr getParagraphCTPPr(XWPFParagraph paragraph) {
CTPPr pPPr= null;if(paragraph.getCTP() != null) {if(paragraph.getCTP().getPPr() != null) {
pPPr=paragraph.getCTP().getPPr();
}else{
pPPr=paragraph.getCTP().addNewPPr();
}
}returnpPPr;
}/*** 得到XWPFRun的CTRPr
*@paramparagraph
*@parampRun
*@return* @Author Huangxiaocong 2018年12月1日 下午7:46:01*/
publicCTRPr 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();
}returnctrPr;
}/*** 复制表格
*@paramtargetTable
*@paramsourceTable
* @Author Huangxiaocong 2018年12月1日 下午1:40:01*/
public voidcopyTable(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);
}
}
}/*** 复制单元格
*@paramtargetRow
*@paramsourceRow
* @Author Huangxiaocong 2018年12月1日 下午1:33:22*/
public voidcopyTableRow(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
*@paramtargetCell
*@paramsourceCell
* @Author Huangxiaocong 2018年12月1日 下午1:27:38*/
public voidcopyTableCell(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
*@paramtargetParag
*@paramsourceParag
* @Author Huangxiaocong 2018年12月1日 下午1:16:26*/
public voidcopyParagraph(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
*@paramtargetRun
*@paramsourceRun
* @Author Huangxiaocong 2018年12月1日 下午12:56:53*/
public voidcopyRun(XWPFRun targetRun, XWPFRun sourceRun) {//设置targetRun属性
targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());
targetRun.setText(sourceRun.text());//设置文本//处理图片
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);
}
}
}/*** 复制图片从sourcePicture到 targetRun(XWPFPicture --> XWPFRun)
*@paramtargetRun
*@paramsource
*@throwsIOException
*@throwsInvalidFormatException
* @Author Huangxiaocong 2018年12月1日 下午12:57:33*/
public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throwsInvalidFormatException, IOException {
XWPFPictureData picData=sourcePicture.getPictureData();
String fileName= picData.getFileName(); //图片的名称
InputStream picInIsData = newByteArrayInputStream(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();//分行
}
}