Java 是否可以附加2个富文本字符串?

Java 是否可以附加2个富文本字符串?,java,html,apache-poi,Java,Html,Apache Poi,我需要用ApachePOI在Java中附加2个HSSFrichTextString。我该怎么做? 我所做的就是获取单元格中已经存在的富文本字符串,并尝试向其附加一个额外的富文本字符串,然后将其写回单元格。 请告诉我如何执行此操作。可以附加两个HSSFRichTextStrings,但大部分工作将由您自己完成。您需要利用HSSFRichTextString中的以下方法: -返回HSFFRichTextString中的格式化运行次数 -返回字符串中指定位置的short字体索引 -在给定的开始索引(

我需要用ApachePOI在Java中附加2个HSSFrichTextString。我该怎么做?
我所做的就是获取单元格中已经存在的富文本字符串,并尝试向其附加一个额外的富文本字符串,然后将其写回单元格。

请告诉我如何执行此操作。

可以附加两个
HSSFRichTextStrings
,但大部分工作将由您自己完成。您需要利用
HSSFRichTextString
中的以下方法:

  • -返回
    HSFFRichTextString
    中的格式化运行次数
  • -返回字符串中指定位置的
    short
    字体索引
  • -在给定的开始索引(包含)和结束索引(排除)之间应用
    short
    字体索引所指的字体
首先,创建一个小类来存储格式化运行统计信息:

public class FormattingRun {
    private int beginIdx;
    private int length;
    private short fontIdx;
    public FormattingRun(int beginIdx, int length, short fontIdx) {
        this.beginIdx = beginIdx;
        this.length = length;
        this.fontIdx = fontIdx;
    }
    public int getBegin() { return beginIdx; }
    public int getLength() { return length; }
    public short getFontIndex { return fontIdx; }
}
接下来,收集两个字符串中每个字符串的所有格式化运行统计信息。您必须自己遍历字符串,以确定每次格式化运行的持续时间

List<FormattingRun> formattingRuns = new ArrayList<FormattingRun>();
int numFormattingRuns = richTextString.numFormattingRuns();
for (int fmtIdx = 0; fmtIdx < numFormattingRuns; fmtIdx)
{
    int begin = richTextString.getIndexOfFormattingRun(fmtIdx);
    short fontIndex = richTextString.getFontOfFormattingRun(fmtIdx);

    // Walk the string to determine the length of the formatting run.
    int length = 0;
    for (int j = begin; j < richTextString.length(); j++)
    {
        short currFontIndex = richTextString.getFontAtIndex(j);
        if (currFontIndex == fontIndex)
            length++;
        else
            break;
    }
    formattingRuns.add(new FormattingRun(begin, length, fontIndex));
}
最后,应用两组格式化运行,第二组运行被第一个字符串的长度偏移

for (FormattingRun run1 : formattingRuns1)
{
    int begin = run1.getBegin();
    int end = begin + run1.getLength();
    short fontIdx = run1.getFontIndex();
    result.applyFont(begin, end, fontIdx);
}
for (FormattingRun run2 : formattingRuns2)
{
    // offset by string length 1
    int begin = run2.getBegin() + richTextString1.length();
    int end = begin + run2.getLength();
    short fontIdx = run2.getFontIndex();
    result.applyFont(begin, end, fontIdx);
}
这应该可以连接
HSSFrichTextString


如果您想要连接.xlsx文件中的
XSSFRichTextStrings
,则过程非常类似。一个区别是
XSSFRichTextString#getFontOfFormattingRun
将返回
xssfont
而不是
short
字体索引。这没关系,因为对
XSSFRichTextString
调用
applyFont
无论如何都需要
xssfont
。另一个区别是
getFontOfFormattingRun
可能会抛出
NullPointerException
,如果没有为格式化运行应用字体,如果应用的字体与整个
单元格的
单元格样式
中已有的字体相同,则会发生这种情况。如果使用XSSFrichTextString,则无法直接连接两个RichTextString

但是,您可以通过查找第二个RichTextString的文本值,然后使用append方法将该字符串值附加到应用的字体(本质上是RichText)来间接地执行此操作

资料来源:


看看javadoc,这似乎是不可能的。您始终可以使用连接的字符串创建新的HSSFrichTextString并重新应用格式…但我不能确定是否已将wat格式应用于单元格中已存在的富文本字符串。那怎么办呢?有可能得到富文本字符串的字体吗?我不知道HSSFrichTextString是如何工作的,我只是查看了javadoc。它有一个字符一个字符地读写格式的方法,所以我认为你可以使用它们。。。()和()如何绕过XSSFrichTextString的NullPointerException?@user1007895捕获
getFontOfFormattingRun
抛出的
NullPointerException
;在这种情况下,该索引没有运行格式。不要为没有应用字体的空白创建
格式运行
。然后,您将不会调用
applyFont
来查找新
XSSFRichTextString
中的相应间隙。
for (FormattingRun run1 : formattingRuns1)
{
    int begin = run1.getBegin();
    int end = begin + run1.getLength();
    short fontIdx = run1.getFontIndex();
    result.applyFont(begin, end, fontIdx);
}
for (FormattingRun run2 : formattingRuns2)
{
    // offset by string length 1
    int begin = run2.getBegin() + richTextString1.length();
    int end = begin + run2.getLength();
    short fontIdx = run2.getFontIndex();
    result.applyFont(begin, end, fontIdx);
}
XSSFRichTextString rt1 = new XSSFRichTextString("Apache POI is");
rt1.applyFont(plainArial);
XSSFRichTextString rt2 = new XSSFRichTextString(" great!");
rt2.applyFont(boldArial);
String text = rt2.getString();

cell1.setCellValue(rt1.append(text, boldArial));