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

时间:2016-08-22 13:31:45

标签: c# excel xlsx oledbconnection

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

1 个答案:

答案 0 :(得分:-2)

我认为@required_fields [:id, :name, :association_id] @optional_fields [:other_field] def duplicate(record) do dup = Map.take(record, @required_fields ++ @optional_fields) changeset(%YourModule{}, dup) |> Repo.insert! end 不是最好的选择

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

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

<强>步骤

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

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

  3. 阅读已加载工作表的GetOleDbSchemaTable属性

  4. 示例代码

    Visible

    备注:

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

    此外,This article is a good reference