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.
c#
excel
office-interop
Pranav
źródło
źródło
Być może mógłbyś spróbować użyć
DateTime.FromOADate
metody konwersji między Excelem i .net.źródło
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");
źródło
Value2
zwracadouble
wartość w pudełku .Możesz też po prostu użyć OleDbDataAdapter, aby pobrać dane z programu Excel
źródło
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
źródło
Value
zwróciDateTime
Jeśli napisałeśDateTime
doValue
aledouble
jeśli napisałDateTime
doValue2
.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
źródło
Możesz wypróbować prostą funkcję, którą zamieściłem w innym wątku związanym z odczytem wartości daty z arkusza Excela.
Po prostu pobiera tekst z komórki jako dane wejściowe i podaje datę i godzinę jako dane wyjściowe.
Byłbym szczęśliwy, widząc ulepszenia w moim przykładowym kodzie dostarczonym na rzecz społeczności programistów .Net.
Oto link do wątku C # nie odczytującego daty programu Excel z arkusza kalkulacyjnego
źródło
Inna opcja: gdy typ komórki jest nieznany w czasie kompilacji, a komórka jest sformatowana jako Data
Range.Value
zwraca żądanyDateTime
obiekt.public static DateTime? GetAsDateTimeOrDefault(Range cell) { object cellValue = cell.Value; if (cellValue is DateTime result) { return result; } return null; }
źródło