1 DataSet ds = new DataSet(); 2 cl_initPage.v_DeBugLog("ExcelDataSource進入"); 3 4 string strConn; 5 strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + filepath + ";Extended Properties='Excel 12.0; HDR=No; IMEX=1'"; 6 7 OleDbConnection conn = new OleDbConnection(strConn); 8 OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + sheetname + "$]", strConn); 9 10 oada.Fill(ds); 11 conn.Close(); 12 cl_initPage.v_DeBugLog("ExcelDataSource退出"); 13 DataTable dt = ds.Tables[0];
前些日子在使用winform讀取Excel的時候,總是出現被截斷的現象,經過測試以及讀取內容的分析,發現截取的長度都是相等的,即255個字符,對此在網上的資料也不是太多,后來經過找資料以及自己的測試,終於找到解決問題的方法了:
原文地址 http://www.cnblogs.com/soonssa/archive/2012/05/20/2509376.html
解決辦法:
如果是:Jet引擎.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
如果是:ACE引擎.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel
然后找到 TypeGuessRows這個項.默認為8的.修改為0.
但是,前8行必須有一個單元格大於255個字符,否則還是會自動截取,對此,出現了一下的另一種辦法:
在讀取遍歷的時候記錄一下,如果前八行,有大於255個字符的,就正常讀取,如果沒有,那么就只能再去重新讀取一遍,讀取的方法是讀取某一個單元格,這樣是可以正確讀取的
1 public void ExcelDataSource( DataTable dt){ 2 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 3 for (int i = 1; i < dt.Rows.Count; i++) 4 { 5 Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open(filepath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 6 Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet; 7 Microsoft.Office.Interop.Excel.Range range; 8 range = (Microsoft.Office.Interop.Excel.Range)sheet.Cells[i + 1, 18]; 9 string s = range.Formula.ToString(); 10 dt.Rows[i][17] = s; 11 } 12 Kill(excel); 13 } 14 15 #region 殺死束Excel進程 16 [DllImport("User32.dll", CharSet = CharSet.Auto)] 17 public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); 18 public static void Kill(Microsoft.Office.Interop.Excel.Application excel) 19 { 20 IntPtr t = new IntPtr(excel.Hwnd); //得到這個句柄,具體作用是得到這塊內存入口 21 22 int k = 0; 23 GetWindowThreadProcessId(t, out k); //得到本進程唯一標志k 24 System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到對進程k的引用 25 p.Kill(); //關閉進程k 26 27 } 28 #endregion
