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
如果您认为这篇文章还不错或者有所收获,您可以点击文章下面的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
作者:月下舞之蝶影
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!