You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动