Poi操作word工具类

public class DnaDocPoiUtil {
    public  XWPFDocument document;

    public DnaDocPoiUtil(String inPath) {
        try {
            document = new XWPFDocument(new FileInputStream(new File(inPath)));
        }catch (Exception r){
            r.printStackTrace();
        }
    }

    public DnaDocPoiUtil(InputStream inputStream) {
        try {
            document = new XWPFDocument(inputStream);
        }catch (Exception r){
            r.printStackTrace();
        }
    }

    public XWPFDocument getDocument() {
        return document;
    }

    public List<XWPFParagraph> getParagraphs() {
        return document.getParagraphs();
    }

    public XWPFParagraph getParagraphArray(int pos){
        return document.getParagraphArray(pos);
    }

    public XWPFParagraph insertNewParagraph(int pos){
        XWPFParagraph paragraph = document.getParagraphArray(pos);
        XmlCursor cursor = paragraph .getCTP().newCursor();
        return document.insertNewParagraph(cursor);
    }

    public XWPFParagraph insertNewParagraph(int pos,int setLine){
        XWPFParagraph paragraph = document.getParagraphArray(pos);
        XmlCursor cursor = paragraph .getCTP().newCursor();
        paragraph = document.insertNewParagraph(cursor);
        setSingleLineSpacing(paragraph,setLine);
        return paragraph;
    }

    public XWPFParagraph insertNewParagraph(XWPFParagraph paragraph){
        XmlCursor cursor = paragraph .getCTP().newCursor();
        return document.insertNewParagraph(cursor);
    }

    public XWPFTable insertNewTbl(int pos,boolean isAdaptContent){
        XWPFParagraph paragraph = document.getParagraphArray(pos);
        XmlCursor cursor = paragraph .getCTP().newCursor();
        XWPFTable table = document.insertNewTbl(cursor);
        //是否开启表格适应内容
        if(!isAdaptContent){
            CTTblPr tblPr =  table.getCTTbl().getTblPr();
            CTTblLayoutType t = tblPr.isSetTblLayout()?tblPr.getTblLayout():tblPr.addNewTblLayout();
            t.setType(STTblLayoutType.FIXED);
        }
        return table;
    }

    public XWPFTable insertNewTbl(XWPFParagraph paragraph){
        XmlCursor cursor = paragraph .getCTP().newCursor();
        return document.insertNewTbl(cursor);
    }

    public void setRunText(XWPFRun run,String text,boolean isBold,int fontSize,String zFont,String eFont){
        run.setBold(isBold);
        run.setText(text);
        run.setFontSize(fontSize);

        CTRPr rpr = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr();;
        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
        fonts.setAscii(eFont);
        fonts.setEastAsia(zFont);
        fonts.setHAnsi(zFont);
    }

    public void setXWPFParagraph(XWPFParagraph paragraph,ParagraphAlignment alignment,int line,String text,boolean isBold,int fontSize,String zFont,String eFont){
        paragraph.setAlignment(alignment);
        paragraph.setIndentationFirstLine(line);
        XWPFRun run = paragraph.createRun();
        setRunText(run,text,isBold,fontSize,zFont,eFont);
    }

    public void setXWPFParagraph(XWPFParagraph paragraph,int line,String text,boolean isBold,int fontSize,String zFont,String eFont){
        paragraph.setIndentationFirstLine(line);
        XWPFRun run = paragraph.createRun();
        setRunText(run,text,isBold,fontSize,zFont,eFont);
    }

    public void setXWPFParagraph(XWPFParagraph paragraph,ParagraphAlignment alignment,String text,boolean isBold,int fontSize,String zFont,String eFont){
        paragraph.setAlignment(alignment);
        XWPFRun run = paragraph.createRun();
        setRunText(run,text,isBold,fontSize,zFont,eFont);
    }

    public void setXWPFParagraph(XWPFParagraph paragraph,String text,boolean isBold,int fontSize,String zFont,String eFont){
        XWPFRun run = paragraph.createRun();
        setRunText(run,text,isBold,fontSize,zFont,eFont);
    }

    public void addBreak(XWPFParagraph paragraph){
        List<XWPFRun> runs = paragraph.getRuns();
        if(runs != null && runs.size() > 0){
            paragraph.getRuns().get(runs.size() -1).addBreak();
        }else{
            paragraph.createRun().addBreak();
        }
    }

