Lendo o valor Datetime da planilha do Excel

87

quando estou tentando ler o valor do tipo datetime da planilha do Excel, ele está retornando um valor duplo. Por exemplo, se quiser ler um valor '2007-02-19 14:11:45.730'como este, estou obtendo um valor do tipo duplo. Além disso, estou convertendo este valor duplo usando o intervalo de tempo, mas não concluí com sucesso porque estou obtendo apenas este valor '2007-02-19 12:00:00 AM'
agora, eu quero exatamente o mesmo valor de data e hora do primeiro. Meu código é como: -

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

Por favor ajude!!! Obrigado.

Pranav
fonte

Respostas:

222

Você precisa converter o formato de data da automação OLE para o formato .net usando DateTime.FromOADate.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);
Mikael Svenson
fonte
1
Você também faria a gentileza de votar a resposta e marcá-la como correta?
Mikael Svenson
votar requer 15 de reputação, mas tenho apenas 6, pois sou um novo usuário, mas marquei a resposta como correta.
Pranav
4
+1 Claramente, a restrição para votos positivos não deve se aplicar às próprias perguntas.
Mike Rosenblum
1
Eu entendi isso. Apenas apontar que nem todos concordariam com você que esse comportamento é um bug.
jwg
1
Esta é a maneira mais fácil que encontrei. Obrigado.
Ashok
13

Talvez você possa tentar usar o DateTime.FromOADatemétodo para converter entre Excel e .net.

Tom
fonte
6

Lendo o valor Datetime da planilha do Excel: Tente isso vai funcionar.

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");
Desenvolvedor de software Yashwant
fonte
4
A propósito, como o seu código difere da resposta aceita?
Pranav
Votos negativos. Isso é ineficiente, porque quando a célula é data, Value2retorna um doublevalor em caixa .
dbardakov
0

Ou você pode simplesmente usar OleDbDataAdapter para obter dados do Excel

rsapru
fonte
0

Como alternativa, se sua célula já for uma data real, use .Value em vez de .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
Thomas
fonte
1
Acho que é um pouco mais complicado do que isso. Valueretornará a DateTimese você escreveu um DateTimepara, Valuemas a doublese escreveu um DateTimepara Value2.
jwg
0

Eu tive uma situação semelhante e usei o código abaixo para fazer isso funcionar.

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

Espero que isso ajude algum1 thx_joxin

joXin
fonte
2
O uso desta resposta requer uma licença e instalação associada do produto Aspose.Cells. Este é um ótimo produto, mas não algo ao qual todos os desenvolvedores tenham acesso.
Zarepheth
0

Você pode querer experimentar a função simples que postei em outro tópico relacionado à leitura do valor da data na planilha do Excel.

Ele simplesmente pega o texto da célula como entrada e fornece DateTime como saída.

Eu ficaria feliz em ver melhorias em meu código de exemplo fornecido para o benefício da comunidade de desenvolvimento .Net.

Aqui está o link para o tópico C # sem ler a data do Excel na planilha

Kasim Husaini
fonte
0

Outra opção: quando o tipo de célula é desconhecido no momento da compilação e a célula é formatada como Date Range.Valueretorna um DateTimeobjeto desejado .


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