我应该通过 OleDb Jet4.0 读取一个 excel 文件并保存到数据集中吗?

Posted

技术标签:

【中文标题】我应该通过 OleDb Jet4.0 读取一个 excel 文件并保存到数据集中吗?【英文标题】:Shall I read an excel file via OleDb Jet4.0 and save into dataset? 【发布时间】:2011-08-22 04:08:38 【问题描述】:

我必须读取一个 excel 文件并放入数据集。

我应该通过 OleDbDataAdapter 读取 excel 文件内容,然后填充到数据集中吗? 我试过但失败了。它表示当数据适配器执行 Fill 方法时应用程序无法识别数据库格式。

代码:

String queryAll = "SELECT * FROM [Sheet1$]";
String xlsPath = Directory.GetCurrentDirectory() + "\\paid.xls";
String strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsPath;
try

    m_dbDA = new OleDbDataAdapter(queryAll, strConn);
    DataSet dsPaidXls = new DataSet();
    m_dbDA.Fill(dsPaidXls);  //exception here
 
 catch (System.Exception ex)
 
    MessageBox.Show(ex.Message);
 

是不是说没有办法直接读取一个excel数据并放入一个新的数据集中呢? 唯一的一种方法是逐个单元格读取excel数据并插入带有数据表的新DataSet?

提前致谢。

========================================= 已解决 =========================================

String queryAll = "SELECT * FROM [Sheet1$]";
String xlsPath = Directory.GetCurrentDirectory() + "\\paid.xls";
String strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsPath +
                 ";Extended Properties='Excel 8.0;IMEX=1';";
try

   m_dbDA = new OleDbDataAdapter(queryAll, strConn);
   DataSet dsPaidXls = new DataSet();
   m_dbDA.Fill(dsPaidXls,"[Sheet1$]");
   dataGridView1.DataSource = dsPaidXls;
   dataGridView1.DataMember = "[Sheet1$]";
 
 catch (System.Exception ex)
 
     MessageBox.Show(ex.Message);
 

【问题讨论】:

【参考方案1】:

一旦您拥有正确的连接字符串并意识到数据类型的问题,OLEDB 就会很好地工作。 Jet 适​​用于 2007 之前的版本,您需要为 Excel 添加扩展属性。

String strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
  + xlsPath + "Extended Properties='Excel 12.0 Xml;HDR=YES';";

见: Connection StringsHow To Use ADO with Excel Data from Visual Basic or VBA(包含有用的注释)Various notes

【讨论】:

是的,没错。几分钟前我已经添加了解决方法。谢谢。【参考方案2】:

当您通过 OleDB 读取 Excel 文件时,请确保您拥有正确版本的提供程序(一个用于 xls,一个用于 xlsx),并确保您已选择 x86 作为平台。

如果您不这样做,它将在 64 位系统上编译为 x64,并且由于不推荐使用 OleDb,因此没有 64 位 OleDb 驱动程序,这意味着您的程序在调用 OleDb 时会崩溃。

此外,还必须安装 Office 2007 系统驱动程序(ACE 数据连接组件)。

请看这里:Diagnosing an OLEDB exception when Quering Excel 2010

您也可以使用 ODBC 或 Excel Package Plus。 同样,如果格式是 xls 而不是 xlsx,则需要在此处使用不同的库。

XLS 的 Excel 库http://code.google.com/p/excellibrary/

用于 XLSX 的 Excel 软件包增强版http://epplus.codeplex.com/

【讨论】:

【参考方案3】:

您应该避免使用 OleDb 来读取 Excel 文件。许多陷阱。

对于 xls 文件,这会更好、更可靠。

http://www.codeproject.com/KB/office/ExcelReader.aspx

对于 xlsx 文件,使用 Office Open XML SDK:

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124

【讨论】:

真的吗?我对 OleDb 很陌生。谢谢你的建议,让我试试excelReader @heefan,我用 xlsx 文件的更好选项更新了我的答案。

以上是关于我应该通过 OleDb Jet4.0 读取一个 excel 文件并保存到数据集中吗?的主要内容,如果未能解决你的问题,请参考以下文章

64位Winows2008下连接Access数据库 Jet4.0不支持解决代替方案

从 ORACLE 读取的最快 OLEDB

通过 OLEDB 读取 Excel 将字符串读取为 DBNull

需要通过oledb连接从azure存储blob容器中读取excel文件

Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?

使用 OleDB/Jet 导入 DataTable