C# asp.net-读取Excel工作表名称而不返回数据表
你可能会将我重定向到其他链接,但我会第一个告诉你们:我已经使用了很多次,我真的不知道这一次有什么问题 我的场景是:我需要将Excel数据导入数据库。听起来很简单,对吧?现在,首先我需要知道工作表的名称。这就是我的问题开始的地方。我重复一遍,我已经用了很多次了,我不知道这次我做错了什么: 我指的“it”是这段代码:C# asp.net-读取Excel工作表名称而不返回数据表,c#,asp.net,excel,C#,Asp.net,Excel,你可能会将我重定向到其他链接,但我会第一个告诉你们:我已经使用了很多次,我真的不知道这一次有什么问题 我的场景是:我需要将Excel数据导入数据库。听起来很简单,对吧?现在,首先我需要知道工作表的名称。这就是我的问题开始的地方。我重复一遍,我已经用了很多次了,我不知道这次我做错了什么: 我指的“it”是这段代码: public string[] GetSheetNames(string excelPath) { try {
public string[] GetSheetNames(string excelPath) {
try
{
string[] ar = null;
if (Path.GetExtension(excelPath) == ".xls")
{
conString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"");
}
else if (Path.GetExtension(excelPath) == ".xlsx")
{
conString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
}
using (oleConn = new OleDbConnection(conString))
{
oleConn.Open();
if (oleConn.State == ConnectionState.Open)
{
//DataTable dt = oleConn.GetSchema("Tables");
//DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] {null, null, null, "TABLE"});
DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (dt == null)
{
return null;
}
ar = new string[dt.Rows.Count];
int t = 0;
foreach(DataRow dr in dt.Rows){
ar[t] = dr["TABLE_NAME"].ToString();
t++;
}
}
return ar;
}
}
catch (Exception)
{
throw;
}
}
它抛出一个异常,表示DataTable的行计数为0。我还使用了DataTable dt=oleConn.GetSchema(“表”)
和
DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new Object[] {null, null, null, "TABLE"});
但他们都是一样的
有什么问题吗?可能是Excel文件吗?但我尝试了其他Excel文件,但都失败了。请尝试以下代码:
OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0 xml;HDR=YES;'");
connection.Open();
DataTable Sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow dr in Sheets.Rows)
{
string sht = dr[2].ToString().Replace("'", "");
OleDbDataAdapter dataAdapter = new OleDbDataAdapter("select * from [" + sht + "]", connection);
}
我不知道你是否还需要选择,但这发生在我身上,我得到了一个解决方案 我的问题是文件本身,当复制到本地文件夹时,我没有添加扩展名,因此当连接打开时,它会创建一个没有工作表的空文件(没有可读取的表)
如果要将文件移动到本地文件夹,请查看该文件是否已损坏,以及副本后是否有内容需要读取。bro,我需要获取工作表名称,而不是在特定工作表中查询。甚至无法进入我的foreach循环,因为行数为0。我检查了此代码及其工作,检查excel加载文件它有助于提供答案的解释,而不仅仅是代码转储。我跟踪您的代码并使用.xls和.xlsx文件进行检查。它工作正常。它有助于解释您的答案,而不仅仅是代码转储。您是否可以发布
DataTable dt
的调试可视化工具?这是导致此错误的可能原因之一。文件路径或文件名可能错误。也许这可以帮助别人。
private DataSet GetExcelWorkSheet(string pathName, string fileName, int workSheetNumber)
{
OleDbConnection ExcelConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + @"\" + fileName + ";Extended Properties=Excel 8.0;");
OleDbCommand ExcelCommand = new OleDbCommand();
ExcelCommand.Connection = ExcelConnection;
OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand);
ExcelConnection.Open();
DataTable ExcelSheets = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
string SpreadSheetName = "[" + ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString() + "]";
DataSet ExcelDataSet = new DataSet();
ExcelCommand.CommandText = @"SELECT * FROM " + SpreadSheetName;
ExcelAdapter.Fill(ExcelDataSet);
ExcelConnection.Close();
return ExcelDataSet;
}