1

我整个上午都在研究,找不到有效的解决方案。我希望有人能告诉我答案。

我让用户使用 FileUpload 上传 .xls 文件,然后我想从 4 个工作表中选择所有数据并放入 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个问题,

第一个问题:如何在不知道其名称的情况下选择工作表?上面的代码不起作用,如果我用 MyFirstSheet$ 替换 {0} 则它起作用。我需要知道如何在不知道名称的情况下进行选择。我得到的错误是:

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.

第二个问题:有没有办法一次选择所有 4 个并将它们放入 4 个单独的数据集中?目前我打算阅读文件 4 次。

建议代码:

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();
4

2 回答 2

2

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

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]) 或名称(如果您指定一个)来引用这些表。

于 2013-06-14T14:13:59.193 回答
0

为什么不试试 excel 数据阅读器,它是 codeplex 上的一个开源项目?您可以在此处查看/下载库http://exceldatareader.codeplex.com/。您需要做的是从 FileUploader 获取流,并将其传递给库。

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

FileStream 流 = 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 中创建
数据集结果 = excelReader.AsDataSet();
//...
//4. DataSet - 从第一行创建列名
excelReader.IsFirstRowAsColumnNames = true;
数据集结果 = excelReader.AsDataSet();

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

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

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

//3. DataSet - 每个电子表格的结果将在 result.Tables 中创建
数据集结果 = excelReader.AsDataSet();
于 2013-06-14T14:04:48.663 回答