Чтение значения даты и времени из листа Excel - PullRequest
79 голосов
/ 27 декабря 2010

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

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

Ответы [ 7 ]

188 голосов
/ 27 декабря 2010

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

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
11 голосов
/ 27 декабря 2010

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

5 голосов
/ 02 июля 2014

Чтение значения Datetime из листа 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");
0 голосов
/ 26 августа 2014

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

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

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

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

0 голосов
/ 28 августа 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]);
        }
    }
}

Надеюсь, это поможет some1 thx_joxin

0 голосов
/ 22 февраля 2013

Кроме того, если ваша ячейка уже является реальной датой, просто используйте .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
0 голосов
/ 27 декабря 2010

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

...