ExcelDataReader 数据类型 "date" 已转换
ExcelDataReader Datatype "date" gets transformed
以下代码从 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);
}
}
}
这对每一列都适用,除了带有 "dates" 的列。
在 excel table 中,我在 dd.mm.yyyy 中指定了日期,但在我的 gridview 中,我得到的是:42781 而不是 15.02.2017.
有人知道这个问题的解决方案吗?
谢谢
当您阅读 excel 时,您正在阅读日期的内部表示。
42781 是内部表示(天正弦 1/1/1900)。因此,您需要使用 DateTime.FromOADate.
转换为日期
对于您的情况,恐怕您无法按原样绑定 table。 (顺便说一句,你为什么要遍历 columns/rows 并每次都设置绑定?你只需要绑定一次 table。)。无论如何,您可能需要更改 table somhow 或创建一个具有转换值的新 table。或者可能有某种你可以使用的值转换器
我找到了解决办法。更改这两行后它起作用了。
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream, true);
DataSet result = excelReader.AsDataSet(true);
您也可以像 here 中描述的那样计算偏移量。
public static DateTime FromExcelDate(double value)
{
return new DateTime(1899, 12, 30).AddDays(value);
}
DataSet result = excelReader.AsDataSet(true);
以上代码行也在转换后给出时间 (05/23/2017 12:00 AM)
以下代码从 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);
}
}
}
这对每一列都适用,除了带有 "dates" 的列。
在 excel table 中,我在 dd.mm.yyyy 中指定了日期,但在我的 gridview 中,我得到的是:42781 而不是 15.02.2017.
有人知道这个问题的解决方案吗? 谢谢
当您阅读 excel 时,您正在阅读日期的内部表示。 42781 是内部表示(天正弦 1/1/1900)。因此,您需要使用 DateTime.FromOADate.
转换为日期对于您的情况,恐怕您无法按原样绑定 table。 (顺便说一句,你为什么要遍历 columns/rows 并每次都设置绑定?你只需要绑定一次 table。)。无论如何,您可能需要更改 table somhow 或创建一个具有转换值的新 table。或者可能有某种你可以使用的值转换器
我找到了解决办法。更改这两行后它起作用了。
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream, true);
DataSet result = excelReader.AsDataSet(true);
您也可以像 here 中描述的那样计算偏移量。
public static DateTime FromExcelDate(double value)
{
return new DateTime(1899, 12, 30).AddDays(value);
}
DataSet result = excelReader.AsDataSet(true);
以上代码行也在转换后给出时间 (05/23/2017 12:00 AM)