讀取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個字符的,就正常讀取,如果沒有,那么就只能再去重新讀取一遍,讀取的方法是讀取某一個單元格,這樣是可以正確讀取的

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM