zoukankan      html  css  js  c++  java
  • 使用 OpenRowSet 和 OpenDataSource 访问 Excel 972007

    使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007
    2010-04-19 11:09

    有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。

    Jet 引擎大家都很熟悉,可以访问 Office 97-2003,但不能访问 Office 2007。

    ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。

    另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。

    Microsoft.ACE.OLEDB.12.0 安装文件:

    http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891

    语法一览

    使用 Jet 引擎或 ACE 引擎访问,在语法上没有什么的区别。

    1. --> Jet 引擎访问 Excel 97-2003  
    2. select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet1$]')   
    3. select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', [Sheet1$])   
    4. select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls')...[Sheet1$]   
    5. select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=D:\97-2003.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"')...[Sheet1$]   
    6.   
    7. --> ACE 引擎访问 Excel 97-2003  
    8. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet1$]')   
    9. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', [Sheet1$])   
    10. select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls')...[Sheet1$]   
    11. select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\97-2003.xls;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[Sheet1$]   
    12.   
    13. --> ACE 引擎访问 Excel 2007  
    14. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx', 'select * from [Sheet1$]')   
    15. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx', [Sheet1$])   
    16. select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx')...[Sheet1$]   
    17. select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[Sheet1$]  
    --> Jet 引擎访问 Excel 97-2003
    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet1$]')
    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', [Sheet1$])
    select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls')...[Sheet1$]
    select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=D:\97-2003.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"')...[Sheet1$]
    
    --> ACE 引擎访问 Excel 97-2003
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet1$]')
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls', [Sheet1$])
    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\97-2003.xls')...[Sheet1$]
    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\97-2003.xls;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[Sheet1$]
    
    --> ACE 引擎访问 Excel 2007
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx', 'select * from [Sheet1$]')
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx', [Sheet1$])
    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\2007.xlsx')...[Sheet1$]
    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[Sheet1$]

    Excel 2007 工作簿文件的扩展名是:xlsx

    HDR=Yes/No

    可选参数,指定 Excel 表的第一行是否列名,缺省为 Yes,可以在注册表中修改缺省的行为。

    IMEX=1

    可选参数,将 Excel 表中混合Intermixed数据类型的列强制解析为文本。

    注册表设置

    Microsoft.Jet.OLEDB.4.0

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

    Microsoft.ACE.OLEDB.12.0

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

    FirstRowHasNames

    设置 HDR 参数的缺省行为,默认为 Yes。

    ImportMixedTypes

    设置混合列的强制解析类型,默认为文本 Text。

    TypeGuessRows

    设置用于解析数据类型的取样行数,默认取样前 8 行。如果设置为 0,将分析所有数据行,但不建议这样做,会影响引擎的性能。

    注意:Excel 表数据列是单一列数据类型还是混合列数据类型列,是由取样行决定,而不是整列数据决定。

    单一数据类型列的类型解析

    Sheet1 的内容如下图所示,涵盖了大部分 Excel 的数据类型,其中 longtext 分别有 256 个 A 和 B。

    Sheet1

    对于单一数据类型列的类型解析,ACE 引擎和 Jet 引擎是一样的,下面测试 Jet 引擎的数据解析:

    1. use tempdb   
    2. go   
    3.   
    4. select * into #type from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\97-2003.xls', 'select * from [Sheet1$]')   
    5.   
    6. select  
    7.    a.name,   
    8.    date_type = b.name + case a.xusertype when 231 then '('+ltrim(a.length/2)+')' else '' end  
    9. from  
    10.    syscolumns a inner join systypes b on a.xusertype = b.xusertype   
    11. where  
    12.    a.id = object_id('#type')   
    13.   
    14. /*   
    15. name      date_type   
    16. -------- -------------  
    17. longtext ntext   
    18. text      nvarchar(255)   
    19. datetime datetime   
    20. date      datetime   
    21. time      datetime   
    22. money     money   
    23. float    float  
    24. numeric  float  
    25. integer  float  
    26. */   
    27.   
    28. drop table #type  
    use tempdb
    go
    
    select * into #type from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\97-2003.xls', 'select * from [Sheet1$]')
    
    select
      a.name,
      date_type = b.name + case a.xusertype when 231 then '('+ltrim(a.length/2)+')' else '' end
    from
      syscolumns a inner join systypes b on a.xusertype = b.xusertype
    where
      a.id = object_id('#type')
    
    /*
    name     date_type
    -------- -------------
    longtext ntext
    text     nvarchar(255)
    datetime datetime
    date     datetime
    time     datetime
    money    money
    float    float
    numeric  float
    integer  float
    */
    
    drop table #type

    数据类型解析总结

    • 文本:长度 <= 255,解析为 nvarchar(255),长度 > 255,解析为 ntext。
    • 数值:货币解析为 money,其它均解析为 float。
    • 时间:datetime。

    混合数据类型列的强制解析——IMEX=1

    使用 IMEX=1 选参之后,只要取样数据里是混合数据类型的列,一律强制解析为 nvarchar/ntext 文本。当然,IMEX=1 对单一数据类型列的解析是不影响的。

    1. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet2$]')   
    2. select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet2$]')   
    3. select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;IMEX=1;Database=D:\2007.xlsx', 'select * from [Sheet2$]')   
    4. /*   
    5. id     describe num>str   num=str   num<str   
    6. ----- -------- -------- -------- --------  
    7. 1      sampling 1         1         1   
    8. 2      sampling 2         2         2   
    9. 3      sampling 3         3         3   
    10. 4      sampling 4         4         A   
    11. 5      sampling 5         A         B   
    12. 6      sampling A         B         C   
    13. 7      sampling B         C         D   
    14. 8      sampling C         D         E   
    15. 9      others    1         2         3   
    16. 10     others    >         =         <   
    17. ----- -------- -------- -------- --------  
    18. float nvarchar nvarchar nvarchar nvarchar   <-- 解析的数据类型  
    19. */  
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet2$]')
    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;IMEX=1;Database=D:\97-2003.xls', 'select * from [Sheet2$]')
    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;IMEX=1;Database=D:\2007.xlsx', 'select * from [Sheet2$]')
    /*
    id    describe num>str  num=str  num<str
    ----- -------- -------- -------- --------
    1     sampling 1        1        1
    2     sampling 2        2        2
    3     sampling 3        3        3
    4     sampling 4        4        A
    5     sampling 5        A        B
    6     sampling A        B        C
    7     sampling B        C        D
    8     sampling C        D        E
    9     others   1        2        3
    10    others   >        =        <
    ----- -------- -------- -------- --------
    float nvarchar nvarchar nvarchar nvarchar  <-- 解析的数据类型
    */

    最后一列(num<str),Jet 引擎的自然解析和强制解析都解析为 nvarchar(255),但是自然解析将数值显示为 NULL,强制解析却能正确显示,这是不一致的地方。

    在数据解析的细节方面,ACE 引擎的表现优于 Jet 引擎。在前面提到的文本优先问题、非文本数据的 NULL 值问题,ACE 引擎的解析更合理。

  • 相关阅读:
    es6扩展运算符深浅拷贝
    将工作慢慢移向python
    OpenGL
    翻译的一篇关于Normal Matrix (normal transformation)的文章
    顾城的诗
    复杂的C运行时库
    glut and glew
    setting boot up order in grub2
    Perlin Noise
    GL 与 CV 管线 (pipeline) 比较与相互转换
  • 原文地址:https://www.cnblogs.com/hdl217/p/1989570.html
Copyright © 2011-2022 走看看