2012-03-14 58 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

相關問題