Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Excel工作表读取日期时间值_C#_Excel_Office Interop - Fatal编程技术网

C# 从Excel工作表读取日期时间值

C# 从Excel工作表读取日期时间值,c#,excel,office-interop,C#,Excel,Office Interop,当我试图从excel工作表中读取datetime类型值时,它返回一个双精度值。例如,如果希望像这样读取值'2007-02-19 14:11:45.730',我将得到一个双精度值。此外,我使用timespan转换这个双精度值,但未成功完成,因为我仅获取此值'2007-02-19 12:00:00 am' 现在我想要和第一个完全相同的datetime值。我的代码如下:- TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cell

当我试图从excel工作表中读取datetime类型值时,它返回一个双精度值。例如,如果希望像这样读取值
'2007-02-19 14:11:45.730'
,我将得到一个双精度值。此外,我使用timespan转换这个双精度值,但未成功完成,因为我仅获取此值
'2007-02-19 12:00:00 am'

现在我想要和第一个完全相同的datetime值。我的代码如下:-

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();
请帮忙!!!
谢谢。

也许您可以尝试使用该方法在Excel和.net之间进行转换。

您需要使用DateTime.FromOADate将日期格式从OLE Automation转换为.net格式

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

或者,您可以简单地使用OleDbDataAdapter从Excel获取数据。或者,如果您的单元格已经是实际日期,只需使用.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

我也遇到过类似的情况,我使用下面的代码来实现这一点

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]);
        }
    }
}
Aspose.Cells.LoadOptions LoadOptions=新的Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);
工作簿=新工作簿(fstream、loadOptions);
工作表=工作簿。工作表[0];
dt=工作表.Cells.ExportDataTable(0,0,工作表.Cells.MaxDisplayRange.RowCount,工作表.Cells.MaxDisplayRange.ColumnCount,true);
DataTable DTClone=dt.Clone();
ArrayList myAL=新的ArrayList();
foreach(dtclone.Columns中的DataColumn列)
{
if(column.DataType==Type.GetType(“System.DateTime”))
{
column.DataType=typeof(字符串);
myAL.Add(column.ColumnName);
}
}
foreach(数据行中的数据行)
{
dtc.ImportRow(行);
}
foreach(myAL中的字符串colName)
{
dtCloned.Columns[colName].Convert(val=>DateTime.Parse(Convert.ToString(val)).ToString(“MMMM-dd,yyyy”);
}
/*******************************/
公共静态类MyExtension
{
公共静态无效转换(此DataColumn列,Func转换)
{
foreach(column.Table.Rows中的DataRow行)
{
行[列]=转换(行[列]);
}
}
}
希望这能有所帮助
thx_joxin

从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");

您可能想尝试一下我在另一个网站上发布的简单函数,该函数与从excel工作表中读取日期值有关

它只是将单元格中的文本作为输入,并将DateTime作为输出

我很高兴看到为.Net开发社区提供的示例代码有所改进


这是线程的链接另一个选项:当单元格类型在编译时未知且单元格格式为日期范围时。Value返回所需的日期时间对象


公共静态日期时间?GetAsDateTimeOrDefault(范围单元格)
{
对象cellValue=cell.Value;
if(cellValue为日期时间结果)
{
返回结果;
}
返回null;
}

请您投票支持答案并将其标记为正确答案好吗?投票支持需要15个声誉,但我只有6个,因为我是新用户,但我已将答案标记为正确答案。+1显然,投票限制不应适用于个人问题。我理解这一点。只是要指出,不是每个人都会同意你,这种行为是一个错误。这是我发现的最简单的方法。谢谢你,我觉得比那复杂一点<如果将
DateTime
写入
Value
则code>Value将返回
DateTime
,但如果将
DateTime
写入
Value2
则返回
double
。顺便问一下,您的代码与公认答案有什么不同?被否决。这是低效的,因为当单元格为date时,
Value2
返回一个装箱的
double
值。使用此答案需要获得Aspose.Cells产品的许可证和相关安装。这是一个很棒的产品,但不是所有开发人员都可以访问的。