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