Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDbConnection.GetOleDbSchemaTable for.xlsx不';无法识别隐藏的工作表_C#_Excel_Xlsx_Oledbconnection - Fatal编程技术网

C# OleDbConnection.GetOleDbSchemaTable for.xlsx不';无法识别隐藏的工作表

C# OleDbConnection.GetOleDbSchemaTable for.xlsx不';无法识别隐藏的工作表,c#,excel,xlsx,oledbconnection,C#,Excel,Xlsx,Oledbconnection,我正在使用OleDbConnection从.xlsx工作簿检索数据。当我检索工作表列表时,它不会识别是否有任何工作表被隐藏。过去的情况是,在名称末尾加下划线,如“Sheet1$\ux”。你知道如何判断这是否是隐藏的吗 using (var connection = new OleDbConnection(string.Concat("Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Data S

我正在使用OleDbConnection从.xlsx工作簿检索数据。当我检索工作表列表时,它不会识别是否有任何工作表被隐藏。过去的情况是,在名称末尾加下划线,如“Sheet1$\ux”。你知道如何判断这是否是隐藏的吗

                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>();
            }
使用(变量连接)=
新的OLEDB连接(string.Concat(“Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Data Source=”,
文件名,
“扩展属性=\”Excel 12.0;HDR=是;IMEX=1\“”)
使用(var命令=新OleDbCommand(“,连接))
{
connection.Open();
var listedSheets=connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
新对象[]{null,null,null,“表”});
如果(listedSheets!=null)
{
var sheetNames=新列表(listedSheets.Rows.Count);
foreach(listedSheets.Rows中的DataRow行)
{
sheetNames.Add(行[2].ToString());
}
返回姓名;
}
返回新列表();
}

我认为
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版本


    另外,

    我认为
    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版本


    另外,

    我很困惑,您是否获得了隐藏的工作表,但希望代码将其标记为隐藏,还是根本不获得?所有工作表都返回,但没有显示哪些工作表被隐藏。我很困惑,您是否获得了隐藏的工作表,但希望代码将其标记为隐藏,或者你根本没有得到它们?所有的表格都被返回,没有显示哪些表格被隐藏了。当你否决投票时,你必须在评论中说明理由,以改善投票结果answer@VSP,那么你如何回答这个问题呢?ً当你否决投票时,你必须在评论中说明理由以改善投票结果answer@VSP,那么你如何回答这个问题呢?