【问题标题】:How do you get the name of the first page of an excel workbook?如何获取excel工作簿第一页的名称?
【发布时间】:2009-09-15 13:58:06
【问题描述】:

假设您不知道 Excel 工作簿中第一个工作表的名称。并且您想找到一种从 first 页面读取的方法。这个 sn-p 有时有效,但并非总是如此。只有我吗?或者有没有更简单的方法来做到这一点?

            MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + inputFile + "';Extended Properties=Excel 8.0;");

            String[] excelSheets = new String[tbl.Rows.Count]; 
            int i = 0;
            foreach (DataRow row in tbl.Rows)
            {
                excelSheets[i] = row["TABLE_NAME"].ToString();
                i++;
            }
            string pageName = excelSheets[0]; 

            OleDbDataAdapter myAdapter = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [" + pageName + "]", MyConnection);

注意:我正在寻找第一个工作表的名称

【问题讨论】:

  • Eviljack,您应该澄清这个问题,因为该问题似乎没有使用自动化(您在示例代码中专门使用 OleDb,然后在对 Jacob 的评论中,您声明 VSTO 是不允许此项目。然后,您为 Jacob 的解决方案打勾,该解决方案不需要 VSTO,但确实使用自动化。因此,从技术上讲,并没有破坏您的“无 VBTO”声明......但是,总体而言,如图所示和讨论,看起来 sgmoore 的解决方案更接近您最初寻找的解决方案?

标签: c# excel


【解决方案1】:

如果您在计算机上安装了 Office,为什么不直接使用 Visual Studio Tools for Office (VSTO)。这里基本上是获取工作表的代码:

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook =  app.Workbooks.Open(fileName,otherarguments);
Microsoft.Office.Interop.Excel.Worksheet worksheet =  workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;

【讨论】:

  • 我需要使用 OleDbConnection。 VSTO 虽然不错,但在这个项目中是不允许的。谢谢
  • 对不起,我对你投了反对票,直到我解决了“其他论点”然后意识到它有效。试图投票,但它不会让我。
  • 调用 'workbook.Worksheets[0]' 应该是 'workbook.Worksheets[1]' 因为 Excel.Worksheets 集合是基数 1。
  • @mike-rosenblum 不错。我已经编辑了我的答案以包含这个
  • 其他参数的类型是什么?在 MSDN 文档中苦苦挣扎,而 Visual Studio 也没有出现。
【解决方案2】:

您的代码似乎缺少 tbl 的定义。我认为它类似于

DataTable tbl = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

如果是这样,您可能会得到工作表名称,但顺序错误。

我找不到适合这个问题的解决方案,所以我从另一个角度来处理它。我决定寻找实际包含信息的表格。您可能可以通过查看行来做到这一点,但我使用的方法是查看架构信息中的列。 (这显然会在您使用过的表只有一列时失败,因为未使用的表也有一列),但它在我的情况下有效,我还用它来检查我是否有预期的列数(在我的情况下为九)

这里使用 GetOleDbSchemaTable(OleDbSchemaGuid.Columns, null) 方法返回列信息。

代码可能是无关紧要/琐碎的,因为我遇到这个问题时恰好正在学习LINQ,所以我用LINQ风格编写了它

它确实需要一个名为 LinqList 的小类,你可以得到 here

DataTable columnDetails = objConn.GetOleDbSchemaTable(
                          System.Data.OleDb.OleDbSchemaGuid.Columns,  null);    

LinqList<DataRow> rows = new LinqList<DataRow>(columnDetails.Rows);           

var query= (from r in rows
             group r by r["Table_Name"] into results
             select new { results.Key , count=results.Count() }  
            ); 

var activeSheets =  (from sheet in query
                      where sheet.count == 9 
                      select sheet.Key
                     ).ToList();

 if (activeSheets.Count != 1)
    ... display error

【讨论】:

  • +1 用于避免使用自动化并显示 OleDbConnection.GetOleDbSchemaTable 方法的实际示例。
  • 不确定是否需要 LinqList 类。相反,您可以使用 Enumerable.Cast() 扩展方法,如 'LinqList rows = columnDetails.Rows.Cast();'。
  • 我认为你的意思是 'var rows = columnDetails.Rows.Cast(); ' 是的,这似乎也有效。谢谢
  • 哦,拍摄,是的,我的意思是 'IEnumerable rows = columnDetails.Rows.Cast();',但当然 'var' 也可以。感谢您的接机。
【解决方案3】:

这与其他问题First sheet Excel相同

我认为返回表的顺序搞砸了。我们需要找到一种方法来获取选项卡的顺序。现在,如果您检查您的代码,有时第一张纸的索引为 0。但它可以按任何顺序返回。我已经尝试删除其他工作表,只有一张你得到正确的名字。但这并不实用。

编辑:经过一些研究,可能是标签按名称顺序返回Using Excel OleDb to get sheet names IN SHEET ORDER 见链接

【讨论】:

    【解决方案4】:

    SpreadsheetGear for .NET 将让您加载工作簿并获取工作表的名称(使用 IWorkbook.Worksheets[sheetIndex].Name)并获取每个单元格的原始数据或格式化文本(它做的更多,但这可能就是您的情况寻找您当前是否正在使用 OleDB)。

    您可以下载免费试用版here

    免责声明:我拥有 SpreadsheetGear LLC

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2013-04-01
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多