Чтение значения Datetime из листа Excel

когда я пытаюсь прочитать значение типа 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();

Пожалуйста помоги!!! Спасибо.


person Pranav    schedule 27.12.2010    source источник


Ответы (8)


Вам необходимо преобразовать формат даты из OLE Automation в формат .net с помощью DateTime.FromOADate.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
person Mikael Svenson    schedule 27.12.2010
comment
Не могли бы вы также проголосовать за ответ и отметить его как правильный? - person Mikael Svenson; 27.12.2010
comment
Для голосования требуется 15 репутации, но у меня только 6, поскольку я новый пользователь, но я пометил ответ как правильный. - person Pranav; 28.12.2010
comment
+1 Понятно, что ограничение на голосование не должно распространяться на собственные вопросы. - person Mike Rosenblum; 29.12.2010
comment
Я понял это. Просто указание на то, что не все согласятся с вами, такое поведение является ошибкой. - person jwg; 03.06.2013
comment
Я нормально получаю ответ как принятый. Не обязательно голосование + ответ. Но я голосую за ответы, которые считаю правильными на свои вопросы. Дело не только в очках :) - person Mikael Svenson; 03.06.2013
comment
приведенный выше фрагмент отлично работает, если я ввожу в ячейку числа и дату. Как проверить, ввел ли пользователь строку в ячейку? он конвертируется в какую-то дату в 1900 году .. вместо этого мне нужно проверить перед преобразованием. попытался использовать DateTime.Tryparse, но не повезло. - person renuka; 09.12.2013
comment
@renuka, каково ваше определение строки? Вы можете проверить тип форматирования ячейки для одного или создать какое-либо правило проверки, если оно содержит определенные символы или если возвращенная дата отличается от ожидаемой. - person Mikael Svenson; 09.12.2013
comment
Это устраняет ошибку Excel с 1900 годом? - person user3111311; 21.05.2014
comment
Я получаю FormatException при преобразовании значения даты excel в String или InvalidCastException при преобразовании значения даты excel в Double. - person Vikrant; 23.08.2015
comment
@vikrant попробуй добавить в парсинг CultureInfo. Проверьте использование. и в анализируемом значении. - person Mikael Svenson; 23.08.2015
comment
@MikaelSvenson: DateTime.FromOADate(Double.Parse(ws.Cells[r, 1].Value.ToString(), CultureInfo.InvariantCulture)); - это то, что я пробовал, но все еще получаю FormatException: входная строка имеет неправильный формат - person Vikrant; 24.08.2015
comment
@Vikrant Возможно, сначала запишите значение и изучите его перед синтаксическим анализом. Это поможет вам использовать правильную культуру. - person Mikael Svenson; 24.08.2015
comment
Это самый простой способ, который я нашел. Спасибо. - person Ashok; 10.07.2017
comment
Если я хочу добавить такую ​​же преобразованную переменную для поиска элементов - ›SendKeys, может ли кто-нибудь помочь мне? - person Nisarg Patel; 04.08.2017

Возможно, вы могли бы попробовать использовать метод DateTime.FromOADate для преобразования между Excel и .net.

person Tom    schedule 27.12.2010

Чтение значения даты и времени из таблицы 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");
person Yashwant Software Developer    schedule 02.07.2014
comment
Кстати, чем ваш код отличается от принятого ответа? - person Pranav; 02.07.2014
comment
Проголосовали против. Это неэффективно, потому что, когда ячейка является датой, Value2 возвращает упакованное double значение. - person dbardakov; 29.11.2019

Или вы можете просто использовать OleDbDataAdapter для получения данных из Excel

person rsapru    schedule 27.12.2010

В качестве альтернативы, если в вашей ячейке уже есть настоящая дата, просто используйте .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
person Thomas    schedule 22.02.2013
comment
Я думаю, что это немного сложнее. Value вернет DateTime, если вы написали DateTime для Value, но double, если вы написали DateTime Value2. - person jwg; 23.05.2013

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

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

Надеюсь, это поможет кому-то thx_joxin

person joXin    schedule 28.08.2013
comment
Для использования этого ответа требуется лицензия и соответствующая установка продукта Aspose.Cells. Это отличный продукт, но доступ к нему есть не у всех разработчиков. - person Zarepheth; 28.08.2014

Вы можете попробовать простую функцию, которую я опубликовал на другом тема, связанная с чтением значения даты из таблицы Excel.

Он просто берет текст из ячейки как ввод и выдает DateTime как вывод.

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

Вот ссылка на ветку C # не читает дату Excel из таблицы

person Kasim Husaini    schedule 26.08.2014

Другой вариант: когда тип ячейки неизвестен во время компиляции, а ячейка отформатирована как Date Range.Value, возвращает желаемый объект DateTime.


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