2

EPPlusを使用してExcelシートを読み取り、データをデータテーブルにロードしてさらに操作を実行し、変更されたデータをExcelファイルに保存しています。

以下のコードは、セル値が float 値であるかどうかをチェックし、次に float 値を datetime に変換します。

セル値が日付の場合、コードは正常に機能します (例: Invoice Date = 42009 ) が、例: amount = 10 のような日付ではない値を日付に変換します。

EPPlus ライブラリに、セルの形式 (一般/日付/数値など) を特定できる方法はありますか?

float floatValue;

if (float.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out floatValue)
                                && Convert.ToString(oSheet.Cells[i, j].Style.Numberformat.Format).Contains("[$-409]d\\-mmm\\-yy;@"))
  {
      dr[j - 1] = String.Format("{0:d-MMM-yy}", DateTime.FromOADate(floatValue));
  }
  else
  {
       DateTime date;

       if (DateTime.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out date))
        {
                dr[j - 1] = String.Format("{0:d-MMM-yy}", date);
        }
        else
        {
               dr[j - 1] = Convert.ToString(oSheet.Cells[i, j].Value).Trim();
        }
   }
4

2 に答える 2

3

簡単な答えは、Excel のデータが「適切な」日付フィールドとしてフォーマットされている場合です (そのフォーマットは日付に設定されており、セルの隅に三角形がありません)。EPPlus はそれを判断し、自動的に日付に変換します。セルストア。

Excel は、この情報を XLSX xml ファイル (sheet1.xml や styles.xml など) に保存します。これらのファイルは、ファイル拡張子を .ZIP に変更し、圧縮フォルダーとして開くことで確認できます。したがって、EPPlus は XML フラグを読み取り、フィールド値を DateTime に自動的に変換します。その詳細を知りたい場合は、EPPlus のソース コードをダウンロードしてprivate void SetValueFromXml(XmlTextReader xr, string type, int styleID, int row, int col)、ExcelWorksheet クラスの関数を調べてください。

シートを作成し、日付の値を追加し、値をコピーしてセル B2 に貼り付けましたが、形式を数値に設定しました。次に、B2 を B3 にコピーしましたが、値の前に ' を付けて B3 の値を文字列にしました。このような:

ここに画像の説明を入力

この単体テストを実行すると、すべてが合格します。

[TestMethod]
public void Date_Number_Test()
{
    //http://stackoverflow.com/questions/28591763/epplus-how-to-know-the-format-of-the-worksheet-cell
    var existingFile = new FileInfo(@"c:\temp\datetest.xlsx");

    using (var package2 = new ExcelPackage(existingFile))
    {
        var ws = package2.Workbook.Worksheets["Sheet1"];

        var cell = ws.Cells["B1"];
        Assert.IsTrue(cell.Value is DateTime);

        cell = ws.Cells["B2"];
        Assert.IsTrue(cell.Value is double);

        cell = ws.Cells["B3"];
        Assert.IsTrue(cell.Value is string);
    }
}

しかし、あなたが自分のコントロールの及ばないフォーマットを持つシートを扱っているなら、あなたのアプローチは正しいと思います.EPPlus(本当に優れている)に頼ることができるのではなく、数字の「意図」が何であるかを判断する必要があります。それらとして。

于 2015-02-20T13:58:32.950 に答える