我正在用C#中的Microsoft.Office.Interop.Excel以编程方式读取Excel工作表。 我能够逐行读取它并将每行转换为字符串arrray。然后,我将这些行添加到DataTable中。 除了Excel中的列包含Date值之外,每件事情都可以正常工作,并且当我从Excel Range对象中获取并将其转换为字符串数组时,日期值将转换为某种十进制数。 对于EG-如何在C#Interop中保留Excel单元格格式?
- 如果日期值是“2016年6月4日下午8时十四分39秒”,我得到的值作为“42522.5224305556”
- 如果日期值为“5月27日/ 2016下午一点十分12秒”,我得到的数值为 '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文件演示 –
感谢您的回复。其实现在我可以做到了 - lsRow [8] = DateTime.FromOADate(double.Parse(lsRow [8]))。ToString(); –