你如何得到一个Excel工作簿的第一页的名称?

假设您不知道Excel工作簿中第一个工作表的名称。 而你想find一种方法来阅读第一页。 这段代码有时可以工作,但并不总是如此。 只有我吗? 还是有没有一个聪明的方法来做到这一点?

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); 

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

如果在计算机上安装了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; 

你的代码似乎缺less了tbl的定义。 我认为这是类似的东西

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

如果是这样,你可能会得到的sheetnames,但顺序错误。

我找不到适合这个问题的解决办法,所以我从另一个angular度来看待这个问题。 我决定寻找实际上有关于它的信息。 您可以通过查看行来做到这一点,但是我使用的方法是查看架构信息中的列。 (这显然会失败,在你用过的工作表中只有一列,因为未使用的工作表也有一列),但在我的情况下,我也用它来检查我有预期的列数(在我的情况下九)

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

代码可能是不相关的/ trival,和我碰巧遇到这个问题,我碰巧学习LINQ,所以我写了它的LINQ风格

它确实需要一个名为LinqList的小类,您可以在这里获得

 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 

这与其他问题相同第一张表格Excel

我认为返回的表的顺序搞砸了。 我们需要find一种方法来获取标签的顺序。 现在,如果你检查你的代码,有时第一张是索引0.但它可以以任何顺序返回。 我已经尝试删除其他工作表,只有一个你得到正确的名字。 但是这不会是实际的。

编辑:经过一番研究,它可能是标签按名称的顺序返回使用Excel OleDb获取表名称在页顺序看链接

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

你可以在这里下载免费试用版。

免责声明:我自己的SpreadsheetGear LLC