.xlsx 的 OleDbConnection.GetOleDbSchemaTable 无法识别隐藏工作表

问题描述 投票:0回答:2

我正在使用 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>();
            }
c# excel xlsx oledbconnection
2个回答
0
投票


如何使用 OLEDB 获取 Excel 中唯一的 excel 工作表名称列表;过滤掉元数据中显示的非工作表

// skip those that do not end correctly
foreach (DataRow row in schemTable.Rows)
{
    string sheetName = row["TABLE_NAME"].ToString();
    if (!sheetName.EndsWith("$") && !sheetName.EndsWith("$'"))
        continue;
    Console.WriteLine(sheetName);
}

-2
投票

我认为

GetOleDbSchemaTable
不是最好的选择

因为它返回 DataTable 对象,无论数据源可能是 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
    }
}

备注:

选择正确的 COM 引用可能取决于您的 Visual Studio 版本 检查这个问题

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

© www.soinside.com 2019 - 2024. All rights reserved.