2012-03-14 16 views
2

私は2つのHSSFRichTextStringsにjava apache poiを追加する必要があります。これどうやってするの?
正確に何をしているのは、既にリッチテキスト文字列をセルに入れて、リッチテキスト文字列を追加してセルに書き戻そうとしていることです。
これを行う方法を教えてください。2つのリッチテキスト文字列を追加できますか?

+0

。あなたはいつも連結された文字列で新しいHSSFRichTextStringsを作成し、書式を再適用することができます... – assylias

+0

しかし、私はワットの書式がセルに既に存在するリッチテキスト文字列に適用されていると言うことはできません。どのようにそれを行うことができますか?リッチテキスト文字列のフォントを取得することは可能ですか? –

+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

答えて

5

2つを追加することは可能ですが、ほとんどの作業を自分で行う必要があります。あなたはHSSFRichTextStringの次のメソッドを利用する必要があります。

  • numFormattingRuns()からHSFFRichTextStringで実行をフォーマットの数を返します。
  • getFontOfFormattingRun(int) - 指定した開始インデックス(含む)及び終了インデックス(排他的)との間のshortフォントインデックスによって参照されるフォントを適用 - ストリング
  • applyFont(int, int, 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)); 
} 

次に、2つのStringの値を自分で連結し、その結果HSSFRichTextStringを作成します。

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

最後に、2番目の実行セットを最初の文字列の長さだけオフセットして両方のフォーマット実行を適用します。

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を連結したい場合は、プロセスは非常に似ています。 1つの違いはXSSFRichTextString#getFontOfFormattingRunshortフォントインデックスの代わりにXSSFFontを返すことです。とにかくXSSFRichTextStringapplyFontを呼び出すと、XSSFFontと表示されるため、大丈夫です。別の違いは、Cellの場合に既にCellStyleのフォントと異なるフォントが適用されていない場合に発生する、書式設定の実行にフォントが適用されていない場合がNullPointerExceptionを投げることがあります。

+0

あなたはXSSFRichTextStringsのNullPointerExceptionを回避しますか? – user1007895

+0

@ user1007895 'getFontOfFormattingRun'によってスローされた' NullPointerException'をキャッチします。そのインデックスに書式設定が実行されていない場合です。フォントが適用されていないそのギャップのために 'FormattingRun'を作成しないでください。それから、新しい 'XSSFRichTextString'の対応するギャップに対して' applyFont'を呼び出さないでしょう。 – rgettman

0

XSSFRichTextStringsを使用している場合、2つのRichTextStringを直接連結することはできません。

ただし、2番目の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)); 

出典:可能ではないようjavadocを見てみる

enter link description here

関連する問題