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

时间:2012-03-14 09:30:47

标签: java html5 apache-poi

我需要使用Apache POI附加到Java中的2个HSSFRichTextStrings。我怎么能这样做?
我正在做的是我正在获取单元格中已存在的富文本字符串,并且我正在尝试向其附加一个额外的富文本字符串并将其写回单元格。
请告诉我怎么做。

2 个答案:

答案 0 :(得分:6)

可以附加两个HSSFRichTextStrings,但您必须自己完成大部分工作。您需要在HSSFRichTextString中使用以下方法:

首先,创建一个小类来存储格式化运行统计信息:

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));
}

接下来,自己连接两个String值并创建结果HSSFRichTextString

HSSFRichTextString result = new HSSFRichTextString(
     richTextString1.getString() + richTextString2.getString());

最后,应用两组格式化运行,第二组运行偏移第一个字符串的长度。

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);
}

这应该用于连接HSSFRichTextStrings

如果您想要连接.xlsx文件中的XSSFRichTextStrings,则该过程非常相似。一个区别是XSSFRichTextString#getFontOfFormattingRun将返回XSSFFont而不是short字体索引。这没关系,因为在applyFont上调用XSSFRichTextString无论如何都需要XSSFFont。另一个区别是,如果没有为格式化运行应用任何字体,getFontOfFormattingRun可能会抛出NullPointerException,这种情况发生时,如果没有应用的字体不同于{{1}已存在的字体}对于整个CellStyle

答案 1 :(得分:0)

如果您正在使用XSSFRichTextStrings,则无法直接连接两个RichTextString。

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

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));

来源:

enter link description here