我正在用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(); –