.xlsx 的 OleDbConnection.GetOleDbSchemaTable 无法识别隐藏的工作表
Posted
技术标签:
【中文标题】.xlsx 的 OleDbConnection.GetOleDbSchemaTable 无法识别隐藏的工作表【英文标题】:OleDbConnection.GetOleDbSchemaTable for .xlsx doesn't identify hidden worksheets 【发布时间】:2016-08-22 13:31:44 【问题描述】:我正在使用 OleDbConnection 从 .xlsx 工作簿中检索数据。当我检索工作表列表时,它无法确定是否有任何工作表被隐藏。这曾经是通过以下划线来结束它的名称,例如“Sheet1$_”。你知道如何判断它现在是否隐藏了吗?
using (var connection =
new OleDbConnection(string.Concat("Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Data Source=",
fileName,
";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"")))
using (var command = new OleDbCommand("", connection))
connection.Open();
var listedSheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] null, null, null, "Table");
if (listedSheets != null)
var sheetNames = new List<string>(listedSheets.Rows.Count);
foreach (DataRow row in listedSheets.Rows)
sheetNames.Add(row[2].ToString());
return sheetNames;
return new List<string>();
【问题讨论】:
我很困惑,您是否获得了隐藏的工作表,但您希望您的代码将它们标记为隐藏,或者您根本没有获得它们? 所有工作表都返回,但没有显示隐藏哪些工作表。 【参考方案1】:我认为GetOleDbSchemaTable
不是这里的最佳选择
因为无论数据源可能是 Excel、Access 还是其他东西,它都会返回 DataTable 对象。因此,它不知道任何 Excel 工作表属性
相反,您可以使用 Excel com 组件来完全控制您的 Excel 文件
步骤
-
将 Microsoft Excel COM 引用添加到您的项目中
将下面一行添加到您的应用程序中
使用 Excel = Microsoft.Office.Interop.Excel;
读取已加载工作表的Visible
属性
示例代码
private static Excel.Workbook MyBook = null;
private static Excel.Application MyApp = null;
private static Excel.Worksheet MySheet = null;
static void ReadExcel()
MyApp = new Excel.Application();
MyApp.Visible = false;
MyBook = MyApp.Workbooks.Open("C:\\test.xlsx");
MySheet = (Excel.Worksheet)MyBook.Sheets[1];
if (MySheet.Visible == Excel.XlSheetVisibility.xlSheetHidden)
//handle hidden sheet here
注意事项:
选择正确的 COM 引用可能取决于您的 Visual Studio 版本 Check this SO question
另外,This article is a good reference
【讨论】:
ً当您投反对票时,您必须在评论中证明以改善答案 @VSP,你怎么回答这个问题?以上是关于.xlsx 的 OleDbConnection.GetOleDbSchemaTable 无法识别隐藏的工作表的主要内容,如果未能解决你的问题,请参考以下文章