转载

读取Excel,单元格内容大于255个字符自动被截取的问题

读取Excel,单元格内容大于255个字符自动被截取的问题
 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个字符的,就正常读取,如果没有,那么就只能再去重新读取一遍,读取的方法是读取某一个单元格,这样是可以正确读取的

读取Excel,单元格内容大于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
正文到此结束
Loading...