- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含多个工作表的 excel,我想导入它
代码相当简单和基本,应该可以工作
但我的工作表名称在调试器中不断返回为“_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);
}
}
}
如前所述
调试器返回 sheetName="_xlnm#_FilterDatabase"
奇怪的是,第一个 eeo10 起作用了
但 eeo14 没有,因为它仍在尝试使用 eeo10 工作表
这里可能还有一些其他相关信息:
- 我已经关闭了工作簿中的自动过滤器
- 我放入列标题打印输出只是为了确认它正在阅读哪张纸
如有任何见解,我们将不胜感激
非常感谢!
最佳答案
每次在工作表上进行筛选时,Excel 都会创建一个隐藏工作表,尽管在检索工作表名称时该工作表不应该可用。下面是一段代码,可帮助您使用 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; }
}
如果您对此有任何问题,请回复我。
玩得开心!
关于c# - 使用 oledb netting "_xlnm#_FilterDatabase"作为工作表名称的多工作表导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23034296/
当我尝试在同一个文件上第二次运行 Powershell 脚本时,出现“名称冲突”对话框。我知道这个错误与我自动过滤文件有关。如果我从不使用 autofiter,则该对话框将不会显示。我究竟做错了什么?
我想创建一个快速脚本,它从标准化表格(word docs/docxs)中提取数据并将它们传输到 Excel 表格中,并附上一张用于计算的表格。 一切都很好,除了一个异常(exception): 我希望
我有一个包含多个工作表的 excel,我想导入它 代码相当简单和基本,应该可以工作 但我的工作表名称在调试器中不断返回为“_xlnm#_FilterDatabase” 是我概率的根源 这里是代码的相关
按照 MSSQLTips 博客文章中的说明,我设置了带有 Foreach 循环的包,以循环遍历工作簿中的所有工作表并将数据导入表中。 循环正在查找正确的工作表 ( '11-18$' ),然后是具有更长
我是一名优秀的程序员,十分优秀!