Зчитування значення часу та часу з аркуша Excel


87

коли я намагаюся прочитати значення типу datetime з аркуша Excel, він повертає подвійне значення. наприклад, якщо я хочу прочитати таке значення '2007-02-19 14:11:45.730', я отримую подвійне значення типу. тому що зараз я отримую лише це значення, '2007-02-19 12:00:00 AM'
я хочу точно таке ж значення дати і часу, як і перше. Мій код такий: -

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

Будь ласка, допоможіть!!! Дякую.

Відповіді:


222

Вам потрібно перетворити формат дати з OLE Automation у формат .net за допомогою DateTime.FromOADate.

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

1
Чи могли б Ви також проголосувати відповідь і позначити її як правильну?
Mikael Svenson

для голосування потрібно 15 репутації, але у мене лише 6, оскільки я новий користувач, але я позначив відповідь як правильну.
Пранав

4
+1 Очевидно, обмеження щодо голосування не повинні поширюватися на власні запитання.
Mike Rosenblum

1
Я це зрозумів. Тільки вказуючи на те, що не всі погоджуються з вами, така поведінка є помилкою.
jwg

1
Це найпростіший спосіб, який я знайшов. Дякую.
Ашок


6

Зчитування значення часу та часу з аркуша Excel: Спробуйте це буде працювати.

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
До речі, чим ваш код відрізняється від прийнятої відповіді?
Пранав

Проголосовано проти. Це неефективно, тому що коли клітинка є датою, Value2повертає позначене в поле doubleзначення.
dbardakov

0

Або ви можете просто використовувати OleDbDataAdapter для отримання даних з Excel


0

Якщо ж у вашій комірці вже є справжня дата, просто використовуйте .Value замість .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
Я думаю, це трохи складніше, ніж це. Valueповерне а, DateTimeякщо ви написали DateTimeдо, Valueале doubleякщо ви написали DateTimeдо Value2.
jwg

0

у мене була подібна ситуація, і я використовував наведений нижче код для отримання цього.

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

Сподіваюся, це допомагає some1 thx_joxin


2
Для використання цієї відповіді потрібна ліцензія та відповідне встановлення продукту Aspose.Cells. Це чудовий продукт, але не те, до чого мають доступ усі розробники.
Зарефет

0

Можливо, ви захочете спробувати просту функцію, яку я розмістив в іншому ланцюжку, пов’язаному зі зчитуванням значення дати з аркуша Excel.

Він просто бере текст із комірки як вхідний сигнал і надає DateTime як вихідний.

Я був би радий бачити вдосконалення мого зразка коду, наданого на благо спільноти розробників .Net.

Ось посилання на потік C #, який не читає дату Excel з електронної таблиці


0

Інший варіант: коли тип комірки невідомий під час компіляції, і комірка відформатована як Date Range.Valueповертає бажаний DateTimeоб'єкт.


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.