NPOIではセルの値を取得する時は、
以下のように値の型に合わせたメソッドを使用する必要があり面倒です。
文字型:.getStringCellValue()
数値型:.getNumericCellValue()
boolean型:.getBooleanCellValue()
関数:.getCellFormula()
そこで、全て文字列として取得するFunctionを作ってみました。
サンプル
例)セル値の型に係わらずString型で値を取得するFunction
/// <summary>
/// セル値を全て文字列として取得する
/// </summary>
/// <param name="cell">Cellオブジェクト</param>
/// <returns>結果文字列</returns>
public static string GetCellValue(ICell cell) {
string strval = null;
switch (cell.CellType)
{
case CellType.String:
//文字型
strval = cell.StringCellValue;
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
//日付型
strval = cell.DateCellValue.ToString("yyyy/MM/dd");
}
else
{
//数値型
strval = cell.NumericCellValue.ToString();
}
break;
case CellType.Boolean:
//真偽型
strval = cell.BooleanCellValue.ToString();
break;
case CellType.Formula:
//関数
strval = cell.CellFormula.ToString();
break;
case CellType.Blank:
//ブランク
strval = "";
break;
case CellType.Error:
//エラー
strval = cell.ErrorCellValue.ToString();
break;
default:
break;
}
return strval;
}
例として、上のFunctionを使用したサンプルです。
このExcelを読み込んでみます。
(C:¥Sample.xlsx)
using NPOI.SS.UserModel;
try
{
//Excelファイルを読込み
var book = WorkbookFactory.Create(@"C:¥Sample.xlsx");
//Excelから読み取る対象シートのオブジェクトを取得する
var sheet = book.GetSheet("Sheet1");
//行のオブジェクトを取得する(1行目)
var row = sheet.GetRow(0);
//セル値を文字列として取得する
var str1 = GetCellValue(row.GetCell(0)); //A1セル
var str2 = GetCellValue(row.GetCell(1)); //B1セル
var str3 = GetCellValue(row.GetCell(2)); //C1セル
var str4 = GetCellValue(row.GetCell(3)); //D1セル
var str5 = GetCellValue(row.GetCell(4)); //E1セル
//コンソールに出力する
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.WriteLine(str3);
Console.WriteLine(str4);
Console.WriteLine(str5);
}
catch (Exception ex)
{
Console.Write(ex.StackTrace);
}
結果
"みかん"
"2021/12/31"
"123.45"
"FALSE"
"SUM(1,2,3)"
備考
- NPOIではセル値を取得する時に、セル値の型によってメソッドを変えないといけないのでなかなか面倒です。
このようなファンクションを作っておくと、常に同じメソッドで値を取れるので便利です。