我正在使用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不是这里的最佳选择

因为它返回DataTable对象,而不管数据源可能是Excel,Access还是其他。因此,它不知道任何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

关于c# - .xlsx的OleDbConnection.GetOleDbSchemaTable无法识别隐藏的工作表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39080970/

10-12 17:41
查看更多