Lesen des Datetime-Werts aus einer Excel-Tabelle

87

Wenn ich versuche, den Wert vom Typ Datum / Uhrzeit aus der Excel-Tabelle zu lesen '2007-02-19 14:11:45.730', wird ein doppelter Wert zurückgegeben. Wenn Sie beispielsweise einen Wert wie diesen lesen möchten, erhalte ich einen doppelten Wert. Außerdem konvertiere ich diesen doppelten Wert mithilfe der Zeitspanne, aber nicht erfolgreich weil ich '2007-02-19 12:00:00 AM'
jetzt nur diesen Wert bekomme, möchte ich genau den gleichen Datum / Uhrzeit-Wert wie der erste. Mein Code lautet wie folgt: -

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

Bitte helfen Sie !!! Vielen Dank.

Pranav
quelle

Antworten:

220

Sie müssen das Datumsformat von OLE Automation mithilfe von DateTime.FromOADate in das .net-Format konvertieren.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
Mikael Svenson
quelle
1
Würden Sie auch freundlich sein, die Antwort abzustimmen und als richtig zu markieren?
Mikael Svenson
Abstimmung erfordert 15 Ruf, aber ich habe nur 6, da ich neuer Benutzer bin, aber ich habe die Antwort als richtig markiert.
Pranav
4
+1 Natürlich sollte die Einschränkung für das Upvoting nicht für die eigenen Fragen gelten.
Mike Rosenblum
1
Ich habe das verstanden. Nur darauf hinzuweisen, dass nicht jeder Ihnen zustimmen würde, ist ein Fehler.
JWG
1
Dies ist der einfachste Weg, den ich gefunden habe. Danke dir.
Ashok
13

Vielleicht könnten Sie versuchen, mit dieser DateTime.FromOADateMethode zwischen Excel und .net zu konvertieren.

Tom
quelle
6

Lesen des Datetime-Werts aus einer Excel-Tabelle: Versuchen Sie, dass dies funktioniert.

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");
Yashwant Softwareentwickler
quelle
4
Übrigens, wie unterscheidet sich Ihr Code von der akzeptierten Antwort?
Pranav
Abgestimmt. Dies ist ineffizient, da bei einem Datum der Zelle Value2ein Boxwert zurückgegeben doublewird.
Dbardakov
0

Oder Sie können einfach OleDbDataAdapter verwenden, um Daten aus Excel abzurufen

rsapru
quelle
0

Wenn Ihre Zelle bereits ein echtes Datum ist, verwenden Sie alternativ einfach .Value anstelle von .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
quelle
1
Ich denke, es ist etwas komplizierter. Valuegibt ein zurück, DateTimewenn Sie ein DateTimean geschrieben haben, Valueaber ein, doublewenn Sie ein DateTimean geschrieben haben Value2.
JWG
0

Ich hatte eine ähnliche Situation und habe den folgenden Code verwendet, um dies zum Laufen zu bringen.

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

Hoffe das hilft some1 thx_joxin

JoXin
quelle
2
Die Verwendung dieser Antwort erfordert eine Lizenz und die damit verbundene Installation des Aspose.Cells-Produkts. Dies ist ein großartiges Produkt, auf das jedoch nicht alle Entwickler Zugriff haben.
Zarepheth
0

Vielleicht möchten Sie die einfache Funktion ausprobieren, die ich in einem anderen Thread gepostet habe zum Lesen des Datumswerts aus dem Excel-Blatt .

Es nimmt einfach Text aus der Zelle als Eingabe und gibt DateTime als Ausgabe.

Ich würde mich freuen, wenn mein Beispielcode zugunsten der .Net-Entwicklergemeinschaft verbessert würde.

Hier ist der Link für den Thread C #, der das Excel-Datum nicht aus der Tabelle liest

Kasim Husaini
quelle
0

Eine weitere Option: Wenn der Zelltyp zur Kompilierungszeit unbekannt ist und die Zelle so formatiert ist, dass Datum Range.Valueein gewünschtes DateTimeObjekt zurückgibt .


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