• [简单]docx4j常用方法小结


       1 import java.io.File;
       2 import java.io.FileInputStream;
       3 import java.io.InputStream;
       4 import java.io.StringWriter;
       5 import java.math.BigInteger;
       6 import java.util.ArrayList;
       7 import java.util.List;
       8 
       9 import javax.xml.bind.JAXBElement;
      10 
      11 import org.apache.commons.io.IOUtils;
      12 import org.apache.commons.lang3.StringUtils;
      13 import org.docx4j.TextUtils;
      14 import org.docx4j.XmlUtils;
      15 import org.docx4j.dml.wordprocessingDrawing.Inline;
      16 import org.docx4j.model.properties.table.tr.TrHeight;
      17 import org.docx4j.openpackaging.packages.OpcPackage;
      18 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
      19 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
      20 import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
      21 import org.docx4j.openpackaging.parts.relationships.Namespaces;
      22 import org.docx4j.wml.BooleanDefaultTrue;
      23 import org.docx4j.wml.Br;
      24 import org.docx4j.wml.CTBackground;
      25 import org.docx4j.wml.CTBorder;
      26 import org.docx4j.wml.CTEm;
      27 import org.docx4j.wml.CTHeight;
      28 import org.docx4j.wml.CTLineNumber;
      29 import org.docx4j.wml.CTShd;
      30 import org.docx4j.wml.CTSignedHpsMeasure;
      31 import org.docx4j.wml.CTSignedTwipsMeasure;
      32 import org.docx4j.wml.CTTblCellMar;
      33 import org.docx4j.wml.CTTextScale;
      34 import org.docx4j.wml.CTVerticalAlignRun;
      35 import org.docx4j.wml.CTVerticalJc;
      36 import org.docx4j.wml.Color;
      37 import org.docx4j.wml.ContentAccessor;
      38 import org.docx4j.wml.Drawing;
      39 import org.docx4j.wml.Highlight;
      40 import org.docx4j.wml.HpsMeasure;
      41 import org.docx4j.wml.Jc;
      42 import org.docx4j.wml.JcEnumeration;
      43 import org.docx4j.wml.ObjectFactory;
      44 import org.docx4j.wml.P;
      45 import org.docx4j.wml.P.Hyperlink;
      46 import org.docx4j.wml.PPr;
      47 import org.docx4j.wml.PPrBase.Ind;
      48 import org.docx4j.wml.PPrBase.PBdr;
      49 import org.docx4j.wml.PPrBase.Spacing;
      50 import org.docx4j.wml.ParaRPr;
      51 import org.docx4j.wml.R;
      52 import org.docx4j.wml.RFonts;
      53 import org.docx4j.wml.RPr;
      54 import org.docx4j.wml.STBorder;
      55 import org.docx4j.wml.STBrType;
      56 import org.docx4j.wml.STEm;
      57 import org.docx4j.wml.STLineNumberRestart;
      58 import org.docx4j.wml.STLineSpacingRule;
      59 import org.docx4j.wml.STPageOrientation;
      60 import org.docx4j.wml.STShd;
      61 import org.docx4j.wml.STVerticalAlignRun;
      62 import org.docx4j.wml.STVerticalJc;
      63 import org.docx4j.wml.SectPr;
      64 import org.docx4j.wml.SectPr.PgBorders;
      65 import org.docx4j.wml.SectPr.PgMar;
      66 import org.docx4j.wml.SectPr.PgSz;
      67 import org.docx4j.wml.SectPr.Type;
      68 import org.docx4j.wml.Tbl;
      69 import org.docx4j.wml.TblBorders;
      70 import org.docx4j.wml.TblGrid;
      71 import org.docx4j.wml.TblGridCol;
      72 import org.docx4j.wml.TblPr;
      73 import org.docx4j.wml.TblWidth;
      74 import org.docx4j.wml.Tc;
      75 import org.docx4j.wml.TcPr;
      76 import org.docx4j.wml.TcPrInner.GridSpan;
      77 import org.docx4j.wml.TcPrInner.HMerge;
      78 import org.docx4j.wml.TcPrInner.VMerge;
      79 import org.docx4j.wml.Text;
      80 import org.docx4j.wml.TextDirection;
      81 import org.docx4j.wml.Tr;
      82 import org.docx4j.wml.TrPr;
      83 import org.docx4j.wml.U;
      84 import org.docx4j.wml.UnderlineEnumeration;
      85 
      86 //代码基于docx4j-3.2.0
      87 public class Docx4j_工具类_S3_Test {
      88 
      89     /*------------------------------------other--------------------------------------------------- */
      90     /**
      91      * @Description:新增超链接
      92      */
      93     public void createHyperlink(WordprocessingMLPackage wordMLPackage, MainDocumentPart mainPart, ObjectFactory factory,
      94             P paragraph, String url, String value, String cnFontName, String enFontName, String fontSize)
      95             throws Exception {
      96         if (StringUtils.isBlank(enFontName)) {
      97             enFontName = "Times New Roman";
      98         }
      99         if (StringUtils.isBlank(cnFontName)) {
     100             cnFontName = "微软雅黑";
     101         }
     102         if (StringUtils.isBlank(fontSize)) {
     103             fontSize = "22";
     104         }
     105         org.docx4j.relationships.ObjectFactory reFactory = new org.docx4j.relationships.ObjectFactory();
     106         org.docx4j.relationships.Relationship rel = reFactory.createRelationship();
     107         rel.setType(Namespaces.HYPERLINK);
     108         rel.setTarget(url);
     109         rel.setTargetMode("External");
     110         mainPart.getRelationshipsPart().addRelationship(rel);
     111         StringBuffer sb = new StringBuffer();
     112         // addRelationship sets the rel's @Id
     113         sb.append("<w:hyperlink r:id="");
     114         sb.append(rel.getId());
     115         sb.append("" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" ");
     116         sb.append("xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" >");
     117         sb.append("<w:r><w:rPr><w:rStyle w:val="Hyperlink" />");
     118         sb.append("<w:rFonts w:ascii="");
     119         sb.append(enFontName);
     120         sb.append("" w:hAnsi="");
     121         sb.append(enFontName);
     122         sb.append("" w:eastAsia="");
     123         sb.append(cnFontName);
     124         sb.append("" w:hint="eastAsia"/>");
     125         sb.append("<w:sz w:val="");
     126         sb.append(fontSize);
     127         sb.append(""/><w:szCs w:val="");
     128         sb.append(fontSize);
     129         sb.append(""/></w:rPr><w:t>");
     130         sb.append(value);
     131         sb.append("</w:t></w:r></w:hyperlink>");
     132 
     133         Hyperlink link = (Hyperlink) XmlUtils.unmarshalString(sb.toString());
     134         paragraph.getContent().add(link);
     135     }
     136 
     137     public String getElementContent(Object obj) throws Exception {
     138         StringWriter stringWriter = new StringWriter();
     139         TextUtils.extractText(obj, stringWriter);
     140         return stringWriter.toString();
     141     }
     142 
     143     /**
     144      * @Description:得到指定类型的元素
     145      */
     146     public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
     147         List<Object> result = new ArrayList<Object>();
     148         if (obj instanceof JAXBElement)
     149             obj = ((JAXBElement<?>) obj).getValue();
     150         if (obj.getClass().equals(toSearch))
     151             result.add(obj);
     152         else if (obj instanceof ContentAccessor) {
     153             List<?> children = ((ContentAccessor) obj).getContent();
     154             for (Object child : children) {
     155                 result.addAll(getAllElementFromObject(child, toSearch));
     156             }
     157         }
     158         return result;
     159     }
     160 
     161     /**
     162      * @Description:保存WordprocessingMLPackage
     163      */
     164     public void saveWordPackage(WordprocessingMLPackage wordPackage, File file) throws Exception {
     165         wordPackage.save(file);
     166     }
     167 
     168     /**
     169      * @Description:新建WordprocessingMLPackage
     170      */
     171     public WordprocessingMLPackage createWordprocessingMLPackage() throws Exception {
     172         return WordprocessingMLPackage.createPackage();
     173     }
     174 
     175     /**
     176      * @Description:加载带密码WordprocessingMLPackage
     177      */
     178     public WordprocessingMLPackage loadWordprocessingMLPackageWithPwd(String filePath, String password)
     179             throws Exception {
     180         OpcPackage opcPackage = WordprocessingMLPackage.load(new java.io.File(filePath), password);
     181         WordprocessingMLPackage wordMLPackage = (WordprocessingMLPackage) opcPackage;
     182         return wordMLPackage;
     183     }
     184 
     185     /**
     186      * @Description:加载WordprocessingMLPackage
     187      */
     188     public WordprocessingMLPackage loadWordprocessingMLPackage(String filePath) throws Exception {
     189         WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(filePath));
     190         return wordMLPackage;
     191     }
     192 
     193     /*------------------------------------Word 表格相关--------------------------------------------------- */
     194     /**
     195      * @Description: 跨列合并
     196      */
     197     public void mergeCellsHorizontalByGridSpan(Tbl tbl, int row, int fromCell, int toCell) {
     198         if (row < 0 || fromCell < 0 || toCell < 0) {
     199             return;
     200         }
     201         List<Tr> trList = getTblAllTr(tbl);
     202         if (row > trList.size()) {
     203             return;
     204         }
     205         Tr tr = trList.get(row);
     206         List<Tc> tcList = getTrAllCell(tr);
     207         for (int cellIndex = Math.min(tcList.size() - 1, toCell); cellIndex >= fromCell; cellIndex--) {
     208             Tc tc = tcList.get(cellIndex);
     209             TcPr tcPr = getTcPr(tc);
     210             if (cellIndex == fromCell) {
     211                 GridSpan gridSpan = tcPr.getGridSpan();
     212                 if (gridSpan == null) {
     213                     gridSpan = new GridSpan();
     214                     tcPr.setGridSpan(gridSpan);
     215                 }
     216                 gridSpan.setVal(BigInteger.valueOf(Math.min(tcList.size() - 1, toCell) - fromCell + 1));
     217             } else {
     218                 tr.getContent().remove(cellIndex);
     219             }
     220         }
     221     }
     222 
     223     /**
     224      * @Description: 跨列合并
     225      */
     226     public void mergeCellsHorizontal(Tbl tbl, int row, int fromCell, int toCell) {
     227         if (row < 0 || fromCell < 0 || toCell < 0) {
     228             return;
     229         }
     230         List<Tr> trList = getTblAllTr(tbl);
     231         if (row > trList.size()) {
     232             return;
     233         }
     234         Tr tr = trList.get(row);
     235         List<Tc> tcList = getTrAllCell(tr);
     236         for (int cellIndex = fromCell, len = Math.min(tcList.size() - 1, toCell); cellIndex <= len; cellIndex++) {
     237             Tc tc = tcList.get(cellIndex);
     238             TcPr tcPr = getTcPr(tc);
     239             HMerge hMerge = tcPr.getHMerge();
     240             if (hMerge == null) {
     241                 hMerge = new HMerge();
     242                 tcPr.setHMerge(hMerge);
     243             }
     244             if (cellIndex == fromCell) {
     245                 hMerge.setVal("restart");
     246             } else {
     247                 hMerge.setVal("continue");
     248             }
     249         }
     250     }
     251 
     252     /**
     253      * @Description: 跨行合并
     254      */
     255     public void mergeCellsVertically(Tbl tbl, int col, int fromRow, int toRow) {
     256         if (col < 0 || fromRow < 0 || toRow < 0) {
     257             return;
     258         }
     259         for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
     260             Tc tc = getTc(tbl, rowIndex, col);
     261             if (tc == null) {
     262                 break;
     263             }
     264             TcPr tcPr = getTcPr(tc);
     265             VMerge vMerge = tcPr.getVMerge();
     266             if (vMerge == null) {
     267                 vMerge = new VMerge();
     268                 tcPr.setVMerge(vMerge);
     269             }
     270             if (rowIndex == fromRow) {
     271                 vMerge.setVal("restart");
     272             } else {
     273                 vMerge.setVal("continue");
     274             }
     275         }
     276     }
     277 
     278     /**
     279      * @Description:得到指定位置的单元格
     280      */
     281     public Tc getTc(Tbl tbl, int row, int cell) {
     282         if (row < 0 || cell < 0) {
     283             return null;
     284         }
     285         List<Tr> trList = getTblAllTr(tbl);
     286         if (row >= trList.size()) {
     287             return null;
     288         }
     289         List<Tc> tcList = getTrAllCell(trList.get(row));
     290         if (cell >= tcList.size()) {
     291             return null;
     292         }
     293         return tcList.get(cell);
     294     }
     295 
     296     /**
     297      * @Description:得到所有表格
     298      */
     299     public List<Tbl> getAllTbl(WordprocessingMLPackage wordMLPackage) {
     300         MainDocumentPart mainDocPart = wordMLPackage.getMainDocumentPart();
     301         List<Object> objList = getAllElementFromObject(mainDocPart, Tbl.class);
     302         if (objList == null) {
     303             return null;
     304         }
     305         List<Tbl> tblList = new ArrayList<Tbl>();
     306         for (Object obj : objList) {
     307             if (obj instanceof Tbl) {
     308                 Tbl tbl = (Tbl) obj;
     309                 tblList.add(tbl);
     310             }
     311         }
     312         return tblList;
     313     }
     314 
     315     /**
     316      * @Description:删除指定位置的表格,删除后表格数量减一
     317      */
     318     public boolean removeTableByIndex(WordprocessingMLPackage wordMLPackage, int index) throws Exception {
     319         boolean flag = false;
     320         if (index < 0) {
     321             return flag;
     322         }
     323         List<Object> objList = wordMLPackage.getMainDocumentPart().getContent();
     324         if (objList == null) {
     325             return flag;
     326         }
     327         int k = -1;
     328         for (int i = 0, len = objList.size(); i < len; i++) {
     329             Object obj = XmlUtils.unwrap(objList.get(i));
     330             if (obj instanceof Tbl) {
     331                 k++;
     332                 if (k == index) {
     333                     wordMLPackage.getMainDocumentPart().getContent().remove(i);
     334                     flag = true;
     335                     break;
     336                 }
     337             }
     338         }
     339         return flag;
     340     }
     341 
     342     /**
     343      * @Description: 获取单元格内容,无分割符
     344      */
     345     public String getTblContentStr(Tbl tbl) throws Exception {
     346         return getElementContent(tbl);
     347     }
     348 
     349     /**
     350      * @Description: 获取表格内容
     351      */
     352     public List<String> getTblContentList(Tbl tbl) throws Exception {
     353         List<String> resultList = new ArrayList<String>();
     354         List<Tr> trList = getTblAllTr(tbl);
     355         for (Tr tr : trList) {
     356             StringBuffer sb = new StringBuffer();
     357             List<Tc> tcList = getTrAllCell(tr);
     358             for (Tc tc : tcList) {
     359                 sb.append(getElementContent(tc) + ",");
     360             }
     361             resultList.add(sb.toString());
     362         }
     363         return resultList;
     364     }
     365 
     366     public TblPr getTblPr(Tbl tbl) {
     367         TblPr tblPr = tbl.getTblPr();
     368         if (tblPr == null) {
     369             tblPr = new TblPr();
     370             tbl.setTblPr(tblPr);
     371         }
     372         return tblPr;
     373     }
     374 
     375     /**
     376      * @Description: 设置表格总宽度
     377      */
     378     public void setTableWidth(Tbl tbl, String width) {
     379         if (StringUtils.isNotBlank(width)) {
     380             TblPr tblPr = getTblPr(tbl);
     381             TblWidth tblW = tblPr.getTblW();
     382             if (tblW == null) {
     383                 tblW = new TblWidth();
     384                 tblPr.setTblW(tblW);
     385             }
     386             tblW.setW(new BigInteger(width));
     387             tblW.setType("dxa");
     388         }
     389     }
     390 
     391     /**
     392      * @Description:创建表格(默认水平居中,垂直居中)
     393      */
     394     public Tbl createTable(WordprocessingMLPackage wordPackage, int rowNum, int colsNum) throws Exception {
     395         colsNum = Math.max(1, colsNum);
     396         rowNum = Math.max(1, rowNum);
     397         int widthTwips = getWritableWidth(wordPackage);
     398         int colWidth = widthTwips / colsNum;
     399         int[] widthArr = new int[colsNum];
     400         for (int i = 0; i < colsNum; i++) {
     401             widthArr[i] = colWidth;
     402         }
     403         return createTable(rowNum, colsNum, widthArr);
     404     }
     405 
     406     /**
     407      * @Description:创建表格(默认水平居中,垂直居中)
     408      */
     409     public Tbl createTable(int rowNum, int colsNum, int[] widthArr) throws Exception {
     410         colsNum = Math.max(1, Math.min(colsNum, widthArr.length));
     411         rowNum = Math.max(1, rowNum);
     412         Tbl tbl = new Tbl();
     413         StringBuffer tblSb = new StringBuffer();
     414         tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">");
     415         tblSb.append("<w:tblStyle w:val="TableGrid"/>");
     416         tblSb.append("<w:tblW w:w="0" w:type="auto"/>");
     417         // 上边框
     418         tblSb.append("<w:tblBorders>");
     419         tblSb.append("<w:top w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     420         // 左边框
     421         tblSb.append("<w:left w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     422         // 下边框
     423         tblSb.append("<w:bottom w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     424         // 右边框
     425         tblSb.append("<w:right w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     426         tblSb.append("<w:insideH w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     427         tblSb.append("<w:insideV w:val="single" w:sz="1" w:space="0" w:color="auto"/>");
     428         tblSb.append("</w:tblBorders>");
     429         tblSb.append("</w:tblPr>");
     430         TblPr tblPr = null;
     431         tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());
     432         Jc jc = new Jc();
     433         // 单元格居中对齐
     434         jc.setVal(JcEnumeration.CENTER);
     435         tblPr.setJc(jc);
     436 
     437         tbl.setTblPr(tblPr);
     438 
     439         // 设定各单元格宽度
     440         TblGrid tblGrid = new TblGrid();
     441         tbl.setTblGrid(tblGrid);
     442         for (int i = 0; i < colsNum; i++) {
     443             TblGridCol gridCol = new TblGridCol();
     444             gridCol.setW(BigInteger.valueOf(widthArr[i]));
     445             tblGrid.getGridCol().add(gridCol);
     446         }
     447         // 新增行
     448         for (int j = 0; j < rowNum; j++) {
     449             Tr tr = new Tr();
     450             tbl.getContent().add(tr);
     451             //
     452             for (int i = 0; i < colsNum; i++) {
     453                 Tc tc = new Tc();
     454                 tr.getContent().add(tc);
     455 
     456                 TcPr tcPr = new TcPr();
     457                 TblWidth cellWidth = new TblWidth();
     458                 cellWidth.setType("dxa");
     459                 cellWidth.setW(BigInteger.valueOf(widthArr[i]));
     460                 tcPr.setTcW(cellWidth);
     461                 tc.setTcPr(tcPr);
     462 
     463                 // 垂直居中
     464                 setTcVAlign(tc, STVerticalJc.CENTER);
     465                 P p = new P();
     466                 PPr pPr = new PPr();
     467                 pPr.setJc(jc);
     468                 p.setPPr(pPr);
     469                 R run = new R();
     470                 p.getContent().add(run);
     471                 tc.getContent().add(p);
     472             }
     473         }
     474         return tbl;
     475     }
     476 
     477     /**
     478      * @Description:表格增加边框 可以设置上下左右四个边框样式以及横竖水平线样式
     479      */
     480     public void setTblBorders(TblPr tblPr, CTBorder topBorder, CTBorder rightBorder, CTBorder bottomBorder,
     481             CTBorder leftBorder, CTBorder hBorder, CTBorder vBorder) {
     482         TblBorders borders = tblPr.getTblBorders();
     483         if (borders == null) {
     484             borders = new TblBorders();
     485             tblPr.setTblBorders(borders);
     486         }
     487         if (topBorder != null) {
     488             borders.setTop(topBorder);
     489         }
     490         if (rightBorder != null) {
     491             borders.setRight(rightBorder);
     492         }
     493         if (bottomBorder != null) {
     494             borders.setBottom(bottomBorder);
     495         }
     496         if (leftBorder != null) {
     497             borders.setLeft(leftBorder);
     498         }
     499         if (hBorder != null) {
     500             borders.setInsideH(hBorder);
     501         }
     502         if (vBorder != null) {
     503             borders.setInsideV(vBorder);
     504         }
     505     }
     506 
     507     /**
     508      * @Description: 设置表格水平对齐方式(仅对表格起作用,单元格不一定水平对齐)
     509      */
     510     public void setTblJcAlign(Tbl tbl, JcEnumeration jcType) {
     511         if (jcType != null) {
     512             TblPr tblPr = getTblPr(tbl);
     513             Jc jc = tblPr.getJc();
     514             if (jc == null) {
     515                 jc = new Jc();
     516                 tblPr.setJc(jc);
     517             }
     518             jc.setVal(jcType);
     519         }
     520     }
     521 
     522     /**
     523      * @Description: 设置表格水平对齐方式(包括单元格),只对该方法前面产生的单元格起作用
     524      */
     525     public void setTblAllJcAlign(Tbl tbl, JcEnumeration jcType) {
     526         if (jcType != null) {
     527             setTblJcAlign(tbl, jcType);
     528             List<Tr> trList = getTblAllTr(tbl);
     529             for (Tr tr : trList) {
     530                 List<Tc> tcList = getTrAllCell(tr);
     531                 for (Tc tc : tcList) {
     532                     setTcJcAlign(tc, jcType);
     533                 }
     534             }
     535         }
     536     }
     537 
     538     /**
     539      * @Description: 设置表格垂直对齐方式(包括单元格),只对该方法前面产生的单元格起作用
     540      */
     541     public void setTblAllVAlign(Tbl tbl, STVerticalJc vAlignType) {
     542         if (vAlignType != null) {
     543             List<Tr> trList = getTblAllTr(tbl);
     544             for (Tr tr : trList) {
     545                 List<Tc> tcList = getTrAllCell(tr);
     546                 for (Tc tc : tcList) {
     547                     setTcVAlign(tc, vAlignType);
     548                 }
     549             }
     550         }
     551     }
     552 
     553     /**
     554      * @Description: 设置单元格Margin
     555      */
     556     public void setTableCellMargin(Tbl tbl, String top, String right, String bottom, String left) {
     557         TblPr tblPr = getTblPr(tbl);
     558         CTTblCellMar cellMar = tblPr.getTblCellMar();
     559         if (cellMar == null) {
     560             cellMar = new CTTblCellMar();
     561             tblPr.setTblCellMar(cellMar);
     562         }
     563         if (StringUtils.isNotBlank(top)) {
     564             TblWidth topW = new TblWidth();
     565             topW.setW(new BigInteger(top));
     566             topW.setType("dxa");
     567             cellMar.setTop(topW);
     568         }
     569         if (StringUtils.isNotBlank(right)) {
     570             TblWidth rightW = new TblWidth();
     571             rightW.setW(new BigInteger(right));
     572             rightW.setType("dxa");
     573             cellMar.setRight(rightW);
     574         }
     575         if (StringUtils.isNotBlank(bottom)) {
     576             TblWidth btW = new TblWidth();
     577             btW.setW(new BigInteger(bottom));
     578             btW.setType("dxa");
     579             cellMar.setBottom(btW);
     580         }
     581         if (StringUtils.isNotBlank(left)) {
     582             TblWidth leftW = new TblWidth();
     583             leftW.setW(new BigInteger(left));
     584             leftW.setType("dxa");
     585             cellMar.setLeft(leftW);
     586         }
     587     }
     588 
     589     /**
     590      * @Description: 得到表格所有的行
     591      */
     592     public List<Tr> getTblAllTr(Tbl tbl) {
     593         List<Object> objList = getAllElementFromObject(tbl, Tr.class);
     594         List<Tr> trList = new ArrayList<Tr>();
     595         if (objList == null) {
     596             return trList;
     597         }
     598         for (Object obj : objList) {
     599             if (obj instanceof Tr) {
     600                 Tr tr = (Tr) obj;
     601                 trList.add(tr);
     602             }
     603         }
     604         return trList;
     605 
     606     }
     607 
     608     /**
     609      * @Description:设置tr高度
     610      */
     611     public void setTrHeight(Tr tr, String heigth) {
     612         TrPr trPr = getTrPr(tr);
     613         CTHeight ctHeight = new CTHeight();
     614         ctHeight.setVal(new BigInteger(heigth));
     615         TrHeight trHeight = new TrHeight(ctHeight);
     616         trHeight.set(trPr);
     617     }
     618 
     619     /**
     620      * @Description: 在表格指定位置新增一行,默认居中
     621      */
     622     public void addTrByIndex(Tbl tbl, int index) {
     623         addTrByIndex(tbl, index, STVerticalJc.CENTER, JcEnumeration.CENTER);
     624     }
     625 
     626     /**
     627      * @Description: 在表格指定位置新增一行(默认按表格定义的列数添加)
     628      */
     629     public void addTrByIndex(Tbl tbl, int index, STVerticalJc vAlign, JcEnumeration hAlign) {
     630         TblGrid tblGrid = tbl.getTblGrid();
     631         Tr tr = new Tr();
     632         if (tblGrid != null) {
     633             List<TblGridCol> gridList = tblGrid.getGridCol();
     634             for (TblGridCol tblGridCol : gridList) {
     635                 Tc tc = new Tc();
     636                 setTcWidth(tc, tblGridCol.getW().toString());
     637                 if (vAlign != null) {
     638                     // 垂直居中
     639                     setTcVAlign(tc, vAlign);
     640                 }
     641                 P p = new P();
     642                 if (hAlign != null) {
     643                     PPr pPr = new PPr();
     644                     Jc jc = new Jc();
     645                     // 单元格居中对齐
     646                     jc.setVal(hAlign);
     647                     pPr.setJc(jc);
     648                     p.setPPr(pPr);
     649                 }
     650                 R run = new R();
     651                 p.getContent().add(run);
     652                 tc.getContent().add(p);
     653                 tr.getContent().add(tc);
     654             }
     655         } else {
     656             // 大部分情况都不会走到这一步
     657             Tr firstTr = getTblAllTr(tbl).get(0);
     658             int cellSize = getTcCellSizeWithMergeNum(firstTr);
     659             for (int i = 0; i < cellSize; i++) {
     660                 Tc tc = new Tc();
     661                 if (vAlign != null) {
     662                     // 垂直居中
     663                     setTcVAlign(tc, vAlign);
     664                 }
     665                 P p = new P();
     666                 if (hAlign != null) {
     667                     PPr pPr = new PPr();
     668                     Jc jc = new Jc();
     669                     // 单元格居中对齐
     670                     jc.setVal(hAlign);
     671                     pPr.setJc(jc);
     672                     p.setPPr(pPr);
     673                 }
     674                 R run = new R();
     675                 p.getContent().add(run);
     676                 tc.getContent().add(p);
     677                 tr.getContent().add(tc);
     678             }
     679         }
     680         if (index >= 0 && index < tbl.getContent().size()) {
     681             tbl.getContent().add(index, tr);
     682         } else {
     683             tbl.getContent().add(tr);
     684         }
     685     }
     686 
     687     /**
     688      * @Description: 得到行的列数
     689      */
     690     public int getTcCellSizeWithMergeNum(Tr tr) {
     691         int cellSize = 1;
     692         List<Tc> tcList = getTrAllCell(tr);
     693         if (tcList == null || tcList.size() == 0) {
     694             return cellSize;
     695         }
     696         cellSize = tcList.size();
     697         for (Tc tc : tcList) {
     698             TcPr tcPr = getTcPr(tc);
     699             GridSpan gridSpan = tcPr.getGridSpan();
     700             if (gridSpan != null) {
     701                 cellSize += gridSpan.getVal().intValue() - 1;
     702             }
     703         }
     704         return cellSize;
     705     }
     706 
     707     /**
     708      * @Description: 删除指定行 删除后行数减一
     709      */
     710     public boolean removeTrByIndex(Tbl tbl, int index) {
     711         boolean flag = false;
     712         if (index < 0) {
     713             return flag;
     714         }
     715         List<Object> objList = tbl.getContent();
     716         if (objList == null) {
     717             return flag;
     718         }
     719         int k = -1;
     720         for (int i = 0, len = objList.size(); i < len; i++) {
     721             Object obj = XmlUtils.unwrap(objList.get(i));
     722             if (obj instanceof Tr) {
     723                 k++;
     724                 if (k == index) {
     725                     tbl.getContent().remove(i);
     726                     flag = true;
     727                     break;
     728                 }
     729             }
     730         }
     731         return flag;
     732     }
     733 
     734     public TrPr getTrPr(Tr tr) {
     735         TrPr trPr = tr.getTrPr();
     736         if (trPr == null) {
     737             trPr = new TrPr();
     738             tr.setTrPr(trPr);
     739         }
     740         return trPr;
     741     }
     742 
     743     /**
     744      * @Description:隐藏行(只对表格中间的部分起作用,不包括首尾行)
     745      */
     746     public void setTrHidden(Tr tr, boolean hidden) {
     747         List<Tc> tcList = getTrAllCell(tr);
     748         for (Tc tc : tcList) {
     749             setTcHidden(tc, hidden);
     750         }
     751     }
     752 
     753     /**
     754      * @Description: 设置单元格宽度
     755      */
     756     public void setTcWidth(Tc tc, String width) {
     757         if (StringUtils.isNotBlank(width)) {
     758             TcPr tcPr = getTcPr(tc);
     759             TblWidth tcW = tcPr.getTcW();
     760             if (tcW == null) {
     761                 tcW = new TblWidth();
     762                 tcPr.setTcW(tcW);
     763             }
     764             tcW.setW(new BigInteger(width));
     765             tcW.setType("dxa");
     766         }
     767     }
     768 
     769     /**
     770      * @Description: 隐藏单元格内容
     771      */
     772     public void setTcHidden(Tc tc, boolean hidden) {
     773         List<P> pList = getTcAllP(tc);
     774         for (P p : pList) {
     775             PPr ppr = getPPr(p);
     776             List<Object> objRList = getAllElementFromObject(p, R.class);
     777             if (objRList == null) {
     778                 continue;
     779             }
     780             for (Object objR : objRList) {
     781                 if (objR instanceof R) {
     782                     R r = (R) objR;
     783                     RPr rpr = getRPr(r);
     784                     setRPrVanishStyle(rpr, hidden);
     785                 }
     786             }
     787             setParaVanish(ppr, hidden);
     788         }
     789     }
     790 
     791     public List<P> getTcAllP(Tc tc) {
     792         List<Object> objList = getAllElementFromObject(tc, P.class);
     793         List<P> pList = new ArrayList<P>();
     794         if (objList == null) {
     795             return pList;
     796         }
     797         for (Object obj : objList) {
     798             if (obj instanceof P) {
     799                 P p = (P) obj;
     800                 pList.add(p);
     801             }
     802         }
     803         return pList;
     804     }
     805 
     806     public TcPr getTcPr(Tc tc) {
     807         TcPr tcPr = tc.getTcPr();
     808         if (tcPr == null) {
     809             tcPr = new TcPr();
     810             tc.setTcPr(tcPr);
     811         }
     812         return tcPr;
     813     }
     814 
     815     /**
     816      * @Description: 设置单元格垂直对齐方式
     817      */
     818     public void setTcVAlign(Tc tc, STVerticalJc vAlignType) {
     819         if (vAlignType != null) {
     820             TcPr tcPr = getTcPr(tc);
     821             CTVerticalJc vAlign = new CTVerticalJc();
     822             vAlign.setVal(vAlignType);
     823             tcPr.setVAlign(vAlign);
     824         }
     825     }
     826 
     827     /**
     828      * @Description: 设置单元格水平对齐方式
     829      */
     830     public void setTcJcAlign(Tc tc, JcEnumeration jcType) {
     831         if (jcType != null) {
     832             List<P> pList = getTcAllP(tc);
     833             for (P p : pList) {
     834                 setParaJcAlign(p, jcType);
     835             }
     836         }
     837     }
     838 
     839     public RPr getRPr(R r) {
     840         RPr rpr = r.getRPr();
     841         if (rpr == null) {
     842             rpr = new RPr();
     843             r.setRPr(rpr);
     844         }
     845         return rpr;
     846     }
     847 
     848     /**
     849      * @Description: 获取所有的单元格
     850      */
     851     public List<Tc> getTrAllCell(Tr tr) {
     852         List<Object> objList = getAllElementFromObject(tr, Tc.class);
     853         List<Tc> tcList = new ArrayList<Tc>();
     854         if (objList == null) {
     855             return tcList;
     856         }
     857         for (Object tcObj : objList) {
     858             if (tcObj instanceof Tc) {
     859                 Tc objTc = (Tc) tcObj;
     860                 tcList.add(objTc);
     861             }
     862         }
     863         return tcList;
     864     }
     865 
     866     /**
     867      * @Description: 获取单元格内容
     868      */
     869     public String getTcContent(Tc tc) throws Exception {
     870         return getElementContent(tc);
     871     }
     872 
     873     /**
     874      * @Description:设置单元格内容,content为null则清除单元格内容
     875      */
     876     public void setTcContent(Tc tc, RPr rpr, String content) {
     877         List<Object> pList = tc.getContent();
     878         P p = null;
     879         if (pList != null && pList.size() > 0) {
     880             if (pList.get(0) instanceof P) {
     881                 p = (P) pList.get(0);
     882             }
     883         } else {
     884             p = new P();
     885             tc.getContent().add(p);
     886         }
     887         R run = null;
     888         List<Object> rList = p.getContent();
     889         if (rList != null && rList.size() > 0) {
     890             for (int i = 0, len = rList.size(); i < len; i++) {
     891                 // 清除内容(所有的r
     892                 p.getContent().remove(0);
     893             }
     894         }
     895         run = new R();
     896         p.getContent().add(run);
     897         if (content != null) {
     898             String[] contentArr = content.split("
    ");
     899             Text text = new Text();
     900             text.setSpace("preserve");
     901             text.setValue(contentArr[0]);
     902             run.setRPr(rpr);
     903             run.getContent().add(text);
     904 
     905             for (int i = 1, len = contentArr.length; i < len; i++) {
     906                 Br br = new Br();
     907                 run.getContent().add(br);// 换行
     908                 text = new Text();
     909                 text.setSpace("preserve");
     910                 text.setValue(contentArr[i]);
     911                 run.setRPr(rpr);
     912                 run.getContent().add(text);
     913             }
     914         }
     915     }
     916 
     917     /**
     918      * @Description:设置单元格内容,content为null则清除单元格内容
     919      */
     920     public void removeTcContent(Tc tc) {
     921         List<Object> pList = tc.getContent();
     922         P p = null;
     923         if (pList != null && pList.size() > 0) {
     924             if (pList.get(0) instanceof P) {
     925                 p = (P) pList.get(0);
     926             }
     927         } else {
     928             return;
     929         }
     930         List<Object> rList = p.getContent();
     931         if (rList != null && rList.size() > 0) {
     932             for (int i = 0, len = rList.size(); i < len; i++) {
     933                 // 清除内容(所有的r
     934                 p.getContent().remove(0);
     935             }
     936         }
     937     }
     938 
     939     /**
     940      * @Description:删除指定位置的表格
     941      * @deprecated
     942      */
     943     public void deleteTableByIndex2(WordprocessingMLPackage wordMLPackage, int index) throws Exception {
     944         if (index < 0) {
     945             return;
     946         }
     947         final String xpath = "(//w:tbl)[" + index + "]";
     948         final List<Object> jaxbNodes = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath(xpath, true);
     949         if (jaxbNodes != null && jaxbNodes.size() > 0) {
     950             wordMLPackage.getMainDocumentPart().getContent().remove(jaxbNodes.get(0));
     951         }
     952     }
     953 
     954     /**
     955      * @Description:获取NodeList
     956      * @deprecated
     957      */
     958     public List<Object> getObjectByXpath(WordprocessingMLPackage wordMLPackage, String xpath) throws Exception {
     959         final List<Object> jaxbNodes = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath(xpath, true);
     960         return jaxbNodes;
     961     }
     962 
     963     /*------------------------------------Word 段落相关--------------------------------------------------- */
     964     /**
     965      * @Description: 只删除单独的段落,不包括表格内或其他内的段落
     966      */
     967     public boolean removeParaByIndex(WordprocessingMLPackage wordMLPackage, int index) {
     968         boolean flag = false;
     969         if (index < 0) {
     970             return flag;
     971         }
     972         List<Object> objList = wordMLPackage.getMainDocumentPart().getContent();
     973         if (objList == null) {
     974             return flag;
     975         }
     976         int k = -1;
     977         for (int i = 0, len = objList.size(); i < len; i++) {
     978             if (objList.get(i) instanceof P) {
     979                 k++;
     980                 if (k == index) {
     981                     wordMLPackage.getMainDocumentPart().getContent().remove(i);
     982                     flag = true;
     983                     break;
     984                 }
     985             }
     986         }
     987         return flag;
     988     }
     989 
     990     /**
     991      * @Description: 设置段落水平对齐方式
     992      */
     993     public void setParaJcAlign(P paragraph, JcEnumeration hAlign) {
     994         if (hAlign != null) {
     995             PPr pprop = paragraph.getPPr();
     996             if (pprop == null) {
     997                 pprop = new PPr();
     998                 paragraph.setPPr(pprop);
     999             }
    1000             Jc align = new Jc();
    1001             align.setVal(hAlign);
    1002             pprop.setJc(align);
    1003         }
    1004     }
    1005 
    1006     /**
    1007      * @Description: 设置段落内容
    1008      */
    1009     public void setParaRContent(P p, RPr runProperties, String content) {
    1010         R run = null;
    1011         List<Object> rList = p.getContent();
    1012         if (rList != null && rList.size() > 0) {
    1013             for (int i = 0, len = rList.size(); i < len; i++) {
    1014                 // 清除内容(所有的r
    1015                 p.getContent().remove(0);
    1016             }
    1017         }
    1018         run = new R();
    1019         p.getContent().add(run);
    1020         if (content != null) {
    1021             String[] contentArr = content.split("
    ");
    1022             Text text = new Text();
    1023             text.setSpace("preserve");
    1024             text.setValue(contentArr[0]);
    1025             run.setRPr(runProperties);
    1026             run.getContent().add(text);
    1027 
    1028             for (int i = 1, len = contentArr.length; i < len; i++) {
    1029                 Br br = new Br();
    1030                 run.getContent().add(br);// 换行
    1031                 text = new Text();
    1032                 text.setSpace("preserve");
    1033                 text.setValue(contentArr[i]);
    1034                 run.setRPr(runProperties);
    1035                 run.getContent().add(text);
    1036             }
    1037         }
    1038     }
    1039 
    1040     /**
    1041      * @Description: 添加段落内容
    1042      */
    1043     public void appendParaRContent(P p, RPr runProperties, String content) {
    1044         if (content != null) {
    1045             R run = new R();
    1046             p.getContent().add(run);
    1047             String[] contentArr = content.split("
    ");
    1048             Text text = new Text();
    1049             text.setSpace("preserve");
    1050             text.setValue(contentArr[0]);
    1051             run.setRPr(runProperties);
    1052             run.getContent().add(text);
    1053 
    1054             for (int i = 1, len = contentArr.length; i < len; i++) {
    1055                 Br br = new Br();
    1056                 run.getContent().add(br);// 换行
    1057                 text = new Text();
    1058                 text.setSpace("preserve");
    1059                 text.setValue(contentArr[i]);
    1060                 run.setRPr(runProperties);
    1061                 run.getContent().add(text);
    1062             }
    1063         }
    1064     }
    1065 
    1066     /**
    1067      * @Description: 添加图片到段落
    1068      */
    1069     public void addImageToPara(WordprocessingMLPackage wordMLPackage, ObjectFactory factory, P paragraph,
    1070             String filePath, String content, RPr rpr, String altText, int id1, int id2) throws Exception {
    1071         R run = factory.createR();
    1072         if (content != null) {
    1073             Text text = factory.createText();
    1074             text.setValue(content);
    1075             text.setSpace("preserve");
    1076             run.setRPr(rpr);
    1077             run.getContent().add(text);
    1078         }
    1079 
    1080         InputStream is = new FileInputStream(filePath);
    1081         byte[] bytes = IOUtils.toByteArray(is);
    1082         BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
    1083         Inline inline = imagePart.createImageInline(filePath, altText, id1, id2, false);
    1084         Drawing drawing = factory.createDrawing();
    1085         drawing.getAnchorOrInline().add(inline);
    1086         run.getContent().add(drawing);
    1087         paragraph.getContent().add(run);
    1088     }
    1089 
    1090     /**
    1091      * @Description: 段落添加Br 页面Break(分页符)
    1092      */
    1093     public void addPageBreak(P para, STBrType sTBrType) {
    1094         Br breakObj = new Br();
    1095         breakObj.setType(sTBrType);
    1096         para.getContent().add(breakObj);
    1097     }
    1098 
    1099     /**
    1100      * @Description: 设置段落是否禁止行号(禁止用于当前行号)
    1101      */
    1102     public void setParagraphSuppressLineNum(P p) {
    1103         PPr ppr = getPPr(p);
    1104         BooleanDefaultTrue line = ppr.getSuppressLineNumbers();
    1105         if (line == null) {
    1106             line = new BooleanDefaultTrue();
    1107         }
    1108         line.setVal(true);
    1109         ppr.setSuppressLineNumbers(line);
    1110     }
    1111 
    1112     /**
    1113      * @Description: 设置段落底纹(对整段文字起作用)
    1114      */
    1115     public void setParagraphShdStyle(P p, STShd shdType, String shdColor) {
    1116         PPr ppr = getPPr(p);
    1117         CTShd ctShd = ppr.getShd();
    1118         if (ctShd == null) {
    1119             ctShd = new CTShd();
    1120         }
    1121         if (StringUtils.isNotBlank(shdColor)) {
    1122             ctShd.setColor(shdColor);
    1123         }
    1124         if (shdType != null) {
    1125             ctShd.setVal(shdType);
    1126         }
    1127         ppr.setShd(ctShd);
    1128     }
    1129 
    1130     /**
    1131      * @param isSpace
    1132      *            是否设置段前段后值
    1133      * @param before
    1134      *            段前磅数
    1135      * @param after
    1136      *            段后磅数
    1137      * @param beforeLines
    1138      *            段前行数
    1139      * @param afterLines
    1140      *            段后行数
    1141      * @param isLine
    1142      *            是否设置行距
    1143      * @param lineValue
    1144      *            行距值
    1145      * @param sTLineSpacingRule
    1146      *            自动auto 固定exact 最小 atLeast 1磅=20 1行=100 单倍行距=240
    1147      */
    1148     public void setParagraphSpacing(P p, boolean isSpace, String before, String after, String beforeLines,
    1149             String afterLines, boolean isLine, String lineValue, STLineSpacingRule sTLineSpacingRule) {
    1150         PPr pPr = getPPr(p);
    1151         Spacing spacing = pPr.getSpacing();
    1152         if (spacing == null) {
    1153             spacing = new Spacing();
    1154             pPr.setSpacing(spacing);
    1155         }
    1156         if (isSpace) {
    1157             if (StringUtils.isNotBlank(before)) {
    1158                 // 段前磅数
    1159                 spacing.setBefore(new BigInteger(before));
    1160             }
    1161             if (StringUtils.isNotBlank(after)) {
    1162                 // 段后磅数
    1163                 spacing.setAfter(new BigInteger(after));
    1164             }
    1165             if (StringUtils.isNotBlank(beforeLines)) {
    1166                 // 段前行数
    1167                 spacing.setBeforeLines(new BigInteger(beforeLines));
    1168             }
    1169             if (StringUtils.isNotBlank(afterLines)) {
    1170                 // 段后行数
    1171                 spacing.setAfterLines(new BigInteger(afterLines));
    1172             }
    1173         }
    1174         if (isLine) {
    1175             if (StringUtils.isNotBlank(lineValue)) {
    1176                 spacing.setLine(new BigInteger(lineValue));
    1177             }
    1178             if (sTLineSpacingRule != null) {
    1179                 spacing.setLineRule(sTLineSpacingRule);
    1180             }
    1181         }
    1182     }
    1183 
    1184     /**
    1185      * @Description: 设置段落缩进信息 1厘米≈567
    1186      */
    1187     public void setParagraphIndInfo(P p, String firstLine, String firstLineChar, String hanging, String hangingChar,
    1188             String right, String rigthChar, String left, String leftChar) {
    1189         PPr ppr = getPPr(p);
    1190         Ind ind = ppr.getInd();
    1191         if (ind == null) {
    1192             ind = new Ind();
    1193             ppr.setInd(ind);
    1194         }
    1195         if (StringUtils.isNotBlank(firstLine)) {
    1196             ind.setFirstLine(new BigInteger(firstLine));
    1197         }
    1198         if (StringUtils.isNotBlank(firstLineChar)) {
    1199             ind.setFirstLineChars(new BigInteger(firstLineChar));
    1200         }
    1201         if (StringUtils.isNotBlank(hanging)) {
    1202             ind.setHanging(new BigInteger(hanging));
    1203         }
    1204         if (StringUtils.isNotBlank(hangingChar)) {
    1205             ind.setHangingChars(new BigInteger(hangingChar));
    1206         }
    1207         if (StringUtils.isNotBlank(left)) {
    1208             ind.setLeft(new BigInteger(left));
    1209         }
    1210         if (StringUtils.isNotBlank(leftChar)) {
    1211             ind.setLeftChars(new BigInteger(leftChar));
    1212         }
    1213         if (StringUtils.isNotBlank(right)) {
    1214             ind.setRight(new BigInteger(right));
    1215         }
    1216         if (StringUtils.isNotBlank(rigthChar)) {
    1217             ind.setRightChars(new BigInteger(rigthChar));
    1218         }
    1219     }
    1220 
    1221     public PPr getPPr(P p) {
    1222         PPr ppr = p.getPPr();
    1223         if (ppr == null) {
    1224             ppr = new PPr();
    1225             p.setPPr(ppr);
    1226         }
    1227         return ppr;
    1228     }
    1229 
    1230     public ParaRPr getParaRPr(PPr ppr) {
    1231         ParaRPr parRpr = ppr.getRPr();
    1232         if (parRpr == null) {
    1233             parRpr = new ParaRPr();
    1234             ppr.setRPr(parRpr);
    1235         }
    1236         return parRpr;
    1237 
    1238     }
    1239 
    1240     public void setParaVanish(PPr ppr, boolean isVanish) {
    1241         ParaRPr parRpr = getParaRPr(ppr);
    1242         BooleanDefaultTrue vanish = parRpr.getVanish();
    1243         if (vanish != null) {
    1244             vanish.setVal(isVanish);
    1245         } else {
    1246             vanish = new BooleanDefaultTrue();
    1247             parRpr.setVanish(vanish);
    1248             vanish.setVal(isVanish);
    1249         }
    1250     }
    1251 
    1252     /**
    1253      * @Description: 设置段落边框样式
    1254      */
    1255     public void setParagraghBorders(P p, CTBorder topBorder, CTBorder bottomBorder, CTBorder leftBorder,
    1256             CTBorder rightBorder) {
    1257         PPr ppr = getPPr(p);
    1258         PBdr pBdr = new PBdr();
    1259         if (topBorder != null) {
    1260             pBdr.setTop(topBorder);
    1261         }
    1262         if (bottomBorder != null) {
    1263             pBdr.setBottom(bottomBorder);
    1264         }
    1265         if (leftBorder != null) {
    1266             pBdr.setLeft(leftBorder);
    1267         }
    1268         if (rightBorder != null) {
    1269             pBdr.setRight(rightBorder);
    1270         }
    1271         ppr.setPBdr(pBdr);
    1272     }
    1273 
    1274     /**
    1275      * @Description: 设置字体信息
    1276      */
    1277     public void setFontStyle(RPr runProperties, String cnFontFamily, String enFontFamily, String fontSize,
    1278             String color) {
    1279         setFontFamily(runProperties, cnFontFamily, enFontFamily);
    1280         setFontSize(runProperties, fontSize);
    1281         setFontColor(runProperties, color);
    1282     }
    1283 
    1284     /**
    1285      * @Description: 设置字体大小
    1286      */
    1287     public void setFontSize(RPr runProperties, String fontSize) {
    1288         if (StringUtils.isNotBlank(fontSize)) {
    1289             HpsMeasure size = new HpsMeasure();
    1290             size.setVal(new BigInteger(fontSize));
    1291             runProperties.setSz(size);
    1292             runProperties.setSzCs(size);
    1293         }
    1294     }
    1295 
    1296     /**
    1297      * @Description: 设置字体
    1298      */
    1299     public void setFontFamily(RPr runProperties, String cnFontFamily, String enFontFamily) {
    1300         if (StringUtils.isNotBlank(cnFontFamily) || StringUtils.isNotBlank(enFontFamily)) {
    1301             RFonts rf = runProperties.getRFonts();
    1302             if (rf == null) {
    1303                 rf = new RFonts();
    1304                 runProperties.setRFonts(rf);
    1305             }
    1306             if (cnFontFamily != null) {
    1307                 rf.setEastAsia(cnFontFamily);
    1308             }
    1309             if (enFontFamily != null) {
    1310                 rf.setAscii(enFontFamily);
    1311             }
    1312         }
    1313     }
    1314 
    1315     /**
    1316      * @Description: 设置字体颜色
    1317      */
    1318     public void setFontColor(RPr runProperties, String color) {
    1319         if (color != null) {
    1320             Color c = new Color();
    1321             c.setVal(color);
    1322             runProperties.setColor(c);
    1323         }
    1324     }
    1325 
    1326     /**
    1327      * @Description: 设置字符边框
    1328      */
    1329     public void addRPrBorderStyle(RPr runProperties, String size, STBorder bordType, String space, String color) {
    1330         CTBorder value = new CTBorder();
    1331         if (StringUtils.isNotBlank(color)) {
    1332             value.setColor(color);
    1333         }
    1334         if (StringUtils.isNotBlank(size)) {
    1335             value.setSz(new BigInteger(size));
    1336         }
    1337         if (StringUtils.isNotBlank(space)) {
    1338             value.setSpace(new BigInteger(space));
    1339         }
    1340         if (bordType != null) {
    1341             value.setVal(bordType);
    1342         }
    1343         runProperties.setBdr(value);
    1344     }
    1345 
    1346     /**
    1347      * @Description:着重号
    1348      */
    1349     public void addRPrEmStyle(RPr runProperties, STEm emType) {
    1350         if (emType != null) {
    1351             CTEm em = new CTEm();
    1352             em.setVal(emType);
    1353             runProperties.setEm(em);
    1354         }
    1355     }
    1356 
    1357     /**
    1358      * @Description: 空心
    1359      */
    1360     public void addRPrOutlineStyle(RPr runProperties) {
    1361         BooleanDefaultTrue outline = new BooleanDefaultTrue();
    1362         outline.setVal(true);
    1363         runProperties.setOutline(outline);
    1364     }
    1365 
    1366     /**
    1367      * @Description: 设置上标下标
    1368      */
    1369     public void addRPrcaleStyle(RPr runProperties, STVerticalAlignRun vAlign) {
    1370         if (vAlign != null) {
    1371             CTVerticalAlignRun value = new CTVerticalAlignRun();
    1372             value.setVal(vAlign);
    1373             runProperties.setVertAlign(value);
    1374         }
    1375     }
    1376 
    1377     /**
    1378      * @Description: 设置字符间距缩进
    1379      */
    1380     public void addRPrScaleStyle(RPr runProperties, int indent) {
    1381         CTTextScale value = new CTTextScale();
    1382         value.setVal(indent);
    1383         runProperties.setW(value);
    1384     }
    1385 
    1386     /**
    1387      * @Description: 设置字符间距信息
    1388      */
    1389     public void addRPrtSpacingStyle(RPr runProperties, int spacing) {
    1390         CTSignedTwipsMeasure value = new CTSignedTwipsMeasure();
    1391         value.setVal(BigInteger.valueOf(spacing));
    1392         runProperties.setSpacing(value);
    1393     }
    1394 
    1395     /**
    1396      * @Description: 设置文本位置
    1397      */
    1398     public void addRPrtPositionStyle(RPr runProperties, int position) {
    1399         CTSignedHpsMeasure ctPosition = new CTSignedHpsMeasure();
    1400         ctPosition.setVal(BigInteger.valueOf(position));
    1401         runProperties.setPosition(ctPosition);
    1402     }
    1403 
    1404     /**
    1405      * @Description: 阴文
    1406      */
    1407     public void addRPrImprintStyle(RPr runProperties) {
    1408         BooleanDefaultTrue imprint = new BooleanDefaultTrue();
    1409         imprint.setVal(true);
    1410         runProperties.setImprint(imprint);
    1411     }
    1412 
    1413     /**
    1414      * @Description: 阳文
    1415      */
    1416     public void addRPrEmbossStyle(RPr runProperties) {
    1417         BooleanDefaultTrue emboss = new BooleanDefaultTrue();
    1418         emboss.setVal(true);
    1419         runProperties.setEmboss(emboss);
    1420     }
    1421 
    1422     /**
    1423      * @Description: 设置隐藏
    1424      */
    1425     public void setRPrVanishStyle(RPr runProperties, boolean isVanish) {
    1426         BooleanDefaultTrue vanish = runProperties.getVanish();
    1427         if (vanish != null) {
    1428             vanish.setVal(isVanish);
    1429         } else {
    1430             vanish = new BooleanDefaultTrue();
    1431             vanish.setVal(isVanish);
    1432             runProperties.setVanish(vanish);
    1433         }
    1434     }
    1435 
    1436     /**
    1437      * @Description: 设置阴影
    1438      */
    1439     public void addRPrShadowStyle(RPr runProperties) {
    1440         BooleanDefaultTrue shadow = new BooleanDefaultTrue();
    1441         shadow.setVal(true);
    1442         runProperties.setShadow(shadow);
    1443     }
    1444 
    1445     /**
    1446      * @Description: 设置底纹
    1447      */
    1448     public void addRPrShdStyle(RPr runProperties, STShd shdtype) {
    1449         if (shdtype != null) {
    1450             CTShd shd = new CTShd();
    1451             shd.setVal(shdtype);
    1452             runProperties.setShd(shd);
    1453         }
    1454     }
    1455 
    1456     /**
    1457      * @Description: 设置突出显示文本
    1458      */
    1459     public void addRPrHightLightStyle(RPr runProperties, String hightlight) {
    1460         if (StringUtils.isNotBlank(hightlight)) {
    1461             Highlight highlight = new Highlight();
    1462             highlight.setVal(hightlight);
    1463             runProperties.setHighlight(highlight);
    1464         }
    1465     }
    1466 
    1467     /**
    1468      * @Description: 设置删除线样式
    1469      */
    1470     public void addRPrStrikeStyle(RPr runProperties, boolean isStrike, boolean isDStrike) {
    1471         // 删除线
    1472         if (isStrike) {
    1473             BooleanDefaultTrue strike = new BooleanDefaultTrue();
    1474             strike.setVal(true);
    1475             runProperties.setStrike(strike);
    1476         }
    1477         // 双删除线
    1478         if (isDStrike) {
    1479             BooleanDefaultTrue dStrike = new BooleanDefaultTrue();
    1480             dStrike.setVal(true);
    1481             runProperties.setDstrike(dStrike);
    1482         }
    1483     }
    1484 
    1485     /**
    1486      * @Description: 加粗
    1487      */
    1488     public void addRPrBoldStyle(RPr runProperties) {
    1489         BooleanDefaultTrue b = new BooleanDefaultTrue();
    1490         b.setVal(true);
    1491         runProperties.setB(b);
    1492     }
    1493 
    1494     /**
    1495      * @Description: 倾斜
    1496      */
    1497     public void addRPrItalicStyle(RPr runProperties) {
    1498         BooleanDefaultTrue b = new BooleanDefaultTrue();
    1499         b.setVal(true);
    1500         runProperties.setI(b);
    1501     }
    1502 
    1503     /**
    1504      * @Description: 添加下划线
    1505      */
    1506     public void addRPrUnderlineStyle(RPr runProperties, UnderlineEnumeration enumType) {
    1507         U val = new U();
    1508         val.setVal(enumType);
    1509         runProperties.setU(val);
    1510     }
    1511 
    1512     /*------------------------------------Word 相关--------------------------------------------------- */
    1513     /**
    1514      * @Description: 设置分节符 nextPage:下一页 continuous:连续 evenPage:偶数页 oddPage:奇数页
    1515      */
    1516     public void setDocSectionBreak(WordprocessingMLPackage wordPackage, String sectValType) {
    1517         if (StringUtils.isNotBlank(sectValType)) {
    1518             SectPr sectPr = getDocSectPr(wordPackage);
    1519             Type sectType = sectPr.getType();
    1520             if (sectType == null) {
    1521                 sectType = new Type();
    1522                 sectPr.setType(sectType);
    1523             }
    1524             sectType.setVal(sectValType);
    1525         }
    1526     }
    1527 
    1528     /**
    1529      * @Description: 设置页面背景色
    1530      */
    1531     public void setDocumentBackGround(WordprocessingMLPackage wordPackage, ObjectFactory factory, String color)
    1532             throws Exception {
    1533         MainDocumentPart mdp = wordPackage.getMainDocumentPart();
    1534         CTBackground bkground = mdp.getContents().getBackground();
    1535         if (StringUtils.isNotBlank(color)) {
    1536             if (bkground == null) {
    1537                 bkground = factory.createCTBackground();
    1538                 bkground.setColor(color);
    1539             }
    1540             mdp.getContents().setBackground(bkground);
    1541         }
    1542     }
    1543 
    1544     /**
    1545      * @Description: 设置页面边框
    1546      */
    1547     public void setDocumentBorders(WordprocessingMLPackage wordPackage, ObjectFactory factory, CTBorder top,
    1548             CTBorder right, CTBorder bottom, CTBorder left) {
    1549         SectPr sectPr = getDocSectPr(wordPackage);
    1550         PgBorders pgBorders = sectPr.getPgBorders();
    1551         if (pgBorders == null) {
    1552             pgBorders = factory.createSectPrPgBorders();
    1553             sectPr.setPgBorders(pgBorders);
    1554         }
    1555         if (top != null) {
    1556             pgBorders.setTop(top);
    1557         }
    1558         if (right != null) {
    1559             pgBorders.setRight(right);
    1560         }
    1561         if (bottom != null) {
    1562             pgBorders.setBottom(bottom);
    1563         }
    1564         if (left != null) {
    1565             pgBorders.setLeft(left);
    1566         }
    1567     }
    1568 
    1569     /**
    1570      * @Description: 设置页面大小及纸张方向 landscape横向
    1571      */
    1572     public void setDocumentSize(WordprocessingMLPackage wordPackage, ObjectFactory factory, String width, String height,
    1573             STPageOrientation stValue) {
    1574         SectPr sectPr = getDocSectPr(wordPackage);
    1575         PgSz pgSz = sectPr.getPgSz();
    1576         if (pgSz == null) {
    1577             pgSz = factory.createSectPrPgSz();
    1578             sectPr.setPgSz(pgSz);
    1579         }
    1580         if (StringUtils.isNotBlank(width)) {
    1581             pgSz.setW(new BigInteger(width));
    1582         }
    1583         if (StringUtils.isNotBlank(height)) {
    1584             pgSz.setH(new BigInteger(height));
    1585         }
    1586         if (stValue != null) {
    1587             pgSz.setOrient(stValue);
    1588         }
    1589     }
    1590 
    1591     public SectPr getDocSectPr(WordprocessingMLPackage wordPackage) {
    1592         SectPr sectPr = wordPackage.getDocumentModel().getSections().get(0).getSectPr();
    1593         return sectPr;
    1594     }
    1595 
    1596     /**
    1597      * @Description:设置页边距
    1598      */
    1599     public void setDocMarginSpace(WordprocessingMLPackage wordPackage, ObjectFactory factory, String top, String left,
    1600             String bottom, String right) {
    1601         SectPr sectPr = getDocSectPr(wordPackage);
    1602         PgMar pg = sectPr.getPgMar();
    1603         if (pg == null) {
    1604             pg = factory.createSectPrPgMar();
    1605             sectPr.setPgMar(pg);
    1606         }
    1607         if (StringUtils.isNotBlank(top)) {
    1608             pg.setTop(new BigInteger(top));
    1609         }
    1610         if (StringUtils.isNotBlank(bottom)) {
    1611             pg.setBottom(new BigInteger(bottom));
    1612         }
    1613         if (StringUtils.isNotBlank(left)) {
    1614             pg.setLeft(new BigInteger(left));
    1615         }
    1616         if (StringUtils.isNotBlank(right)) {
    1617             pg.setRight(new BigInteger(right));
    1618         }
    1619     }
    1620 
    1621     /**
    1622      * @Description: 设置行号
    1623      * @param distance
    1624      *            :距正文距离 1厘米=567
    1625      * @param start
    1626      *            :起始编号(0开始)
    1627      * @param countBy
    1628      *            :行号间隔
    1629      * @param restartType
    1630      *            :STLineNumberRestart.CONTINUOUS(continuous连续编号)<br/>
    1631      *            STLineNumberRestart.NEW_PAGE(每页重新编号)<br/>
    1632      *            STLineNumberRestart.NEW_SECTION(每节重新编号)
    1633      */
    1634     public void setDocInNumType(WordprocessingMLPackage wordPackage, String countBy, String distance, String start,
    1635             STLineNumberRestart restartType) {
    1636         SectPr sectPr = getDocSectPr(wordPackage);
    1637         CTLineNumber lnNumType = sectPr.getLnNumType();
    1638         if (lnNumType == null) {
    1639             lnNumType = new CTLineNumber();
    1640             sectPr.setLnNumType(lnNumType);
    1641         }
    1642         if (StringUtils.isNotBlank(countBy)) {
    1643             lnNumType.setCountBy(new BigInteger(countBy));
    1644         }
    1645         if (StringUtils.isNotBlank(distance)) {
    1646             lnNumType.setDistance(new BigInteger(distance));
    1647         }
    1648         if (StringUtils.isNotBlank(start)) {
    1649             lnNumType.setStart(new BigInteger(start));
    1650         }
    1651         if (restartType != null) {
    1652             lnNumType.setRestart(restartType);
    1653         }
    1654     }
    1655 
    1656     /**
    1657      * @Description:设置文字方向 tbRl 垂直
    1658      */
    1659     public void setDocTextDirection(WordprocessingMLPackage wordPackage, String textDirection) {
    1660         if (StringUtils.isNotBlank(textDirection)) {
    1661             SectPr sectPr = getDocSectPr(wordPackage);
    1662             TextDirection textDir = sectPr.getTextDirection();
    1663             if (textDir == null) {
    1664                 textDir = new TextDirection();
    1665                 sectPr.setTextDirection(textDir);
    1666             }
    1667             textDir.setVal(textDirection);
    1668         }
    1669     }
    1670 
    1671     /**
    1672      * @Description:设置word 垂直对齐方式(Word默认方式都是"顶端对齐")
    1673      */
    1674     public void setDocVAlign(WordprocessingMLPackage wordPackage, STVerticalJc valignType) {
    1675         if (valignType != null) {
    1676             SectPr sectPr = getDocSectPr(wordPackage);
    1677             CTVerticalJc valign = sectPr.getVAlign();
    1678             if (valign == null) {
    1679                 valign = new CTVerticalJc();
    1680                 sectPr.setVAlign(valign);
    1681             }
    1682             valign.setVal(valignType);
    1683         }
    1684     }
    1685 
    1686     /**
    1687      * @Description:获取文档的可用宽度
    1688      */
    1689     public int getWritableWidth(WordprocessingMLPackage wordPackage) throws Exception {
    1690         return wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips();
    1691     }
    1692 
    1693 }
  • 相关阅读:
    vuex 简单理解
    es2015(es6)学习总结
    工作资源知识点总结收集
    margin-top使用需要注意的地方
    关于用display:table让元素居中的小结
    display:table-cell
    margin:0 auto;不居中
    css选择器总结
    css 选择器优先级
    给行内元素加上绝对定位之后,元素属性的变化
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/7867577.html
Copyright © 2020-2023  润新知