如何使用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
相关产品推荐
相关产品推荐

