2016-08-22 67 views
1

我正在使用OleDbConnection从.xlsx工作簿中检索数据。当我检索工作表的列表时,它不会识别它们中的任何一个是否已被隐藏。过去通过用下划线来结束它的名字就是这种情况,例如“Sheet1 $ _”。你知道如何知道现在隐藏吗?OleDbConnection.GetOleDbSchemaTable for .xlsx不识别隐藏的工作表

   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>(); 
      } 
+0

我很困惑,你明白了隐藏的工作表,但你希望你的代码,它们标志为隐藏,或者你没有得到他们呢? – Gouda

+0

所有的工作表都会返回,但不显示哪些表已隐藏。 –

回答

-1

我觉得GetOleDbSchemaTable不在这里

最好的选择,因为它返回DataTable对象不管,可能是Excel中,访问,还是其他什么东西的数据源。因此,它是不知道的任何Excel工作表的属性

相反,您可以使用Excel的COM组件具有完全控制你的Excel文件

步骤

  1. 添加的Microsoft Excel COM参考到你的项目
  2. 以下行添加到使用Excel =的Microsoft.Office.Interop.Excel您的应用程序

    ;

  3. 阅读装片

示例代码

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 
    } 
} 

票据Visible属性:

选择正确的COM引用可能取决于您的Visual Studio版本 Check this SO question

此外,This article is a good reference

+0

当您投票时,您必须在评论中证明自己有理由改进答案 – Gouda