    //设置上标
    public void setSuperScript(XWPFParagraph paragraph,int leftIndent, String text,boolean isBold, int fontSize, String zFont, String eFont){
        String [] array1 = text.split("}");
        XWPFRun run;

        paragraph.setIndentationFirstLine(leftIndent);
        for(int i=0;i<array1.length;i++) {
            String [] array2 = array1[i].split("\\{");
            run = paragraph.createRun();
            setRunText(run,array2[0],isBold,fontSize,zFont,eFont);

            if(array2.length > 1){
                run = paragraph.createRun();
                run.setSubscript(VerticalAlign.SUPERSCRIPT);
                setRunText(run,array2[1],isBold,fontSize,zFont,eFont);
            }
        }
    }

    public void setXWPFTableCell(XWPFTableCell tableCell,int setW){
        /** 设置水平居中 */
        CTTc cttc = tableCell.getCTTc();
        CTTcPr ctPr = cttc.addNewTcPr();
        ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);

        CTTblWidth ctTblWidth = ctPr.addNewTcW();
        ctTblWidth.setW(BigInteger.valueOf(setW));
        ctTblWidth.setType(STTblWidth.DXA);
    }

    public void setXWPFTableContentCell(XWPFTableCell tableCell,String text,boolean isBold, int fontSize, String zFont, String eFont){
        XWPFParagraph paragraph = tableCell.getParagraphs().get(0);
        if(paragraph == null){
            paragraph = tableCell.addParagraph();
        }
//        setSingleLineSpacing(paragraph,480);
//        setXWPFParagraph(paragraph,text, isBold,fontSize,zFont,eFont);
        XWPFRun run;
        String[] texts = StringUtils.split(text,"\n");
        for (int i = 0; i < texts.length; i++) {
            run = paragraph.createRun();
            setRunText(run,texts[i],isBold,fontSize,zFont,eFont);
            if(i < texts.length -1){
                run.addBreak();
            }
        }
    }

    public void setXWPFTableTitleCell(XWPFTableCell tableCell,String text,boolean isBold, int fontSize, String zFont, String eFont){
        XWPFParagraph paragraph = tableCell.getParagraphs().get(0);
        if(paragraph == null){
            paragraph = tableCell.addParagraph();
        }
//        setSingleLineSpacing(paragraph,480);
        setXWPFParagraph(paragraph,text, isBold,fontSize,zFont,eFont);
    }

    public XWPFTableCell createXwpfTableContentCell(XWPFTableRow tableRow,Integer index){
        XWPFTableCell tableCell = tableRow.getCell(index);
        return tableCell;
    }

    public XWPFTableCell createXwpfTableContentCell(XWPFTableRow tableRow){
        XWPFTableCell tableCell = tableRow.addNewTableCell();
        return tableCell;
    }

    public XWPFTableCell createXwpfTableTitleCell(XWPFTableRow tableRow){
        XWPFTableCell tableCell = tableRow.addNewTableCell();
        return tableCell;
    }



    public void createXwpfTable(XWPFTable table,DnaDocTableDataDto tableDataDto,int lineHeight,int setW,boolean isTitleBold){
        int length = tableDataDto.getTableHeader().size();
        List<String> cells;
        List<List<String>> list;
        XWPFTableRow tableRow;
        XWPFTableCell tableCell;

        for(int i = 0 ; i < length ; i++){

            cells = tableDataDto.getTableHeader().get(i);
            //生成表格行,插入单元格
            if(i == 0){
                //第一行--设置完后以后创建的每一行都为第一行样式
                tableRow = table.getRow(0);
                for(int j = 0 ; j < cells.size() -1 ; j++){
                    tableCell = createXwpfTableTitleCell(tableRow);
                    setXWPFTableCell(tableCell,setW);
                }
                tableRow = table.getRow(0);
                setTableRow(tableRow,lineHeight);
                //去掉单元格左右边框
                removeLeftAndRightBorders(tableRow,false,false,true,true);
            }else{
                tableRow = table.createRow();
                setTableRow(tableRow,lineHeight);
                removeLeftAndRightBorders(tableRow,false,false,true,true);
            }
            //开始加入内容
            for(int j = 0 ; j < cells.size() ; j++){
                tableCell = tableRow.getCell(j);
                if(tableCell != null){
                    setXWPFTableTitleCell(tableCell,cells.get(j),isTitleBold,9,"仿宋_GB2312","Times New Roman");
                    setXWPFTableCell(tableCell,setW);
                }
            }
            //样品内容
            list = tableDataDto.getTableContentData().get(i);
            for(List<String> cellList : list){
                //一个样品一行
                tableRow = table.createRow();
                setTableRow(tableRow,lineHeight);
                removeLeftAndRightBorders(tableRow,false,false,true,true);
                for(int j = 0 ; j < cellList.size() ; j++){
                    //样品每个基因座下位点一列
                    tableCell = tableRow.getCell(j);
                    if(tableCell != null){
                        setXWPFTableContentCell(tableCell,cellList.get(j),false,9,"仿宋_GB2312","Times New Roman");
                        setXWPFTableCell(tableCell,setW);
                    }
                }
            }
            //加入分割行
            if(i < (length - 1)){
                tableRow = table.createRow();
                setTableRow(tableRow,lineHeight);
                removeLeftAndRightBorders(tableRow,false,false,true,true);
                for(int j = 0 ; j < tableRow.getTableCells().size() ; j++){
                    tableCell = tableRow.getCell(j);
                    if(tableCell != null){
                        setXWPFTableContentCell(tableCell,"",false,9,"仿宋_GB2312","Times New Roman");
                        setXWPFTableCell(tableCell,setW);
                    }
                }
                //合并表格行中的单元格
                mergeCellsHorizontal(tableRow,0,cells.size()-1);
            }
        }
    }

    public void createXWPFHeader(List<String> list){
        XWPFHeader xwpfHeader = document.getHeaderList().get(0);
        XWPFParagraph paragraph = xwpfHeader.getParagraphArray(0);
        XmlCursor cursor;
        XWPFParagraph newPrap;
        for(String string : list){
            cursor = paragraph.getCTP().newCursor();
            newPrap = xwpfHeader.insertNewParagraph(cursor);
            newPrap.setAlignment(paragraph.getAlignment());
            newPrap.setNumID(paragraph.getNumID());
//            setHeaderAndFooterRun(newPrap,string);
        }
    }

    /**
     * 行间距
     */
    public void setSingleLineSpacing(XWPFParagraph paragraph,int setLine) {
        CTP ctp = paragraph.getCTP();
        CTPPr ppr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();
        CTSpacing spacing = ppr.isSetSpacing()? ppr.getSpacing() : ppr.addNewSpacing();
        spacing.setAfter(BigInteger.valueOf(0));
        spacing.setBefore(BigInteger.valueOf(0));
        spacing.setLineRule(STLineSpacingRule.EXACT);
        spacing.setLine(BigInteger.valueOf(setLine));
    }

    public void removeLeftAndRightBorders(XWPFTableRow tableRow,Boolean top,Boolean bottom,Boolean left,Boolean right){
        List<XWPFTableCell> cells  = tableRow.getTableCells();
        CTTcBorders tblBorders;
        XWPFTableCell cell;
        CTTcPr ctTcPr;
        for(int i=0; i < cells.size(); i++) {
            cell = tableRow.getCell(i);
            ctTcPr = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr();
            tblBorders = ctTcPr.isSetTcBorders() ?  ctTcPr.getTcBorders() : ctTcPr.addNewTcBorders();
            if(top){
                tblBorders.addNewTop().setVal(STBorder.NIL);
            }
            if(left){
                tblBorders.addNewLeft().setVal(STBorder.NIL);
            }
            if(right){
                tblBorders.addNewRight().setVal(STBorder.NIL);
            }
            if(bottom){
                tblBorders.addNewBottom().setVal(STBorder.NIL);
            }
            tableRow.getCell(i).getCTTc().getTcPr().setTcBorders(tblBorders);
        }
    }

    /**
     * 合并表格
     * @param fromCell 开始列索引
     * @param toCell 结束列索引
     */
    public void mergeCellsHorizontal(XWPFTableRow tableRow,int fromCell, int toCell) {
        XWPFTableCell tableCell;
        XWPFParagraph paragraph;
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            tableCell = tableRow.getCell(cellIndex);
            if(tableCell != null){
                if ( cellIndex == fromCell ) {
                    // The first merged cell is set with RESTART merge value
                    tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
                } else {
                    // Cells which join (merge) the first one, are set with CONTINUE
                    tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                }
                paragraph = tableCell.getParagraphs().get(0);
                paragraph.setAlignment(ParagraphAlignment.CENTER);
            }
        }
    }

    /**
     * 获取图片对饮类型泛型值
     * @param filePath
     * @return
     */
    Integer getImgType(String filePath){
        String imgType = filePath.substring(filePath.indexOf(".")+1);
        Integer typeNum =  XWPFDocument.PICTURE_TYPE_PNG;
        if(StringUtils.isNotBlank(imgType)){
            if(imgType.equalsIgnoreCase("PNG")){
                typeNum =  XWPFDocument.PICTURE_TYPE_PNG;
            }else if(imgType.equalsIgnoreCase("JPEG")){
                typeNum =  XWPFDocument.PICTURE_TYPE_JPEG;
            }else if(imgType.equalsIgnoreCase("GIF")){
                typeNum =  XWPFDocument.PICTURE_TYPE_GIF;
            }
        }
        return typeNum;
    }

    /**
     * 获取图片对饮类型文件名
     * @param filePath
     * @return
     */
    String getImgName(String filePath,String newPerfix){
        String imgType = filePath.substring(filePath.indexOf(".")+1);
        String newFileName = newPerfix + ".png";
        if(StringUtils.isNotBlank(imgType)){
            if(imgType.equalsIgnoreCase("PNG")){
                newFileName = newPerfix + ".png";
            }else if(imgType.equalsIgnoreCase("JPEG")){
                newFileName = newPerfix + ".jpeg";
            }else if(imgType.equalsIgnoreCase("GIF")){
                newFileName = newPerfix + ".gif";
            }
        }
        return newFileName;
    }

    public static void addPicture(XWPFParagraph paragraph,InputStream stream, int imgType, Double width, Double height){
        try {
            if(stream != null){
                XWPFRun run;
                run = paragraph.createRun();
                run.addPicture(stream, imgType, System.currentTimeMillis()+".jpg", Units.toEMU(width), Units.toEMU(height));
            }
        }catch (Exception e){e.printStackTrace();}
    }
    /**
     * 创建页脚
     */
    public void createXWPFFooter(String text){
        List<XWPFFooter> footerList = document.getFooterList();
        XWPFFooter xwpfFooter = footerList.get(0);
        XWPFParagraph prap = xwpfFooter.getParagraphArray(0);
//        setHeaderAndFooterRun(prap,text);

//        setHeaderAndFooterRun(prap,"第");
        XWPFRun run = prap.createRun();
//        setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
        CTFldChar fldChar = run.getCTR().addNewFldChar();
        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));

        run = prap.createRun();
