Odczytywanie wartości daty i godziny z arkusza Excel


89

kiedy próbuję odczytać wartość typu datetime z arkusza programu Excel, zwraca podwójną wartość. na przykład, jeśli chcesz odczytać wartość w '2007-02-19 14:11:45.730'ten sposób, otrzymuję wartość podwójnego typu. ponadto konwertuję tę podwójną wartość za pomocą przedziału czasu, ale nie zakończono pomyślnie ponieważ otrzymuję tylko tę wartość, '2007-02-19 12:00:00 AM'
teraz chcę dokładnie taką samą wartość daty i godziny jak pierwsza. Mój kod jest taki: -

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

Proszę pomóż!!! Dzięki.

Odpowiedzi:


226

Musisz przekonwertować format daty z automatyzacji OLE na format .net przy użyciu DateTime.FromOADate.

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

1
Czy byłbyś uprzejmy, aby zagłosować na odpowiedź i oznaczyć ją jako poprawną?
Mikael Svenson

głos w górę wymaga 15 punktów reputacji, ale jako nowy użytkownik mam tylko 6, ale oznaczyłem odpowiedź jako poprawną.
Pranav

5
+1 Oczywiście ograniczenie dotyczące głosowania za nie powinno mieć zastosowania do własnych pytań.
Mike Rosenblum

1
Zrozumiałem to. Samo wskazanie, że nie wszyscy by się z tobą zgodzili, to błąd.
jwg

1
To najłatwiejszy sposób, jaki znalazłem. Dziękuję Ci.
Ashok,


6

Odczytywanie wartości daty i godziny z arkusza Excel: Spróbuj to zadziała.

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
Swoją drogą, czym różni się Twój kod od zaakceptowanej odpowiedzi?
Pranav

Głosowano w dół. Jest to nieefektywne, ponieważ gdy komórka jest datą, Value2zwraca doublewartość w pudełku .
dbardakov

0

Możesz też po prostu użyć OleDbDataAdapter, aby pobrać dane z programu Excel


0

Alternatywnie, jeśli twoja komórka jest już prawdziwą datą, po prostu użyj .Value zamiast .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
Myślę, że to trochę bardziej skomplikowane. Valuezwróci DateTimeJeśli napisałeś DateTimedo Valueale doublejeśli napisał DateTimedo Value2.
jwg

0

Miałem podobną sytuację i użyłem poniższego kodu, aby to zadziałało.

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

Mam nadzieję, że to pomoże niektórym1 thx_joxin


2
Użycie tej odpowiedzi wymaga posiadania licencji i związanej z tym instalacji produktu Aspose.Cells. To świetny produkt, ale nie jest to coś, do czego wszyscy programiści mają dostęp.
Zarepheth


0

Inna opcja: gdy typ komórki jest nieznany w czasie kompilacji, a komórka jest sformatowana jako Data Range.Valuezwraca żądany DateTimeobiekt.


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.