Lettura del valore Datetime dal foglio Excel


89

quando provo a leggere il valore del tipo datetime dal foglio Excel, restituisce un valore doppio.Ad esempio, se si desidera leggere un valore '2007-02-19 14:11:45.730'come questo, ottengo un valore di tipo doppio. inoltre sto convertendo questo valore doppio utilizzando l'intervallo di tempo, ma non completo correttamente perché sto ottenendo solo questo valore '2007-02-19 12:00:00 AM'
ora voglio esattamente lo stesso valore datetime del primo. Il mio codice è come: -

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

Per favore aiuto!!! Grazie.

Risposte:


226

È necessario convertire il formato della data da automazione OLE nel formato .net utilizzando DateTime.FromOADate.

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

1
Saresti anche gentile a votare la risposta e contrassegnarla come corretta?
Mikael Svenson

votare richiede 15 punti reputazione ma ne ho solo 6 perché sono un nuovo utente, ma ho contrassegnato la risposta come corretta.
Pranav

4
+1 Chiaramente la restrizione per il voto positivo non dovrebbe applicarsi alle proprie domande.
Mike Rosenblum

1
Io ho capito quello. Sottolineo solo che non tutti sarebbero d'accordo con te che questo comportamento è un bug.
jwg

1
Questo è il modo più semplice che ho trovato. Grazie.
Ashok


6

Lettura del valore Datetime dal foglio Excel: Prova questo funzionerà.

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

4
A proposito, in che modo il tuo codice differisce dalla risposta accettata?
Pranav

Downvoted. Questo è inefficiente, perché quando la cella è data, Value2restituisce un doublevalore boxed .
dbardakov

0

Oppure puoi semplicemente usare OleDbDataAdapter per ottenere dati da Excel


0

In alternativa, se la tua cella è già una data reale, usa semplicemente .Value invece di .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

1
Penso che sia un po 'più complicato di così. Valuerestituirà a DateTimese hai scritto DateTimea Valuema a doublese hai scritto a DateTimea Value2.
jwg

0

ho avuto una situazione simile e ho usato il codice seguente per farlo funzionare ..

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

Spero che questo aiuti qualcuno1 thx_joxin


2
L'utilizzo di questa risposta richiede una licenza e l'installazione associata del prodotto Aspose.Cells. Questo è un ottimo prodotto, ma non qualcosa a cui tutti gli sviluppatori hanno accesso.
Zarepheth,

0

Potresti provare una semplice funzione che ho pubblicato su un altro thread relativo alla lettura del valore della data dal foglio Excel.

Prende semplicemente il testo dalla cella come input e fornisce DateTime come output.

Sarei felice di vedere un miglioramento nel mio codice di esempio fornito a beneficio della comunità di sviluppo .Net.

Ecco il collegamento per il thread C # che non legge la data di Excel dal foglio di calcolo


0

Un'altra opzione: quando il tipo di cella è sconosciuto al momento della compilazione e la cella è formattata come Date Range.Valuerestituisce un DateTimeoggetto desiderato .


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.