Lectura del valor de fecha y hora de la hoja de Excel

87

cuando intento leer el valor del tipo de fecha y hora de la hoja de Excel, está devolviendo un valor doble. por ejemplo, si quiero leer un valor '2007-02-19 14:11:45.730'como este, obtengo un valor de tipo doble. '2007-02-19 12:00:00 AM'
Como solo obtengo este valor, ahora quiero exactamente el mismo valor de fecha y hora que el primero. Mi código es como: -

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();

¡¡¡Por favor ayuda!!! Gracias.

Pranav
fuente

Respuestas:

222

Debe convertir el formato de fecha de Automatización OLE al formato .net utilizando DateTime.FromOADate.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
Mikael Svenson
fuente
1
¿También sería amable de votar la respuesta y marcarla como correcta?
Mikael Svenson
votar requiere 15 de reputación, pero solo tengo 6 ya que soy un usuario nuevo, pero he marcado la respuesta como correcta.
Pranav
4
+1 Claramente, la restricción para votar a favor no debería aplicarse a las propias preguntas.
Mike Rosenblum
1
Lo entendí. Solo señalar que no todos estarían de acuerdo contigo en este comportamiento es un error.
jwg
1
Esta es la forma más fácil que encontré. Gracias.
Ashok
6

Lectura del valor de fecha y hora de la hoja de Excel: intente que esto funcione.

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");
Desarrollador de software Yashwant
fuente
4
Por cierto, ¿en qué se diferencia su código de la respuesta aceptada?
Pranav
Voto en contra. Esto es ineficiente, porque cuando la celda es fecha, Value2devuelve un doublevalor en caja .
dbardakov
0

O simplemente puede usar OleDbDataAdapter para obtener datos de Excel

rsapru
fuente
0

Alternativamente, si su celda ya es una fecha real, simplemente use .Value en lugar de .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
Thomas
fuente
1
Creo que es un poco más complicado que eso. Valuedevolverá a DateTimesi escribió DateTimea Valuepero a doublesi escribió DateTimea Value2.
jwg
0

Tuve una situación similar y utilicé el siguiente código para que esto funcione.

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]);
        }
    }
}

Espero que esto ayude a algunos1 thx_joxin

joXin
fuente
2
El uso de esta respuesta requiere una licencia y la instalación asociada del producto Aspose.Cells. Este es un gran producto, pero no es algo al que todos los desarrolladores tengan acceso.
Zarepheth
0

Es posible que desee probar la función simple que publiqué en otro hilo relacionado con la lectura del valor de la fecha de la hoja de Excel.

Simplemente toma texto de la celda como entrada y da DateTime como salida.

Me complacería ver una mejora en mi código de muestra proporcionado para beneficio de la comunidad de desarrollo .Net.

Aquí está el enlace para el hilo C # que no lee la fecha de Excel de la hoja de cálculo

Kasim Husaini
fuente
0

Otra opción: cuando se desconoce el tipo de celda en el momento de la compilación y la celda está formateada, la fecha Range.Valuedevuelve un DateTimeobjeto deseado .


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
dbardakov
fuente