【POI操作word方法大全示例】

POI操作word方法大全示例总结


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


使用场景

近段时间,由我开发的公司其中的一个管理模块,有个需求就是生成月度报表,其中涉及到很多报表的整合 到最后都要生成到一个word上,由于数据量的不定性,所以不能使用模板去生成,就需要按照需求手动生成,所以运用了poi,也进行了系统的复习,涉及到了很多poi的基本操作,也遇到了很多坑,所以总结一下,方便之后查缺补漏


提示:以下是本篇文章正文内容,下面案例可供参考

一、poi是什么?

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

二、使用示例

1.代码示例

里面很多涉及到公司到业务的定制可以忽略,但是api的使用还是比较全的:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.常用api操作

         //创建一个word文档
        XWPFDocument xwpfDocument = new XWPFDocument();
         //创建段落标题
        XWPFParagraph titlesparagraph1 = xwpfDocument.createParagraph();
        XWPFRun run = titlesparagraph1.createRun();
        //设置文字
        run.setText("1 "+ data.getString(formatMonth)+"月工作情况");
        //文字大小
        run.setFontSize(18);
        //加粗
        run.setBold(true);

3.表格相关

代码如下(示例):

  //设置单元格样式 本人对生成表格样式的集中方法
    public XWPFTable setWordStyle(XWPFTable table,int col){
        //给表格加边框
        CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
        CTBorder lBorder = borders.addNewLeft();
        //双实线
        lBorder.setVal(STBorder.Enum.forString("double"));
        lBorder.setSz(new BigInteger("1"));
        lBorder.setColor("000000");

        CTBorder rBorder = borders.addNewRight();
        rBorder.setVal(STBorder.Enum.forString("double"));
        rBorder.setSz(new BigInteger("1"));
        rBorder.setColor("000000");

        CTBorder tBorder = borders.addNewTop();
        tBorder.setVal(STBorder.Enum.forString("double"));
        tBorder.setSz(new BigInteger("1"));
        tBorder.setColor("000000");

        CTBorder bBorder = borders.addNewBottom();
        bBorder.setVal(STBorder.Enum.forString("double"));
        bBorder.setSz(new BigInteger("1"));
        bBorder.setColor("000000");

        //获取到表格属性
        CTTblPr tablePr = table.getCTTbl().addNewTblPr();
//        table.se(TableRowAlign.CENTER);
        //获取到表格样式宽度
        CTTblWidth width = tablePr.addNewTblW();
        //设置宽度
        width.setW(BigInteger.valueOf(9000));
        //设置表格宽度为非自动
        width.setType(STTblWidth.DXA);
        //获取到表格的所有行数
        List<XWPFTableRow> rows = table.getRows();
        for (int i = 0; i < rows.size(); i++) {
            //表格中行对象
            XWPFTableRow row = rows.get(i);
            //获取到行属性
            CTTrPr ctTrPr = row.getCtRow().addNewTrPr();

            //行高属性
            CTHeight ctHeight = ctTrPr.addNewTrHeight();
            //设置行高
            if (i==0){
                ctHeight.setVal(new BigInteger("400"));
            }else {
                ctHeight.setVal(new BigInteger("700"));
            }
            for (int j=0;j<col;j++){
                //获得每个单元格的属性
                CTTcPr ctTcPr = row.getCell(j).getCTTc().addNewTcPr();
                //获得每个单元格的宽度属性
                CTTblWidth ctTblWidth = ctTcPr.addNewTcW();
                //设置宽度
                switch (String.valueOf(col)){
                    case "2":
                        if (j==0){
                           //设置表格中单元格宽度
                            ctTblWidth.setW(BigInteger.valueOf(1000));
                        }else{
                            ctTblWidth.setW(BigInteger.valueOf(8000));
                        }
                        break;
                    case "4":
                        if (j==0){
                            ctTblWidth.setW(BigInteger.valueOf(1000));
                        }else if (j==1||j==2){
                            ctTblWidth.setW(BigInteger.valueOf(2000));
                        }else if (j==3){
                            ctTblWidth.setW(BigInteger.valueOf(4000));
                        }
                        break;
                    case "5":
                        if (j==0||j==2){
                            ctTblWidth.setW(BigInteger.valueOf(1000));
                        }else if (j==1||j==3){
                            ctTblWidth.setW(BigInteger.valueOf(2000));
                        }else if (j==4){
                            ctTblWidth.setW(BigInteger.valueOf(3000));
                        }
                        break;
                }

                ctTblWidth.setType(STTblWidth.DXA);
                //表格行内容垂直居中:
                CTVerticalJc va = ctTcPr.addNewVAlign();
                va.setVal(STVerticalJc.CENTER);
                //表格行水平居中
                row.getCell(j).getCTTc().getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
                //给单元格添加颜色
                CTShd ctshd = ctTcPr.addNewShd();
                ctshd.setColor("auto");
                ctshd.setVal(STShd.CLEAR);
                if (i==0){
                    //只给第一行添加颜色
                    //ctshd.setFill("A7BFDE");

                }
            }
        }
        return table;
    }