//        setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
        CTText ctText = run.getCTR().addNewInstrText();
        ctText.setStringValue("PAGE \\* MERGEFORMAT");
        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));

        fldChar = run.getCTR().addNewFldChar();
        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));

//        setHeaderAndFooterRun(prap,"页/共");

        run = prap.createRun();
//        setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
        fldChar = run.getCTR().addNewFldChar();
        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));

        run = prap.createRun();
//        setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
        ctText = run.getCTR().addNewInstrText();
        ctText.setStringValue("NUMPAGES \\* MERGEFORMAT ");//
        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));

        fldChar = run.getCTR().addNewFldChar();
        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));

//        setHeaderAndFooterRun(prap,"页");
    }

    public static void setTableRow(XWPFTableRow tableRow ,Integer height){
        CTTrPr trPr = tableRow.getCtRow().addNewTrPr();
        CTHeight ht = trPr.addNewTrHeight();
        ht.setHRule(STHeightRule.AT_LEAST);
        ht.setVal(BigInteger.valueOf(height));
    }

    public void write(String outPath){
        try {
            OutputStream out = new FileOutputStream(new File(outPath));
            document.write(out);
            out.close();
        }catch (Exception r){
            r.printStackTrace();
        }
    }

    public void writeOutStream(OutputStream outputStreamt){
        try {
            document.write(outputStreamt);
        }catch (Exception r){
            r.printStackTrace();
        }
    }

调用代码:


        DnaDocPoiUtil poiUtil = new DnaDocPoiUtil(inputStream);
        int removeInt = 3;
        XWPFParagraph paragraph;
        //段落
        paragraph = poiUtil.insertNewParagraph(poiUtil.getParagraphs().size() - removeInt,480);
        poiUtil.setXWPFParagraph(paragraph,ParagraphAlignment.RIGHT, "鉴定编号:"+docDataDto.getAcceptNo() +"号", false,15,"仿宋_GB2312","Times New Roman");

        paragraph = poiUtil.insertNewParagraph(poiUtil.getParagraphs().size() - removeInt,480);
        poiUtil.setXWPFParagraph(paragraph,600,"一、绪论",false,15,"黑体","Times New Roman");
//表格
 XWPFTable xwpfTable = poiUtil.insertNewTbl(poiUtil.getParagraphs().size() - removeInt,true);
                poiUtil.createXwpfTable(xwpfTable,docDataDto.getYstrTableDataDto(),480,1000,true);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值