导入.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();