ExcelDataReader数据类型“日期”被转换

时间:2017-01-16 07:40:13

标签: c# excel date exceldatareader

以下代码从excel文件中读取数据:

        string path = "testtable.xls";

        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);

        IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);

        excelReader.IsFirstRowAsColumnNames = true;
        DataSet result = excelReader.AsDataSet();

        foreach (DataTable Table in result.Tables)
        {

            for (int i = 0; i < Table.Rows.Count; i++)
            {
                for (int j = 0; j < Table.Columns.Count; j++)
                {
                    dataGrid1.ItemsSource = new DataView(Table);
                }
            }

        }

这适用于每一列都很好,除了“日期”中的列。

在excel表格中,我在dd.mm.yyyy中指定了日期,但在我的gridview中,我得到的结果是: 42781 ,而不是 15.02.2017

有人知道这个问题的解决方案吗? 感谢

4 个答案:

答案 0 :(得分:3)

我找到了解决方案。更改这两行之后就可以了。

IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream, true);
DataSet result = excelReader.AsDataSet(true);

答案 1 :(得分:2)

当您阅读Excel时,您正在阅读日期的内部表示。 42781是内部表示(日期为1/1/1900)。所以你需要使用DateTime.FromOADate转换为日期。

在你的情况下,我担心你不能按原样捆绑你的桌子。 (顺便说一下,为什么你每次迭代列/行并设置绑定?你只需要绑定一次表。)。无论如何,您可能需要更改表somhow或创建具有转换值的新表。或者可能有某种值转换器可以使用

答案 2 :(得分:1)

您还可以像here所描述的那样计算偏移量。

 public static DateTime FromExcelDate(double value)
 {
     return new DateTime(1899, 12, 30).AddDays(value);
 }

答案 3 :(得分:1)

DataSet result = excelReader.AsDataSet(true);

以上代码行也在转换后(05/23/2017 12:00 AM)给出时间