実現したいこと
1つのセル内の文字の細かい書式情報(太字、斜体、色、などなど)を取得したい。
例えば、こんな文字列。
記事が見つからなかったので、公式ドキュメント読んで頑張ってみました。
環境
.NET 4.8
NPOI 2.4.1
※対象となるファイル形式は、.xlsx のみ。.xls では動作しません。
結果
ソースはこちら
解説
ポイントは ICell.RichStringCellValue
を IRichTextString
から XSSFRichTextString
へキャストしてあげることです。
var xssfStr = (XSSFRichTextString)cell.RichStringCellValue;
IRichTextString
のままではExcelの旧フォーマット(.xls)との抽象化のため、用意されたプロパティやメソッドが少なく、取得できる情報がほとんどありません。XSSFRichTextString
であれば、細かい書式情報のプロパティが公開されているため出来ることが多くなります。
また、各文字ごとの書式は Run
と呼ばれる単位で取得します。Run
は1つ以上の文字の塊で、何らかの書式が変わった区切りで生成されます。この Run
をループで処理しすべての文字の書式を取得します。取得する際には、先ほどと同様に IFont
を XSSFFont
へキャストしてから行います。
for (int runNo = 0; runNo < xssfStr.NumFormattingRuns; runNo++)
{
var xssfFont = (XSSFFont)xssfStr.GetFontOfFormattingRun(runNo);
サンプルでは、以下の情報を取得します。
それぞれの詳しい説明は 公式ドキュメント を確認してください。
// フォント名
$"Font:{xssfFont.FontName}, " +
// フォント色(16進)
$"Color:{xssfFont.GetXSSFColor()?.GetARGBHex()}, " +
// フォントサイズ(ポイント)
$"Size:{xssfFont.FontHeightInPoints}, " +
// 太字
$"Bold:{string.Format("{0, 5}", xssfFont.IsBold)}, " +
// 斜体(イタリック)
$"Italic:{string.Format("{0, 5}", xssfFont.IsItalic)}, " +
// 下線
$"Underline:{string.Format("{0, 6}", xssfFont.Underline)}, " +
// 取り消し線
$"Strikeout:{string.Format("{0, 5}", xssfFont.IsStrikeout)}, " +
// 上付き(Super)/下付き(Sub)
$"TypeOffset:{string.Format("{0, 5}", xssfFont.TypeOffset)}");
下線については以下の種類が取得できるようです。
public enum FontUnderlineType : byte
{
None = 0, // 無し
Single = 1, // 下線
Double = 2, // 二重下線
SingleAccounting = 33, // 下線(会計)
DoubleAccounting = 34 // 二重下線(会計)
}
終わりに
旧形式(.xls)は無事死亡。