私は2つのHSSFRichTextStringsにjava apache poiを追加する必要があります。これどうやってするの?
正確に何をしているのは、既にリッチテキスト文字列をセルに入れて、リッチテキスト文字列を追加してセルに書き戻そうとしていることです。
これを行う方法を教えてください。2つのリッチテキスト文字列を追加できますか?
答えて
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#getFontOfFormattingRun
がshort
フォントインデックスの代わりにXSSFFont
を返すことです。とにかくXSSFRichTextString
にapplyFont
を呼び出すと、XSSFFont
と表示されるため、大丈夫です。別の違いは、Cell
の場合に既にCellStyle
のフォントと異なるフォントが適用されていない場合に発生する、書式設定の実行にフォントが適用されていない場合がNullPointerException
を投げることがあります。
あなたはXSSFRichTextStringsのNullPointerExceptionを回避しますか? – user1007895
@ user1007895 'getFontOfFormattingRun'によってスローされた' NullPointerException'をキャッチします。そのインデックスに書式設定が実行されていない場合です。フォントが適用されていないそのギャップのために 'FormattingRun'を作成しないでください。それから、新しい 'XSSFRichTextString'の対応するギャップに対して' applyFont'を呼び出さないでしょう。 – rgettman
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を見てみる
- 1. 追加文字列
。あなたはいつも連結された文字列で新しいHSSFRichTextStringsを作成し、書式を再適用することができます... – assylias
しかし、私はワットの書式がセルに既に存在するリッチテキスト文字列に適用されていると言うことはできません。どのようにそれを行うことができますか?リッチテキスト文字列のフォントを取得することは可能ですか? –
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