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.
c#
excel
office-interop
Pranav
fonte
fonte
Talvez você possa tentar usar o
DateTime.FromOADate
método para converter entre Excel e .net.fonte
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");
fonte
Value2
retorna umdouble
valor em caixa .Ou você pode simplesmente usar OleDbDataAdapter para obter dados do Excel
fonte
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
fonte
Value
retornará aDateTime
se você escreveu umDateTime
para,Value
mas adouble
se escreveu umDateTime
paraValue2
.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
fonte
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
fonte
Outra opção: quando o tipo de célula é desconhecido no momento da compilação e a célula é formatada como Date
Range.Value
retorna umDateTime
objeto desejado .public static DateTime? GetAsDateTimeOrDefault(Range cell) { object cellValue = cell.Value; if (cellValue is DateTime result) { return result; } return null; }
fonte