假设您不知道Excel工作簿中第一个工作表的名称。并且您想要找到一种从第一个页面读取的方法。这个片段有时会起作用,但并非总是如此。只有我吗?或者有没有一种明智的方法来做到这一点?
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);
注意:我正在寻找第一张工作表的 名称 。
答案 0 :(得分:8)
如果您在计算机上安装了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;
答案 1 :(得分:2)
您的代码似乎缺少tbl的定义。我认为它类似于
DataTable tbl = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
如果是这样,你可能会得到片名,但顺序错误。
我找不到适合这个问题的解决方案,所以我从另一个角度来看待它。我决定寻找实际上有相关信息的表格。您可以通过查看行来执行此操作,但我使用的方法是查看架构信息中的列。 (这显然会在你用过的工作表中失败只有一列,因为未使用的工作表也有一列),但它在我的情况下工作,我也用它来检查我有预期的列数(在我的情况下是九)< / p>
这使用GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null)方法返回列信息。
代码可能无关紧要/ trival,当我遇到这个问题时碰巧学习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
答案 2 :(得分:1)
这与其他问题First sheet Excel
相同我认为返回表的顺序搞砸了。我们需要找到一种方法来获取选项卡的顺序。现在,如果您检查代码,有时第一张表是索引0.但它可以按任何顺序返回。我已经尝试删除其他工作表,只有一个你得到正确的名称。但这不会是实际的。
编辑:经过一些研究,可能会按照名称Using Excel OleDb to get sheet names IN SHEET ORDER的顺序返回标签 见链接
答案 3 :(得分:0)
SpreadsheetGear for .NET将允许您加载工作簿并获取工作表的名称(使用IWorkbook.Worksheets [sheetIndex] .Name)并获取每个单元格的原始数据或格式化文本(它会做更多但这可能是什么如果您当前正在使用OleDB,那么您正在寻找。
您可以下载免费试用here。
免责声明:我拥有SpreadsheetGear LLC