• 读取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
    如果您认为这篇文章还不错或者有所收获,您可以点击文章下面的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
    声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
  • 相关阅读:
    Don't Dismiss Georgia Tech's $6,600 Online Master's Degree
    Java SPI机制学习笔记
    Java SPI机制简介
    Java SPI机制
    Java SPI机制原理和使用场景
    中文代码之Spring Boot集成H2内存数据库
    H2数据库攻略
    JAVA 项目中使用 H2 数据库
    Java内存数据库-H2介绍及实例(SpringBoot)
    内存数据库-H2简介与实践
  • 原文地址:https://www.cnblogs.com/gskstudy/p/4223935.html
Copyright © 2020-2023  润新知