我应该通过 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不支持解决代替方案
通过 OLEDB 读取 Excel 将字符串读取为 DBNull
需要通过oledb连接从azure存储blob容器中读取excel文件