zoukankan      html  css  js  c++  java
  • (轉載)Excel 文件用C#导入 Access 数字字符混排的问题

    Excel 文件用C#导入 Access 数字字符混排的问题

    Excel 驱动程序读取指定源中一定数量的行(默认情况下为 8 行)以推测每列的数据类型。如果推测出列可能包含混合数据类型(尤其是混合了文本数据的数值数据时),驱动程序将决定采用占多数的数据类型,并对包含其他类型数据的单元返回空值。(如果各种数据类型的数量相当,则采用数值类型。)
    Excel 工作表中大部分单元格格式设置选项不会影响此数据类型判断。可以通过指定导入模式来修改 Excel 驱动程序的此行为。若要指定导入模式,请在“属性”窗口中将 IMEX=1 添加到 Excel 连接管理器的连接字符串内的扩展属性值中。

    所以如果不指定IMEX=1的话,72459473X读进来可能是NULL,因为大多数行都是纯数字。

    连接字符写成如下形式似乎可以解决问题:

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" //excel 实际是就是一个数据源
    + "Data Source=" + filepath + ";"
    + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";

    注意Properties属性后面的'号。3个参数用'号引住。

    接下来的问题是,IMEX=1等扩展属性究竟是什么意思?查到的下面两句解释应该是足够清楚了:
    1.IMEX=1:tells the driver to always read "intermixed" data columns as text
    2.HDR=Yes; to indicate that I have a header row in my sheets

    参考: http://www.cnblogs.com/soulstore/archive/2007/11/09/954460.html 在此表示感谢!!


    现在的问题是:如果前99行是数字,最后一行是混合型怎么办?
    之前在使用 OleDb 讀取 Excel 時, 發生有些欄位雖然有值, 但是讀出來卻是 Null 的問題, 上網查了一下, 說是在連線字串中加入 Extended Properties, 將 IMEX 設為 1, 就可以強迫 OleDb 的 driver 將內容當成文字讀取, 以避免發生型別錯誤而回傳 null. 如下

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;但是後來發現有些資料可以成功, 有些不行, 但是如果把資料列的順序作一下改變的話(把非數字的資料放到比較前面的幾列), 就又可以順利讀取, 真是怪到極點, 於是再去問了一下 Google, 終於找到問題的源頭... 原來是 OleDb Driver 的問題, 在機碼 HKLM\Software\Microsoft\Jet\4.0\Engines\Excel 有一個 TypeGuessRows 值, 預設是 8, 表示會先讀取前 8 列來決定每一個欄位的型態, 所以如果前 8 列的資料都是數字, 到了第 9 列以後出現的文字資料都會變成 null, 真是聰明得令人哭笑不得..... 所以如果要解決這個問題, 只要把 TypeGuessRows 機碼值改成 0, 就可以解這個問題了!

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
    "win32"="C:\\Program Files\\Microsoft Office\\OFFICE11\\msaexp30.dll"
    "DisabledExtensions"="!xls"
    "ImportMixedTypes"="Text"
    "FirstRowHasNames"=hex:01
    "AppendBlankRows"=dword:00000001
    "TypeGuessRows"=dword:00000000
    "win32old"="C:\\WINDOWS\\system32\\msexcl40.dll"

    引自:
    http://sanchen.blogspot.com/2007/08/imex1-oledb-excel-null.html

    OLEDB的Excel的IMEX和HDR是什么意思
    2010-01-23 13:24

    HDR=NO 即无字段
    HDR=yes 即有字段,一般默认excel表中第1行的列标题为字段名,如姓名、年龄等

    还有问题IMEX有三个值0,1,2,其他两个值分别表示什么



    IMEX 表示是否强制转换为文本

    特别注意

      Extended Properties='Excel 8.0;HDR=yes;IMEX=1'

      A: HDR ( HeaDer Row )设置

      若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称

      若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称

      B:IMEX ( IMport EXport mode )设置

      IMEX 有三种模式,各自引起的读写行为也不同,容後再述:

      0 is Export mode

      1 is Import mode

      2 is Linked mode (full update capabilities)

      我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:

      当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。

      当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。

      当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。

    意义如下:

    0 ---输出模式;
    1---输入模式;
    2----链接模式(完全更新能力)

  • 相关阅读:
    洛谷1069 细胞分裂
    洛谷1050 循环
    CF Good Bye 2018
    洛谷1043 数字游戏
    洛谷1041 传染病控制
    洛谷1040 加分二叉树
    洛谷1039 侦探推理
    洛谷1038 神经网络
    设计模式的区别
    volatile和synchronized与lock的理解
  • 原文地址:https://www.cnblogs.com/Tonyyang/p/2012233.html
Copyright © 2011-2022 走看看