Apache POI 中XWPFParagraph如何利用XWPFRun生成指定文字样式大小颜色的文本并插入文档中

  /**
     * 替换段落里面的变量
     *
     * @param para   要替换的段落
     * @param params 参数
     */
    private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
        List<XWPFRun> runs;
        Matcher matcher;
        String runText = "";
        int fontSize = 0;
        UnderlinePatterns underlinePatterns = null;
        if (this.matcher(para.getParagraphText()).find()) {
            runs = para.getRuns();
            if (runs.size() > 0) {
                int j = runs.size();
                for (int i = 0; i < j; i++) {
                    XWPFRun run = runs.get(0);
                    if (fontSize == 0) {
                        fontSize = run.getFontSize();
                    }
                    if(underlinePatterns==null){
                        underlinePatterns=run.getUnderline();
                    }
                    String i1 = run.toString();
                    runText += i1;
                    para.removeRun(0);
                }
            }
            matcher = this.matcher(runText);
            if (matcher.find()) {
                while ((matcher = this.matcher(runText)).find()) {
                    runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
                }
                //直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
                //所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
//                para.insertNewRun(0).setText(runText);//新增的没有样式

                XWPFRun run = para.createRun();
//                run.setBold(true); //加粗
                run.setText(runText,0);
                run.setFontSize(fontSize);
                run.setUnderline(underlinePatterns);
//                run.setColor("FF0000");


                //默认:宋体(wps)/等线(office2016) 5号 两端对齐 单倍间距
/*                runX.setText("舜发于畎亩之中, 傅说举于版筑之间, 胶鬲举于鱼盐之中, 管夷吾举于士...");
                runX.setBold(false);//加粗
                runX.setCapitalized(false);//我也不知道这个属性做啥的
//runX.setCharacterSpacing(5);//这个属性报错
                runX.setColor("BED4F1");//设置颜色--十六进制
                runX.setDoubleStrikethrough(false);//双删除线
                runX.setEmbossed(false);//浮雕字体----效果和印记(悬浮阴影)类似
//runX.setFontFamily("宋体");//字体
                runX.setFontFamily("华文新魏", FontCharRange.cs);//字体,范围----效果不详
                runX.setFontSize(14);//字体大小
                runX.setImprinted(false);//印迹(悬浮阴影)---效果和浮雕类似
                runX.setItalic(false);//斜体(字体倾斜)
//runX.setKerning(1);//字距调整----这个好像没有效果
                runX.setShadow(true);//阴影---稍微有点效果(阴影不明显)
//runX.setSmallCaps(true);//小型股------效果不清楚
//runX.setStrike(true);//单删除线(废弃)
                runX.setStrikeThrough(false);//单删除线(新的替换Strike)
//runX.setSubscript(VerticalAlign.SUBSCRIPT);//下标(吧当前这个run变成下标)---枚举
//runX.setTextPosition(20);//设置两行之间的行间距
//runX.setUnderline(UnderlinePatterns.DASH_LONG);//各种类型的下划线(枚举)
//runX0.addBreak();//类似换行的操作(html的  br标签)
                runX0.addTab();//tab键
                runX0.addCarriageReturn();//回车键
                注意:addTab()和addCarriageReturn() 对setText()的使用先后顺序有关:比如先执行addTab,再写Text这是对当前这个Text的Table,反之是对下一个run的Text的Tab效果
            */
            }
        }

        /*List<XWPFRun> runs;
        Matcher matcher;
        if (this.matcher(para.getParagraphText()).find()) {
            runs = para.getRuns();
            for (int i=0; i<runs.size(); i++) {
                XWPFRun run = runs.get(i);
                String runText = run.toString();
                matcher = this.matcher(runText);
                if (matcher.find()) {
                    while ((matcher = this.matcher(runText)).find()) {
                        runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
                    }
                    //直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
                    //所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
                    para.removeRun(i);
                    para.insertNewRun(i).setText(runText);
                }
            }
        }*/
    }
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值