You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI在指定位置插入XSLFTextRun?

实现XSLFTextParagraph指定位置插入XSLFTextRun

Apache POI的XSLF模块确实没有提供像XWPF那样直接的insertNewRun方法,但可以通过操作底层的OOXML对象来实现指定位置插入文本运行。核心思路是直接操作XSLFTextParagraph对应的XML节点,在指定索引位置插入新的文本运行节点,再包装成XSLFTextRun实例。

工具方法实现

import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;

public static XSLFTextRun insertNewTextRun(XSLFTextParagraph paragraph, int index) {
    // 校验索引合法性
    if (index < 0) {
        index = 0;
    }
    
    CTTextParagraph ctPara = paragraph.getXmlObject();
    var runs = ctPara.getRList();
    
    // 索引超出范围时,直接在末尾添加
    if (index >= runs.size()) {
        return paragraph.addNewTextRun();
    }
    
    // 在指定位置插入新的CTTextRun节点
    var newCtRun = ctPara.insertNewR(index);
    // 将底层XML节点包装为XSLFTextRun
    return new XSLFTextRun(newCtRun, paragraph);
}

使用示例

假设你需要在现有段落的第2个文本运行(索引从0开始)位置插入新内容:

// 假设已获取目标段落XSLFTextParagraph paragraph
int insertPos = 1;
XSLFTextRun insertedRun = insertNewTextRun(paragraph, insertPos);

// 设置插入文本的内容和样式
insertedRun.setText("这是插入的新文本");
insertedRun.setFontColor(java.awt.Color.BLUE);
insertedRun.setFontSize(14);

注意事项

  • 索引从0开始计数,和Java集合的索引规则一致
  • 若传入的索引小于0,方法会默认插入到段落开头;若索引大于等于现有文本运行数量,则等同于调用addNewTextRun()在末尾添加
  • 该方法兼容POI 4.x及5.x版本,操作底层XML节点时无需担心POI的上层API变更影响

内容的提问来源于stack exchange,提问作者Furqan Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:12:46