现在的位置: 首页 > 编程语言 > 正文

ADO中GetCollect()函数获取EXCEL表格中完整数字的方法

2018年09月26日 编程语言 ⁄ 共 1707字 ⁄ 字号 评论关闭

      ADO是一组由微软提供的COM组件,基于面向对象思想的编程接口。它建立在COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼,由三个主要对象Connection、Command、Recordset和几个辅助对象组成。

我们利用ADO技术的GetCollect()函数读取excel表中的字符串中会发现如果数字行数过长(一般>255行)会出现读取的数据不完整这种情况。这是笔者在一年前写一个读取excel表格数据中出现的情况。针对这个问题,笔者上网查询了一些材料,找到了一个很好的解决方法,并且很好的解决了这个问题。

 

     问题的原因是这样的,因为在使用ADO.NET读取Excel表格时,OLEDBExcel
2000-2003
一般是是Jet 4.0Excel 2007ACE 12.0,即Access Connectivity EngineACE也可以用来访问Excel
2000-2003
)会默认扫面Sheet中的前几行来决定数据类型,Excel并不像Access一样,一列中的单元格的数据类型可能不一样,用ADO.NET读取Excel时,ole
db(JET)
会扫描sheet中前几行,默认是8行(这个值可在注册表中TypeGuessRows设定)来决定当前列的数据类型。这样,就给我们提供了一个解决这个问题的方法,需要通过修改注册表中的TypeGuessRows的值来来解决这个问题。
考虑一列数据,如果前8行都是数字,那么JET扫描没有问题。如果8行内的数据类型不一样,JET会采用一个都适合的数据类型来匹配,通常为varcharunicode
varchar
 现在的问题是,前8行的数据如果短小,JET匹配了varchar,只有255字符。而实际可能是其它更大的数据。
 
      

     如果设置前面的TypeGuessRows=0,这样会查询16384行,查询完后匹配一个最合适的数据类型,不过这个长度对于我来说已经绰绰有余,所以有一个很好的解决方法就是将TypeGuessRows的值设为0;

TypeGuessRows在注册表中的路径如下所示:

     Excel 2000-2003 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\

     Excel 2007 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel

   (其取值范围为十进制闭区间0-16)

    所以我们就可以写一个很简单的程序来解决该问题,代码很简单,如下所示

void SetTypeGuessRowsValue()
{
   HKEY hKEY;
   LPCTSTR dataSet="SOFTWARE\\Microsoft\\Jet\\4.0\\Engines\\Excel\\";
   //打开与路径 dataSet 相关的hKEY,KEY_WRITE表示以写的方式打开
   long retn = ( ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,dataSet, 0, KEY_WRITE, &hKEY) );
   if( retn != ERROR_SUCCESS )
   {
      MessageBox("错误: 无法打开有关的hKEY!");
      return;
   }

   //修改TypeGuessRows值
   DWORD type = REG_DWORD;
   DWORD cbData = 2;
   BYTE  VAL = 0;

   retn =::RegSetValueEx(hKEY, "TypeGuessRows", NULL, type, &VAL, cbData);
   if( retn != ERROR_SUCCESS )
   {
      MessageBox("错误: 无法修改有关注册表信息!");
      return;
   }
}

 

 

 

 

 

抱歉!评论已关闭.