Я читаю лист 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
Может кто-нибудь, пожалуйста, помогите мне с этим?
можете ли вы отправить демоверсию своего файла excel –
Спасибо за ваш ответ. На самом деле теперь я могу сделать это. [8] = DateTime.FromOADate (double.Parse (lsRow [8])). ToString(); –