从 Excel 工作表中读取日期时间值
Posted
技术标签:
【中文标题】从 Excel 工作表中读取日期时间值【英文标题】:Reading Datetime value From Excel sheet 【发布时间】:2010-12-27 11:19:42 【问题描述】:当我试图从 excel 表中读取日期时间类型值时,它返回一个双精度值。例如,如果想像这样读取值 '2007-02-19 14:11:45.730'
,我得到一个双精度类型值。进一步我正在使用转换这个双精度值时间跨度,但没有成功完成,因为我只得到这个值'2007-02-19 12:00:00 AM'
现在我想要与第一个完全相同的日期时间值。我的代码是这样的:-
TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);
DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);
arrrow2[cCnt - 1] = inputdate.ToString();
请帮忙!!! 谢谢。
【问题讨论】:
【参考方案1】:您需要使用 DateTime.FromOADate 将日期格式从 OLE 自动化转换为 .net 格式。
double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
【讨论】:
您也愿意投票赞成答案并将其标记为正确吗? 投票需要 15 个声望,但我只有 6 个,因为我是新用户,但我已将答案标记为正确。 +1 显然,支持投票的限制不应适用于自己的问题。 我明白这一点。只是指出并非所有人都同意您的这种行为是一个错误。 这是我找到的最简单的方法。谢谢。【参考方案2】:或许您可以尝试使用DateTime.FromOADate
方法在 Excel 和 .net 之间进行转换。
【讨论】:
【参考方案3】:从 Excel 表中读取日期时间值:试试这个会起作用。
string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();
double date = double.Parse(sDate);
var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");
【讨论】:
顺便问一下您的代码与接受的答案有何不同? 投反对票。这是低效的,因为当单元格是日期时,Value2
返回一个装箱的 double
值。【参考方案4】:
或者您可以简单地使用 OleDbDataAdapter 从 Excel 获取数据
【讨论】:
【参考方案5】:或者,如果您的单元格已经是真实日期,只需使用 .Value 而不是 .Value2:
excelApp.Range[namedRange].Value
21/02/2013 00:00:00
Date: 21/02/2013 00:00:00
Day: 21
DayOfWeek: Thursday
DayOfYear: 52
Hour: 0
Kind: Unspecified
Millisecond: 0
Minute: 0
Month: 2
Second: 0
Ticks: 634970016000000000
TimeOfDay: 00:00:00
Year: 2013
excelApp.Range[namedRange].Value2
41326.0
【讨论】:
我认为它比这更复杂一些。如果您将DateTime
写到Value
,Value
将返回DateTime
,但如果您将DateTime
写到Value2
,则返回double
。【参考方案6】:
我有类似的情况,我使用下面的代码来完成这个工作..
Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);
Workbook workbook = new Workbook(fstream, loadOptions);
Worksheet worksheet = workbook.Worksheets[0];
dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);
DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();
foreach (DataColumn column in dtCloned.Columns)
if (column.DataType == Type.GetType("System.DateTime"))
column.DataType = typeof(String);
myAL.Add(column.ColumnName);
foreach (DataRow row in dt.Rows)
dtCloned.ImportRow(row);
foreach (string colName in myAL)
dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
/*******************************/
public static class MyExtension
public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
foreach (DataRow row in column.Table.Rows)
row[column] = conversion(row[column]);
希望这对某些人有所帮助1 thx_joxin
【讨论】:
使用此答案需要 Aspose.Cells 产品的许可证和相关安装。这是一款很棒的产品,但并非所有开发人员都可以使用。【参考方案7】:您可能想尝试我在另一个 thread 上发布的与从 Excel 表读取日期值相关的简单功能。
它只是将单元格中的文本作为输入并将 DateTime 作为输出。
我很高兴看到为 .Net 开发社区的利益而提供的示例代码有所改进。
这里是线程C# not reading excel date from spreadsheet的链接
【讨论】:
【参考方案8】:另一种选择:当单元格类型在编译时未知并且单元格被格式化为日期Range.Value
时,返回所需的DateTime
对象。
public static DateTime? GetAsDateTimeOrDefault(Range cell)
object cellValue = cell.Value;
if (cellValue is DateTime result)
return result;
return null;
【讨论】:
以上是关于从 Excel 工作表中读取日期时间值的主要内容,如果未能解决你的问题,请参考以下文章
比较从 Windows 窗体中的 TextBox 获得的日期值与 Excel 表中存储的日期值
使用 VBA 在 Excel 中将日期与数据连接日期进行比较
如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)