导入.xls并通过编号获取表格

我一直在研究整个上午,找不到一个工作的解决scheme。 我希望有人能告诉我答案。

我有一个用户使用FileUpload上传一个.xls文件,然后我想从4个工作表中select所有的数据,并放入4个独立的数据集。 这是我正在使用的代码:

string strConn = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + FileUpload1.PostedFile.FileName; string query = "SELECT * FROM [{0}]"; DataSet excelDataSet = new DataSet(); OdbcDataAdapter da = new OdbcDataAdapter(query, strConn); 

所以我有2个问题,

第一个问题:如何在不知道名称的情况下select一张纸? 上面的代码不工作,如果我用{MyFirstSheet $replace{0}然后它的工作。 我需要知道如何select,而不知道名字是什么。 我得到的错误是:

 ERROR [42S02] [Microsoft][ODBC Excel Driver] The Microsoft Jet database engine could not find the object '0}'. Make sure the object exists and that you spell its name and the path name correctly. 

第二个问题:是否有一种方法可以一次select所有4个,并将它们放入4个独立的数据集中? 目前我正在计划阅读文件4次。

build议的代码:

 String connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileUpload1.PostedFile.FileName.ToString() + ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\""; OleDbConnection conn = new OleDbConnection(connString); conn.Open(); String sheet = conn.GetSchema("Tables").Rows[0]["TABLE_NAME"].ToString(); String selectCommand = String.Format(@"SELECT * FROM [{0}]", sheet); DataSet excelDataSet = new DataSet(); OdbcDataAdapter da = new OdbcDataAdapter(selectCommand, "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + FileUpload1.PostedFile.FileName); da.Fill(excelDataSet); btnLoadCsv.Text = excelDataSet.Tables[0].Rows[10][1].ToString(); 

您可以从工作簿中获取工作表集合:

 OleDbConnection conn = new OleDbConnection("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + FileUpload1.PostedFile.FileName); conn.Open(); StringBuilder sb = new StringBuilder(); foreach (DataRow row in conn.GetSchema("Tables").Rows) sb.Append(String.Format(@"SELECT * FROM [{0}];", row["TABLE_NAME"]); OdbcDataAdapter da = new OdbcDataAdapter(sb.ToString(), conn); DataSet excelDataSet = new DataSet(); da.Fill(excelDataSet); excelDataSet.Tables[0].Name = "myTable1"; excelDataSet.Tables[1].Name = "myTable2"; excelDataSet.Tables[2].Name = "myTable3"; //etc...however many sheets you got from Excel (you could loop this too) 

此示例循环显示“表”的模式中的行,这等同于工作簿中的工作表。 使用复合的SQL SELECT ,您可以立即将所有表一起存入DataSet ,您可以通过索引( excelDataSet.Tables[0] )引用它,也可以通过名称指定一个表。

为什么不尝试excel数据读取器,这是一个codeplex上的开源项目? 您可以在这里查看/下载图书馆http://exceldatareader.codeplex.com/ 。 你需要做的是从FileUploader获取stream,并将其传递给库。

以下是所需代码的示例摘录

 FileStream stream = File.Open(filePath,FileMode.Open,FileAccess.Read);

 // 1。 从二进制Excel文件('97-2003格式; * .xls)读取
 IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
 // ...
 // 2。 从OpenXml Excel文件中读取(2007格式; * .xlsx)
 IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
 // ...
 // 3。  DataSet  - 每个电子表格的结果将在result.Tables中创build
 DataSet结果= excelReader.AsDataSet();
 // ...
 // 4。 数据集 - 从第一行创build列名
 excelReader.IsFirstRowAsColumnNames = true;
 DataSet结果= excelReader.AsDataSet();

 // 5。 数据读取器方法
 while(excelReader.Read())
 {
 //excelReader.GetInt32(0);
 }

 // 6。 免费资源(IExcelDataReader是IDisposable)
 excelReader.Close();

下面是将所有工作表加载到一个数据集中的几个数据表中的代码。

 // 3。  DataSet  - 每个电子表格的结果将在result.Tables中创build
 DataSet结果= excelReader.AsDataSet();