OleDbConnection.GetOleDbSchemaTable for .xlsx不识别隐藏的工作表

我正在使用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>(); } 

我认为GetOleDbSchemaTable不是这里最好的select

因为它返回DataTable对象,不pipe可能是Excel,Access或其他的数据源。 所以,它不知道任何Excel工作表属性

相反,您可以使用Excel com组件对您的Excel文件进​​行完全控制

脚步

  1. 将Microsoft Excel COM引用添加到您的项目
  2. 将以下行添加到您的应用程序

    使用Excel = Microsoft.Office.Interop.Excel;

  3. 阅读已加载工作表的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 } } 

笔记:

select正确的COM参考可能取决于您的Visual Studio版本检查这个问题

另外, 这篇文章是一个很好的参考