7

以下代码从 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

4 回答 4

3

当您阅读 excel 时,您正在阅读日期的内部表示。42781 是内部表示(days sine 1/1/1900)。因此,您需要使用 DateTime.FromOADate 转换为日期。

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

于 2017-01-16T07:52:05.163 回答
3

我找到了解决方案。更改这两行后,它可以工作。

IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream, true);
DataSet result = excelReader.AsDataSet(true);
于 2017-01-16T08:19:11.013 回答
2

          

  DataSet result = excelReader.AsDataSet(true);

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

于 2017-05-23T15:19:08.323 回答
1

您还可以计算此处描述的偏移量。

 public static DateTime FromExcelDate(double value)
 {
     return new DateTime(1899, 12, 30).AddDays(value);
 }
于 2017-03-13T14:46:31.060 回答