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];
View Code

前些日子在使用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
View Code