2016-06-14 5 views
0

Я читаю лист Excel программно с помощью Microsoft.Office.Interop.Excel в C#. Я могу прочитать его по строкам и преобразовать каждую строку в строку. Затем я добавляю эти строки в DataTable. Все прекрасно работает, за исключением того, что один из столбцов в Excel содержит значения даты, и когда я извлекаю его из объекта Range диапазона Excel и передавая его в строковый массив, значения даты преобразуются в десятичные числа. Для eg-Как сохранить форматы ячеек Excel в C# Interop?

  • Если значение даты «6/4/2016 8:14:39 PM», я получаю значение как «42522,5224305556»
  • Если значение даты «5/27/2016 1:10:12 PM», я получаю значение как '42517,54875'

Ниже мой код-

private System.Data.DataTable GetTicketsFromExcel(string excelFilePath) 
    { 
     System.Data.DataTable dtblTickets = new System.Data.DataTable(); 
     Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Worksheet ws = new Worksheet(); 
     Workbook wb = null; 

     try 
     { 
      wb = excelApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing); 

      ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets.get_Item(1); 
      Range usedRange = ws.UsedRange; 
      Range rowRange; 
      string[] lsRow = null; 

      for (int i = 1; i <= usedRange.Columns.Count; i++) 
      { 
       dtblTickets.Columns.Add(usedRange.Cells[5, i].Value.ToString()); 
      } 

      string sortColumn = "Reported On"; 
      string sortDirection = "DESC"; 
      dtblTickets.Columns[sortColumn].DataType = typeof(DateTime); 

      for (int row = 6; row <= usedRange.Rows.Count; row++) 
      { 
       //dtblTickets.Columns.Add() 
       rowRange = usedRange.Rows[row]; 
       object[,] cellValues = (object[,])rowRange.Value2; 
       lsRow = cellValues.Cast<object>().Select(o => Convert.ToString(o)).ToArray<string>(); 
       dtblTickets.Rows.Add(lsRow.ToArray()); 
      } 
      dtblTickets.DefaultView.Sort = sortColumn + " " + sortDirection; 
      dtblTickets = dtblTickets.DefaultView.ToTable(); 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 
      wb.Close(); 
      excelApp.Quit(); 
      Marshal.ReleaseComObject(ws); 
      Marshal.ReleaseComObject(wb); 
      Marshal.ReleaseComObject(excelApp); 
      ws = null; 
      wb = null; 
      excelApp = null; 
     } 
     return dtblTickets; 
    } 

Пожалуйста примечание

  • Я не хочу использовать OLEDB для чтения и экспорта этой
  • Я хочу, чтобы иметь возможность читать строки Excel по строке (без извлечения каждого значения ячейки и преобразования их)
  • Я не хочу, чтобы преобразовать/форматировать исходные данные документа Excel

Может кто-нибудь, пожалуйста, помогите мне с этим?

+0

можете ли вы отправить демоверсию своего файла excel –

+1

Спасибо за ваш ответ. На самом деле теперь я могу сделать это. [8] = DateTime.FromOADate (double.Parse (lsRow [8])). ToString(); –

ответ

0

Не совсем уверен, если вы хотите решить проблему таким образом, но одним из способов является изменение свойства ячеек (или всей строки или столбца) в Excel.

  • правой кнопкой мыши на ячейке
  • Формат ячеек
  • В разделе «Номер» выберите категории «Текст» для клеток.

Я протестировал его, и это сработало.

+0

Извините, я на самом деле упомянул, что не хочу отформатировать файл Excel вручную. –

 Смежные вопросы

  • Нет связанных вопросов^_^