如何使用Apache POI从Excel文本框中获取XSSFRichTextString?
解决Apache POI Excel文本框修改文本保留格式的问题
我之前也踩过这个坑!用Apache POI操作Excel文本框时,明明setText()支持传入String或者XSSFRichTextString两种参数,但getText()却只返回纯字符串,想改文本又保留原有格式的时候,发现XSSFRichTextString居然没有直接的setText()方法,只能在构造时初始化文本,确实有点闹心。
给你分享我当时解决这个问题的思路和方法:
- 首先,别直接用
getText()拿字符串,文本框的底层其实存储了带格式的富文本内容,我们可以通过XSSFShape.getTextParagraphs()获取到文本段落,再从段落里提取原有的XSSFRichTextString对象,这里面就包含了所有格式信息。 - 然后,把原富文本里的格式属性(比如字体、颜色、加粗、斜体这些)提取出来——如果原文本是单一格式,直接拿
getFontAtIndex(0)就能拿到全局字体;如果是多段不同格式,需要遍历每个格式片段的索引范围和对应字体。 - 接下来,用你要替换的新文本初始化一个全新的
XSSFRichTextString对象,再把刚才提取的格式逐一应用到这个新对象上。 - 最后,把这个带格式的新富文本对象传给文本框的
setText(XSSFRichTextString)方法,就能实现只改文本、保留原有格式的效果了。
给你贴一段简单的示例代码(假设文本框是单一格式的情况):
// 假设已获取到目标文本框对象XSSFTextBox textBox // 获取原有的富文本内容 XSSFRichTextString originalRichText = textBox.getTextParagraphs().get(0).getRichTextString(); // 提取原格式对应的字体 XSSFFont originalFont = originalRichText.getFontAtIndex(0); // 用新文本创建新的富文本对象 XSSFRichTextString newRichText = new XSSFRichTextString("你想要替换的新文本"); // 将原格式应用到整个新文本 newRichText.applyFont(0, newRichText.length(), originalFont); // 把新的富文本设置回文本框 textBox.setText(newRichText);
如果原文本有多个不同格式的片段,你需要循环遍历originalRichText的每个格式区间(用getFormattingRuns()方法),然后对应把格式应用到新文本的对应位置就行——要是新文本长度和原文本不一样,可能需要根据需求调整格式的应用范围,比如把所有格式统一应用到新文本,或者按比例映射格式位置。
内容的提问来源于stack exchange,提问作者AndyW




