zoukankan      html  css  js  c++  java
  • C# 导入Excel遇到数字字母混合列数据丢失解决

     [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3237772.html] 

    在导入Excel读取数据时,其中的一个字段保存的值有如下格式:"2011072014","20110Aad10","25124Adfa","例子asdfadf"  这样的 混合了 "字母/数字/中文"数据,在Excel表格中的前 8条 数据中的 这个列中的数据都是 由纯数字组成的,如"2011072012","2011072013","2011072014",到了大于8行的时候的该列的数据组成变成了 数字+中文 + 字母的组合,这样就会出现取不到该列值的问题

    错误原因:

    Excel读取数据列的格式 是按照每一列前8个数据的类型来判断读写时的类型的。比如前8个数据有3个是字母,5个是数字,那么这一整列都是以数字型来读的,类型最多的那么不管第8条之后是什么类型,都当作这个类型来读取,那些字母都读不了。 使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。产生这种问题的根源与Excel ISAM[3](Indexed Sequential Access Method,即索引顺序存取方法)驱动程序的限制有关,Excel ISAM 驱动程序通过检查前几行中实际值确定一个 Excel 列的类型,然后选择能够代表其样本中大部分值的数据类型[4]。也即Excel ISAM查找某列前几行(默认情况下是8行),把占多的类型作为其处理类型。例如如果数字占多,那么其它含有字母等文本的数据项就会置空;相反如果文本居多,纯数字的数据项就会被置空。 现具体分析在第1节程序代码Extended Properties项中的HDR和IMEX所代表的含义。HDR用来设置是否将Excel表中第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。当我们设置IMEX=1时将强制混合数据转换为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。 另一个改进的措施是IMEX=1与注册表值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过修改“HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel”下的该注册表值来更改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空。

    在sql server用法

    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="E:数据.xls";
    User ID=Admin;Password=;Extended properties=''Excel 8.0;HDR=YES;IMEX=1''')

    -----------------------------------------------------------------------

    (以上内容是转载,如下原创) 

    1.直接写入代码中运行(十进制5000) ---适用于本地应用程序Winform

     1         public string Detect3264() //检测32or64位操作系统
     2         {
     3             ConnectionOptions oConn = new ConnectionOptions();
     4             System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\localhost", oConn);
     5             System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select AddressWidth from Win32_Processor");
     6             ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
     7             ManagementObjectCollection oReturnCollection = oSearcher.Get();
     8             string addressWidth = null;
     9             foreach (ManagementObject oReturn in oReturnCollection)
    10             {
    11                 addressWidth = oReturn["AddressWidth"].ToString();
    12             }
    13             return addressWidth;
    14         }
    1     if (Detect3264() == "32")
    2         strreg = @"SOFTWAREMicrosoftJet4.0EnginesExcel";
    3     else
    4         strreg = @"SOFTWAREWOW6432nodMicrosoftJet4.0EnginesExcel";
    5     RegistryKey reg_TypeGuessRows = Registry.LocalMachine.CreateSubKey(strreg);
    6     reg_TypeGuessRows.SetValue("TypeGuessRows", 5000);

      记事本编写注册表文件保存为*.reg (0x0001388十六进制,转为十进制为5000)   ---适用于B/S架构程序,在服务端运行即可,无需在客户端运行(如果写在服务端让客户端来运行会出现权限不足,即服务端无法操作客户端注册表)。因为解析Excel是客户端传Excel到服务端由服务端解析,所以只需要在服务端运行即可。

    32位
    1
    REGEDIT4 2 [HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel] 3 "TypeGuessRows"=dword:0x00001388
    64位
    1
    REGEDIT4
    2 [HKEY_LOCAL_MACHINESOFTWAREWOW6432nodMicrosoftJet4.0EnginesExcel]
    3 "TypeGuessRows"=dword:0x00001388

     2.连接方式为

     1  private bool GetExcelData(ref DataTable dt,string filepath)
     2         {
     3             try
     4             {
     5                 strCon = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ='" + filepath + "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
     6                 OleDbConnection myConn = new OleDbConnection(strCon);
     7                 myConn.Open();
     8                 dt = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
     9                 myConn.Close();              
    10                 return true;
    11             }
    12             catch (Exception ex)
    13             {
    14                 MessageBox.Show(ex.Message, "读取Excel文件中的数据出错");
    15                 return false;
    16             }
    17         }
  • 相关阅读:
    UTF-8 GBK UTF8 GB2312 之间的区别和关系
    为什么要需求分析
    数据库建表原则
    使用SQL存储过程有什么好处 用视图有什么好处
    SQL使用视图的优缺点
    百度地图添加多个行政区划
    性能测试日志分析之awk基础用法
    Nginx 安装配置
    linux的top命令参数详解
    Java小程序Linux下运行
  • 原文地址:https://www.cnblogs.com/wanghafan/p/3237772.html
Copyright © 2011-2022 走看看