2012-03-14 27 views
2

我需要在java apache poi中追加到2个HSSFRichTextStrings。我怎样才能做到这一点?
究竟在干什么IM是即时得到丰富的文本字符串已经存在于细胞中,并试图附加的富文本字符串追加到它,并把它写回小区。
请告诉我如何做到这一点。请..是否可以附加2个富文本字符串?

+0

看着它似乎没有可能的Javadoc。您可以一直创建一个新的HSSFRichTextStrings与串联的字符串,并重新应用格式... – assylias 2012-03-14 09:35:46

+0

但我不能肯定地说,格式化已应用于已存在于单元格中的富文本字符串。那怎么办呢?是否有可能获得丰富的文本字符串的字体? – 2012-03-14 09:41:01

+1

我不知道HSSFRichTextStrings是如何工作的,我只是看着javadoc。它具有逐字符读写格式的方法 - 所以我原以为你可以使用它们......(http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFRichTextString.html #applyFont%28int,%20int,%20short%29)和(http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFRichTextString.html#getFontAtIndex%28int%29) – assylias 2012-03-14 09:47:34

回答

5

可以附加两个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

如果你想连接XSSFRichTextStrings,在.XLSX文件发现,这个过程是非常相似的。一个区别是,XSSFRichTextString#getFontOfFormattingRun将返回XSSFFont而不是short字体索引。这没关系,因为上XSSFRichTextString调用applyFont需要一个XSSFFont反正。另一个区别是,getFontOfFormattingRun可能抛出NullPointerException如果没有申请的格式运行,当存在比已经存在的CellStyle整个Cell的字体没有施加不同的字体发生字体。

+0

你绕过XSSFRichTextStrings的NullPointerException? – user1007895 2013-10-01 03:19:43

+0

@ user1007895捕获'getFontOfFormattingRun'抛出的'NullPointerException';那就是在该索引处没有格式化运行的情况。不要在没有应用字体的情况下为那个空白创建一个'FormattingRun'。然后,你不会在新的'XSSFRichTextString'中调用'applyFont'作为相应的空白。 – rgettman 2013-10-01 17:58:28

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

相关问题