C#這樣讀取Excel日期時有問題:
Excel.ApplicationClass excel=new Excel.ApplicationClass();
excel.Application.Workbooks.Open(@"E:\MFGP\ar20061220.xls",new object[]{3} ,new object[]{false},new object[]{5},new object[]{""},new object[]{""},new object[]{false},Excel.XlPlatform.xlWindows,null,new object[]{false},new object[]{true},Excel.XlFileFormat.xlExcel9795,new
object[]{true},new object[]{true},new object[]{true});
range=(Excel.Range)excel.Cells[1,2];
Messagebox.Show(range.Value2.ToString());
爲什麼讀出來是一個數值,如2008-08-08讀出來是39688,怎樣才能讀出來是日期格式。
-------------------------------
在EXCEL中把你的日期列的格式設置一下,
設成"文本"型,就不會這樣了
-------------------------------
在讀excel日期的時候,如果單元格格式設置爲date,那麼就要注意:這裏要做一個判斷,如果該單元格是一個double值,那麼就要用 DateTime.FromOADate(double.Parse(range.Value2.ToString()));方法獲得時間;如果就是一個時間,那麼就直接DateTime.Parse(range.Value2.ToString());就可以了。至於爲什麼要做這個判斷,是因爲我做這個的時候發現這個日期值今天讀的時候是一個日期值,而第二天就讀出來一個double值。我也不知道爲什麼。
請參考:
http://msdn.microsoft.com/zh-cn/vcsharp/system.datetime.fromoadate.aspx
C#讀取Excel單元格中的日期
今天寫一小程序用來分析某Excel報表,結果在處理日期的時候蛋疼了。
原Excel是這樣的:
Excel加載到DataTable以後,日期都變成了這個樣子:
看起來很像某偏移量。當然也有一部分日期是正常的:
我嘗試用DateTime.Parse直接匹配,結果爆掉了。於是查了下MSDN找到了正確的辦法:DateTime.FromOADate(double d) 方法:
d 參數是一個雙精度浮點數字,它將日期表示爲基礎日期(1899 年 12 月 30 日午夜)之前或之後的天數。 d 的符號和整數部分將日期編碼爲相對於 1899 年 12 月 30 日的正負日偏移量,而 d 的小數部分的絕對值將當天的時間編碼爲相對於午夜的小數日偏移量。d 必須爲負 657435.0 到正 2958466.0 之間的值。
根據我的Excel,我封裝了一下轉換函數,如下:
01 | privateDateTime ConvertExcelDateTimeIntoCLRDateTime(objectvalue) |
02 | { |
03 | if(value isDateTime) |
04 | { |
05 | returnDateTime.Parse(value.ToString()); |
06 | } |
07 | else |
08 | { |
09 | stringdt = DateTime.FromOADate(Convert.ToInt32(value)).ToString("d"); |
10 | returnDateTime.Parse(dt); |
11 | } |
12 | } |
這個函數首先判斷日期是否能直接轉換,因爲我需要處理上圖中F12列這樣的日期。如果不能識別,就調用FromOADate(),將偏移量轉換爲日期。
於是就OK了,有圖有真相: