2016-11-04 34 views
2

DevExpressを使用して編集したExcelファイルがあり、NPOIを使用して読んでいます。文字列として日付セルの値を取得しようとすると、元の値が保持されません。日付を含むセルの値を取得し、NPOIを使用して元の書式を保持する方法

例: DevExpressグリッドでは、この値を2016-08-12に設定します。私は同じ値を文字列に入れたいのですが、代わりに42689が得られます。セルの値を取得する

私のコードは次のようである:

ICell cell = row.GetCell(i); 
    cell.SetCellType(CellType.String); 
    string fieldString = cell.StringCellValue; 
    result = result + ";" + FieldValue; 

は、どのように私は、元のフォーマットされた日付値を得ることができますか?

+0

質問を指定してください。 –

答えて

3

Excelでは、日付は数値として格納されます。書式設定された日付を取得する場合は、セルに日付が含まれているかどうかを確認する必要があります(そのためのユーティリティメソッドがあります)。次に、セルの日付値を取得し、データ形式を取得し、フォーマットを使用している文字列。 CellTypeを強制的に文字列にしてはいけません。そうしないと、もともとセルが元々日付を保持していることを伝えることができなくなります。このようにそれを使用し、その後

using NPOI.SS.UserModel; 
public static class NpoiExtensions 
{ 
    public static string GetFormattedCellValue(this ICell cell, IFormulaEvaluator eval = null) 
    { 
     if (cell != null) 
     { 
      switch (cell.CellType) 
      { 
       case CellType.String: 
        return cell.StringCellValue; 

       case CellType.Numeric: 
        if (DateUtil.IsCellDateFormatted(cell)) 
        { 
         DateTime date = cell.DateCellValue; 
         ICellStyle style = cell.CellStyle; 
         // Excel uses lowercase m for month whereas .Net uses uppercase 
         string format = style.GetDataFormatString().Replace('m', 'M'); 
         return date.ToString(format); 
        } 
        else 
        { 
         return cell.NumericCellValue.ToString(); 
        } 

       case CellType.Boolean: 
        return cell.BooleanCellValue ? "TRUE" : "FALSE"; 

       case CellType.Formula: 
        if (eval != null) 
         return GetFormattedCellValue(eval.EvaluateInCell(cell)); 
        else 
         return cell.CellFormula; 

       case CellType.Error: 
        return FormulaError.ForInt(cell.ErrorCellValue).String; 
      } 
     } 
     // null or blank cell, or unknown cell type 
     return string.Empty; 
    } 
} 

:私はそのタイプに基づいてフォーマットされたセルの値を取得するには、次のように拡張メソッドを作る推薦

ICell cell = row.GetCell(i); 
string fieldString = cell.GetFormattedCellValue(); 
result = result + ";" + FieldValue; 

オプション:あなたは内の任意の数式を使用している場合は、あなたのこれらの数式を評価するには、ブックの種類に基づいてIFormulaEvaluatorを作成し、評価ツールをGetFormattedCellValue()メソッドに渡します。例:

IFormulaEvaluator eval; 
if (workbook is XSSFWorkbook) 
    eval = new XSSFFormulaEvaluator(workbook); 
else 
    eval = new HSSFFormulaEvaluator(workbook); 

... 

ICell cell = row.GetCell(i); 
string fieldString = cell.GetFormattedCellValue(eval); 
result = result + ";" + FieldValue; 
関連する問題