带有oledb网格的多页导入“_xlnm#_FilterDatabase”作为图表名称

我有一个多张,我想导入excel
代码是相当简单和基本的,应该工作
但是在debugging器中,我的工作表名称保持为“_xlnm#_FilterDatabase”
并且是我的概率的根源

这里是代码的相关部分:

string sheetName = ""; file = HostingEnvironment.MapPath("~/files/master1.xlsx"); xConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";"; using (OleDbConnection connection = new OleDbConnection(xConnStr)) { // get sheet names connection.Open(); DataTable sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); // eeo10 (2nd tab: first sheet to be imported) sheetName = sheets.Rows[1]["TABLE_NAME"].ToString(); OleDbCommand command = new OleDbCommand("Select * FROM ["+sheetName+"]", connection); // Create DbDataReader to Data Worksheet using (OleDbDataReader dr = command.ExecuteReader()) { // Bulk Copy to SQL Server using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnx)) { bulkCopy.ColumnMappings.Add("code", "id"); bulkCopy.ColumnMappings.Add("category10", "category"); bulkCopy.DestinationTableName = "eeo10"; bulkCopy.WriteToServer(dr); } } // eeo14 (3rd tab: second sheet to be imported) sheetName = sheets.Rows[2]["TABLE_NAME"].ToString(); command = new OleDbCommand("Select * FROM [" + sheetName + "]", connection); DataTable cols = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, sheetName, null }); foreach (DataRow r in cols.Rows) { System.Diagnostics.Debug.WriteLine("{0} = {1}", r["COLUMN_NAME"], r["ORDINAL_POSITION"]); } // Create DbDataReader to Data Worksheet using (OleDbDataReader dr = command.ExecuteReader()) { // Bulk Copy to SQL Server using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnx)) { bulkCopy.ColumnMappings.Add("code", "id"); bulkCopy.ColumnMappings.Add("category14", "category"); bulkCopy.DestinationTableName = "eeo14"; bulkCopy.WriteToServer(dr); } } } 

如前所述
debugging器返回sheetName =“_ xlnm#_FilterDatabase”
这是第一个eeo10的作品
但eeo14并不是因为它仍然在尝试使用eeo10表

这里也许有一些其他相关的信息:
– 我已closures工作簿中的自动filter
– 我把列标题打印输出只是为了确认它正在阅读的表

任何见解都是值得肯定的
非常感谢!

Excel会在每次过滤纸张时创build一个隐藏纸张,尽pipe这个纸张在检索纸张名称时不可用。 下面是一段代码,它将帮助您使用System.Data.OleDb获取表单名称:

 class Retriever { public List<SheetName> GetSheetNames(OleDbConnection conn) { List<SheetName> sheetNames = new List<SheetName>(); if (conn.State != ConnectionState.Open) { conn.Open(); } DataTable excelSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); foreach (DataRow row in excelSchema.Rows) { if (!row["TABLE_NAME"].ToString().Contains("FilterDatabase")) { sheetNames.Add(new SheetName() { sheetName = row["TABLE_NAME"].ToString(), sheetType = row["TABLE_TYPE"].ToString(), sheetCatalog = row["TABLE_CATALOG"].ToString(), sheetSchema = row["TABLE_SCHEMA"].ToString() }); } } conn.Close(); return sheetNames; } } class SheetName { public string sheetName { get; set; } public string sheetType { get; set; } public string sheetCatalog { get; set; } public string sheetSchema { get; set; } } 

如果您遇到任何问题,请回复我。

玩的开心!