zoukankan      html  css  js  c++  java
  • poi导出word

      说一个比较实用的方法,插入分节和设置页面第二页开始时就是用的这种方法:先新建一个docx文件,编辑好自己需要的格式,包括页眉页脚,分页分节等,然后保存,重命名成zip压缩文件,解压后就会发现很多xml文件,这就是word的底层,可以从相关xml里面查找相应的功能。

      目前仍存在一个问题就是空格的下滑先不显示,具体解决后续添加

    package poi;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.math.BigInteger;
    import java.util.List;
    
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
    import org.apache.poi.xwpf.usermodel.TextAlignment;
    import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFldChar;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageNumber;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
    
    
    public class WordDemo {
      //生成测试报告
      public static boolean createnewword(){
        XWPFDocument doc = new XWPFDocument();
        firstpage(doc);
        secondpage(doc);
        exchange(doc);
        export(doc);
        return true;
      }
      public static void main(String[] arg){
        XWPFDocument doc = new XWPFDocument();
        firstpage(doc);
        secondpage(doc);
        exchange(doc);
        export(doc);
      }
      /**
      * @Description: 得到XWPFRun的CTRPr
      */
      public static CTRPr getRunCTRPr(XWPFParagraph p, XWPFRun pRun) {
        CTRPr pRpr = null;
        if (pRun.getCTR() != null) {
          pRpr = pRun.getCTR().getRPr();
          if (pRpr == null) {
            pRpr = pRun.getCTR().addNewRPr();
          }
        } else {
          pRpr = p.getCTP().addNewR().addNewRPr();
        }
        return pRpr;
      }
      //页眉
      public static void simpleDateHeader(XWPFDocument document) throws Exception { 
        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
        CTPageNumber pageNum = sectPr.addNewPgNumType();
        pageNum.setStart(BigInteger.ONE);
    
        CTP ctp = CTP.Factory.newInstance();
        XWPFParagraph codePara = new XWPFParagraph(ctp, document); 
    
        XWPFRun r1 = null;
        CTFldChar fldChar = null;
        CTRPr rpr =null;
        CTFonts fonts=null;
        CTText ctText =null;
    
        r1 = codePara.createRun(); 
        setfont(r1,9,"宋体","编号: 第"); 
    
        r1 = codePara.createRun(); 
        fldChar = r1.getCTR().addNewFldChar(); 
        fldChar.setFldCharType(STFldCharType.Enum.forString("begin")); 
    
        r1 = codePara.createRun(); 
        ctText = r1.getCTR().addNewInstrText(); 
        ctText.setStringValue("PAGE \* MERGEFORMAT");
        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve")); 
        r1.setFontSize(9); 
        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr(); 
        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts(); 
        fonts.setAscii("宋体"); 
        fonts.setEastAsia("宋体"); 
        fonts.setHAnsi("宋体"); 
    
        fldChar = r1.getCTR().addNewFldChar(); 
        fldChar.setFldCharType(STFldCharType.Enum.forString("end")); 
    
        r1 = codePara.createRun(); 
        setfont(r1,9,"宋体"," 页 共");
        r1 = codePara.createRun(); 
        fldChar = r1.getCTR().addNewFldChar(); 
        fldChar.setFldCharType(STFldCharType.Enum.forString("begin")); 
    
        r1 = codePara.createRun(); 
        ctText = r1.getCTR().addNewInstrText(); 
        ctText.setStringValue("SECTIONPAGES \* MERGEFORMAT");
        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve")); 
        r1.setFontSize(9); 
        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr(); 
        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts(); 
        fonts.setAscii("宋体"); 
        fonts.setEastAsia("宋体"); 
        fonts.setHAnsi("宋体"); 
        fldChar = r1.getCTR().addNewFldChar(); 
        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
        setfont(r1,9,"宋体"," 页");
        codePara.setAlignment(ParagraphAlignment.CENTER); 
        codePara.setVerticalAlignment(TextAlignment.CENTER); 
        XWPFParagraph[] newparagraphs = new XWPFParagraph[1]; 
        newparagraphs[0] = codePara; 
        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr); 
        headerFooterPolicy.createHeader(STHdrFtr.DEFAULT, newparagraphs);
      }
      //页脚
      public static void simpleNumberFooter(XWPFDocument document) throws Exception {
        CTP ctp = CTP.Factory.newInstance();
        XWPFParagraph codePara = new XWPFParagraph(ctp, document);
        codePara.setAlignment(ParagraphAlignment.CENTER);
    
        XWPFRun r1 = codePara.createRun();
        setfont(r1,11,"宋体","这里是页脚");
    
        XWPFParagraph[] newparagraphs = new XWPFParagraph[1];
        newparagraphs[0] = codePara;
        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
        headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, newparagraphs);
      }
      public static CTPPr getParagraphCTPPr(XWPFParagraph p) {
        CTPPr pPPr = null;
        if (p.getCTP() != null) {
          if (p.getCTP().getPPr() != null) {
            pPPr = p.getCTP().getPPr();
          } else {
            pPPr = p.getCTP().addNewPPr();
          }
        }
       return pPPr;
      }
      //设置段落格式
      public static void setpage(XWPFParagraph page,ParagraphAlignment align,int num,int Spacing){
        page.setAlignment(align);
        if(Spacing==0){
          page.setSpacingBeforeLines(50);
          page.setSpacingAfterLines(50);
        }else{
          page.setSpacingBeforeLines(Spacing);
          page.setSpacingAfterLines(Spacing);    
        }
        if(num!=-1){
          page.setIndentationLeft(num);    
        }
    
        CTPPr pPpr = null;
        pPpr = page.getCTP().getPPr();
        if (pPpr == null) {
          pPpr = page.getCTP().addNewPPr();
        }
        CTShd shd = pPpr.isSetShd() ? pPpr.getShd() : pPpr.addNewShd();
        shd.setVal(STShd.Enum.forInt(100));
      }
      public static void setfont(XWPFRun run,int font,String family,String text){
        run.setFontSize(font);
        run.setFontFamily(family);
        run.setText(text);
      }
      //封面
      public static void firstpage(XWPFDocument doc){
        //
        XWPFParagraph page = doc.createParagraph();
        XWPFRun run = page.createRun();
        run.setBold(true);
        setfont(run,14,"宋体","编号:");
        //空行
        page = doc.createParagraph();
        page.setAlignment(ParagraphAlignment.CENTER);
        run = page.createRun();
        setfont(run,36,"宋体","");
        run.addBreak();
        //
        run = page.createRun();
        run.setBold(true);
        setfont(run,36,"宋体","报 告");
        //空行
        page = doc.createParagraph();
        run = page.createRun();
        setfont(run,14,"宋体","");
        run.addBreak();run.addBreak();run.addBreak();run.addBreak();
        //单位
        page = doc.createParagraph();
        setpage(page,ParagraphAlignment.BOTH,2000,100);
        run = page.createRun();
        setfont(run,14,"宋体","单位:");
        run = page.createRun();
        run.setUnderline(UnderlinePatterns.SINGLE);
        //类别
        page = doc.createParagraph();
        setpage(page,ParagraphAlignment.BOTH,2000,100);
        run = page.createRun();
        setfont(run,14,"宋体","报告:");
        run = page.createRun();
        run.setUnderline(UnderlinePatterns.SINGLE);
        //空行
        page = doc.createParagraph();
        run = page.createRun();
        setfont(run,14,"宋体","");
        run.addBreak();
        run.addBreak();
        //
        page = doc.createParagraph();
        setpage(page,ParagraphAlignment.BOTH,1800,100);
        run = page.createRun();
        setfont(run,14,"宋体","检测单位:XXXXXXXXXXXXXXXXXXXX");
        page = doc.createParagraph();
        setpage(page,ParagraphAlignment.BOTH,1800,100);
        run = page.createRun();
        setfont(run,14,"宋体","日期: 年 月 日");
        page = doc.createParagraph();
        if(page.getCTP().getPPr()==null){
          page.getCTP().addNewPPr().addNewSectPr();
        }else{
          page.getCTP().getPPr().addNewSectPr();    
        }
      }
      //内容页
      public static void secondpage(XWPFDocument doc){
        XWPFParagraph page = null;
        XWPFRun run = null;
        try {
          simpleDateHeader(doc);
        } catch (Exception e) {
          e.printStackTrace();
        }
        try {
          simpleNumberFooter(doc);
        } catch (Exception e) {
          e.printStackTrace();
        }
        page = doc.createParagraph();
        setpage(page,ParagraphAlignment.LEFT,0,0);
        run = page.createRun();
        run.setBold(true);
        setfont(run,11,"宋体","标题");
        run.addBreak();
    
        run = page.createRun();
        setfont(run,11,"宋体","首行");
        run.addBreak();run.addBreak();
    
        run = page.createRun();
        setfont(run,11,"宋体","提示");
        run.addBreak();
    
        run = page.createRun();
        run.setBold(true);
        run = page.createRun();
        setfont(run,11,"宋体","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        run.addBreak();
    
        createTableCB(doc);
        page.setPageBreak(true);
      }
      //5列
      public static void createTableCB(XWPFDocument doc){
        XWPFTable tb = doc.createTable(5,2);
        settabcelCB(tb,0,"XXXXXXXX","XXXXXXXX");
        settabcelCB(tb,1,"XXXXXXXX","XXXXXXXX");
        settabcelCB(tb,2,"XXXXXXXX","XXXXXXXX");
        settabcelCB(tb,3,"XXXXXXXX","XXXXXXXX");
        settabcelCB(tb,4,"XXXXXXXX","XXXXXXXX");
      }
      //2列
      public static void settabcelCB(XWPFTable tb,int row,String text1,String text2){
        XWPFParagraph p1 = tb.getRow(row).getCell(0).getParagraphs().get(0);
        p1.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun r1 = p1.createRun();
        setfont(r1,11,"宋体",text1);
    
        p1 = tb.getRow(row).getCell(1).getParagraphs().get(0);
        p1.setAlignment(ParagraphAlignment.CENTER);
        r1 = p1.createRun();
        setfont(r1,11,"宋体",text2);
      }
      //横向合并单元格
      public static void mergeCellsHorizontal(XWPFTable table, int row, int fromCell,int toCell){
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
          XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
          if (cellIndex == fromCell) {
            getCellCTTcPr(cell).addNewHMerge().setVal(STMerge.RESTART);
          } else {
            getCellCTTcPr(cell).addNewHMerge().setVal(STMerge.CONTINUE);
          }
        }
      }
      //纵向合并单元格
      public static void mergeCellsVertically(XWPFTable table, int col, int fromRow,int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
          XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
          if (rowIndex == fromRow) {
            getCellCTTcPr(cell).addNewVMerge().setVal(STMerge.RESTART);
          } else {
            getCellCTTcPr(cell).addNewVMerge().setVal(STMerge.CONTINUE);
          }
        }
      }
      public static CTTcPr getCellCTTcPr(XWPFTableCell cell) {
        CTTc cttc = cell.getCTTc();
        CTTcPr tcPr = cttc.isSetTcPr() ? cttc.getTcPr() : cttc.addNewTcPr();
        return tcPr;
      }
      //导出
      public static void export(XWPFDocument doc){
        //导出
        FileOutputStream out = null;
        try {
          out = new FileOutputStream("F:/报告.docx");
          doc.write(out);
          out.flush();
          out.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      //统一设置表格样式和宽度
      public static void exchange(XWPFDocument doc){
        List<XWPFTable> list = doc.getTables();
        for (XWPFTable xwpfTable : list) {
          CTTblBorders border = CTTblBorders.Factory.newInstance();
          CTBorder left = border.isSetLeft()?border.getLeft():CTBorder.Factory.newInstance();
          left.setSz(BigInteger.ONE);
          CTBorder right = border.isSetRight()?border.getRight():CTBorder.Factory.newInstance();
          right.setSz(BigInteger.ONE);
          CTBorder bottom = border.isSetBottom()?border.getBottom():CTBorder.Factory.newInstance();
          bottom.setSz(BigInteger.ONE);
          CTBorder top = border.isSetTop()?border.getTop():CTBorder.Factory.newInstance();
          top.setSz(BigInteger.ONE);
          //内部横线
          CTBorder insideH = border.isSetInsideH()?border.getInsideH():CTBorder.Factory.newInstance();
          insideH.setSz(BigInteger.ONE);
          //内部竖线
          CTBorder insideV = border.isSetInsideV()?border.getInsideV():CTBorder.Factory.newInstance();
          insideV.setSz(BigInteger.ONE);
    
          insideH.setVal(STBorder.Enum.forInt(STBorder.INT_PENCILS));
          insideV.setVal(STBorder.Enum.forInt(STBorder.INT_PENCILS));
          top.setVal(STBorder.Enum.forInt(STBorder.INT_PENCILS));
          bottom.setVal(STBorder.Enum.forInt(STBorder.INT_PENCILS));
          left.setVal(STBorder.Enum.forInt(STBorder.INT_NONE));
          right.setVal(STBorder.Enum.forInt(STBorder.INT_NONE));
    
          border.setLeft(left);
          border.setRight(right);
          border.setBottom(bottom);
          border.setTop(top);
          border.setInsideH(insideH);
          border.setInsideV(insideV);
    
          xwpfTable.getCTTbl().getTblPr().setTblBorders(border);
          //表格属性
          CTTbl ttbl = xwpfTable.getCTTbl();
          CTTblPr tablePr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
          //表格宽度
          CTTblWidth tblWidth = tablePr.isSetTblW()?tablePr.getTblW():tablePr.addNewTblW();
          tblWidth.setW(BigInteger.valueOf(8500));
          //设置表格宽度为非自动
          tblWidth.setType(STTblWidth.DXA);
    
          CTJc jc = tablePr.isSetJc()?tablePr.getJc():tablePr.addNewJc();
          jc.setVal(STJc.Enum.forInt(ParagraphAlignment.CENTER.getValue()));
        }
      }
    }

    参考文档:http://tool.oschina.net/apidocs/apidoc?api=apache-POI

         http://www.tuicool.com/articles/Nr2IV3q

  • 相关阅读:
    爬虫|如何在Pycharm中调试JS代码
    nexus 6p 输入8.1和获取root权限
    年近30的我,离开了北京,回家做个老百姓,等待那一刻的发生!
    Azure认知服务的实际应用-资讯采集推送
    C#类库推荐 拼多多.Net SDK,开源免费!
    [翻译]EntityFramework Core 2.2 发布
    4-如何学习和解决问题
    3-WIN10系统及开发工具支持
    2-选择学习的目标和方向
    1-编程的基本条件和起步
  • 原文地址:https://www.cnblogs.com/xiufengd/p/4708680.html
Copyright © 2011-2022 走看看