创建表格

XWPFTable table =null;
        if (dataList.size()>0) {
            //生成个表格
             table = xwpfDocument.createTable(dataList.size() + 1, col);
        }else {
            //如果数量小于0 说明没数据 那就建一个2行的表格
            table = xwpfDocument.createTable(2, col);


             //1.1.1 往表格添加数据
                    table.getRow(0).getCell(0).setText("序号");
                    table.getRow(0).getCell(1).setText("项目名称");
                    table.getRow(0).getCell(2).setText("负责人");
                    table.getRow(0).getCell(3).setText("项目状况");
        }

3.插入页眉页脚

插入页眉

 //创建页眉
    public static XWPFDocument createHeader (XWPFDocument doc) throws Exception {
        CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
            XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy( doc, sectPr );
          
             XWPFHeader header = headerFooterPolicy.createHeader(headerFooterPolicy.DEFAULT);
//             XWPFHeader header1 = headerFooterPolicy.createHeader(headerFooterPolicy.EVEN);
//             XWPFHeader header2 = headerFooterPolicy.createHeader(headerFooterPolicy.DEFAULT);
            XWPFParagraph paragraph = header.createParagraph();
            //靠左
            paragraph.setAlignment( ParagraphAlignment.LEFT );
            //实线
            paragraph.setBorderBottom( Borders.THICK );
            XWPFRun run = paragraph.createRun();

            String imgFile = "C:\\TEST\\111.jpg";
            File file = new File( imgFile );
            InputStream is = new FileInputStream( file );
            //添加页眉图片
            XWPFPicture picture = run.addPicture( is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile,       Units.toEMU( 140 ), Units.toEMU( 17 ) );
            String blipID = "";
            for( XWPFPictureData picturedata : header.getAllPackagePictures() ) { // 这段必须有,不然打开的logo图片不显示
                blipID = header.getRelationId( picturedata );
                picture.getCTPicture().getBlipFill().getBlip().setEmbed( blipID );
            }

            is.close();
            run.addBreak();


        //测试路径
      return doc;

    }
    

插入页脚

 //生成页脚
    public void createFooter(XWPFDocument doc){
        /*
         * 生成页脚段落
         * 给段落设置宽度为占满一行
         * */

        CTSectPr sectPr=doc.getDocument().getBody().addNewSectPr();
        XWPFHeaderFooterPolicy headerFooterPolicy=new XWPFHeaderFooterPolicy(doc,sectPr);
        try {
            XWPFFooter footer=headerFooterPolicy.createFooter(STHdrFtr.DEFAULT);

            XWPFParagraph paragraph = footer.getParagraphArray(0);
            paragraph.setAlignment(ParagraphAlignment.LEFT);
            paragraph.setVerticalAlignment(TextAlignment.CENTER);
            paragraph.setBorderTop(Borders.THICK);
            CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
            tabStop.setVal(STTabJc.RIGHT);
            int twipsPerInch =  1440;
            tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
            /*
             * 给段落创建元素
             * 设置元素字面为公司地址+公司电话
             * */
            XWPFRun run = paragraph.createRun();
            setXWPFRunStyle(run,"宋体",11);
            run.addTab();
            String s=run.getFontFamily();
            /*
             * 生成页码
             * 页码右对齐
             * */
            run = paragraph.createRun();
            run.setText("第");
            setXWPFRunStyle(run,"宋体",11);
            run = paragraph.createRun();
            CTFldChar fldChar = run.getCTR().addNewFldChar();
//            fldChar.set
            fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
            setXWPFRunStyle(run,"宋体",11);
            run = paragraph.createRun();
            CTText ctText = run.getCTR().addNewInstrText();

            ctText.setStringValue("PAGE  \\* MERGEFORMAT");
            ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
            setXWPFRunStyle(run,"宋体",11);

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

            run = paragraph.createRun();
            run.setText("页/共");
            setXWPFRunStyle(run,"宋体",11);

            run = paragraph.createRun();
            fldChar = run.getCTR().addNewFldChar();
            fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));

            run = paragraph.createRun();
            ctText = run.getCTR().addNewInstrText();
            ctText.setStringValue("NUMPAGES  \\* MERGEFORMAT ");
            ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
            setXWPFRunStyle(run,"宋体",11);

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

            run = paragraph.createRun();
            run.setText("页");
            setXWPFRunStyle(run,"宋体",11);
        } catch (IOException e) {
             e.printStackTrace();
        }
    }

设置字体

private void setXWPFRunStyle(XWPFRun r1,String font,int fontSize) {
        r1.setFontSize(fontSize);
        //获取到样式属性(三元运算符)
        CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
        //设置字体
        fonts.setAscii(font);
        fonts.setEastAsia(font);
        fonts.setHAnsi(font);
    }

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅介绍了poi的使用及一些常用的api,而poi提供了大量能使我们快速便捷地处理word和excel的方法,记录下 方便以后回顾 。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值