ここでは、不完全ではありますが、NPOI で日付や数式などが設定してあるセルが出力しているテキストを取得するサンプルコードを掲載しています。また、Excel2013 で作成したエクセルファイルで動作確認を行っています。
スポンサーリンク
日付や数式などの表示文字列を取得する
数値はもちろんのこと、日付もエクセルでは数値として管理されています。従って、そのまま日付情報を取得しようとしても数値が取得されてしまいます。
日付と数値の区別がメインになりますが、セルタイプに合わせてセルテキストを取得するサンプルコードです。詳細はサンプル内のコメントを参照ください。
C#
//using NPOI.SS.UserModel;
//using NPOI.SS.Util;
string filePath = @"path/to/execl.xlsx";
IWorkbook wb;
using (FileStream infile = new FileStream(filePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
// ポイント::
// ImportOption.All 以外の指定はNG(数値と日付の区別にstyle情報が必要)
wb = WorkbookFactory.Create(infile, ImportOption.All);
}
// シート名を取得して、シート情報を取得
ISheet sheet = wb.GetSheet("Sheet1");
string cellStr = string.Empty;
// インデックス指定でセル情報を取得(インデックスは0始まり)
ICell cell = sheet.GetRow(1).GetCell(3);
// cell が null であるかの判断があったほうがよい
switch (cell.CellType)
{
// 文字列型
case CellType.String:
cellStr = cell.StringCellValue;
break;
// 数値型(日付の場合もここに入る)
case CellType.Numeric:
// セルが日付情報が単なる数値かを判定
if (DateUtil.IsCellDateFormatted(cell))
{
// 日付型
// 本来はスタイルに合わせてフォーマットすべきだが、
// うまく表示できないケースが若干見られたので固定のフォーマットとして取得
cellStr = cell.DateCellValue.ToString("yyyy/MM/dd HH:mm:ss");
}
else
{
// 数値型
cellStr = cell.NumericCellValue.ToString();
}
break;
// bool型(文字列でTrueとか入れておけばbool型として扱われた)
case CellType.Boolean:
cellStr = cell.BooleanCellValue.ToString();
break;
// 入力なし
case CellType.Blank:
cellStr = cell.ToString();
break;
// 数式
case CellType.Formula:
// 下記で数式の文字列が取得される
//cellStr = cell.CellFormula.ToString();
// 数式の元となったセルの型を取得して同様の処理を行う
// コメントは省略
switch (cell.CachedFormulaResultType)
{
case CellType.String:
cellStr = cell.StringCellValue;
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
cellStr = cell.DateCellValue.ToString("yyyy/MM/dd HH:mm:ss");
}
else
{
cellStr = cell.NumericCellValue.ToString();
}
break;
case CellType.Boolean:
cellStr = cell.BooleanCellValue.ToString();
break;
case CellType.Blank:
break;
case CellType.Error:
cellStr = cell.ErrorCellValue.ToString();
break;
case CellType.Unknown:
break;
default:
break;
}
break;
// エラー
case CellType.Error:
cellStr = cell.ErrorCellValue.ToString();
break;
// 型不明なセル
case CellType.Unknown:
break;
// もっと不明なセル(あぶない刑事をなぜか思い出しました)
default:
break;
}