【发布时间】:2019-06-28 07:03:53
【问题描述】:
这是我的GetData 方法:
private DataTable GetData(string userFileName)
{
string dirName = Path.GetDirectoryName(userFileName);
string fileName = Path.GetFileName(userFileName);
string fileExtension = Path.GetExtension(userFileName);
string connection = string.Empty;
string query = string.Empty;
switch (fileExtension)
{
case ".xls":
connection = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={userFileName};" +
"Extended Properties=\"Excel 8.0; HDR=Yes; IMEX=1\"";
query = "SELECT * FROM [Sheet1$]";
break;
case ".xlsx":
connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={userFileName};" +
"Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=1\"";
query = "SELECT * FROM [Sheet1$]";
break;
case ".csv":
connection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dirName};" +
"Extended Properties=\"text; HDR=Yes; IMEX=1; FMT=Delimited\"";
query = $"SELECT * FROM [{fileName}]";
break;
}
return FillData(connection, query);
}
它适用于.csv 文件,因为它使用文件名而不是工作表名。
它适用于具有名为 Sheet1 的工作表的 .xls 和 .xlsx 文件。
当我尝试使用具有不同工作表名称的 .xls/.xlsx 文件时,我收到以下错误:
System.Data.OleDb.OleDbException:“Sheet1$”不是有效名称。确保它不包含无效字符或标点符号,并且不要太长。'
另一个问题的答案:
using (OleDbConnection conn = new OleDbConnection(connString))
{
conn.Open();
dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME");
}
没有帮助,因为我不知道这应该放在我的代码中的什么位置,也没有任何迹象表明应该放在哪里。
我是这样添加的吗?
string Sheet1 = dataGridView1.Rows[0].Field<string>("TABLE_NAME");
这给了我一个错误:
错误 CS1929“DataGridViewRow”不包含“Field”的定义,并且最佳扩展方法重载“DataRowExtensions.Field(DataRow, string)”需要“DataRow”类型的接收器
【问题讨论】:
-
@woldemar 该链接没有为我提供解决问题所需的解释。
-
@Matt
string Sheet1 = **dataGridView1**.......wtf 你在做什么? :) 答案中没有任何网格视图。我认为您正在使用FillData方法打开连接,打开您的连接并在其上调用var dtSchema = conn.GetOleDbSchemaTable等 -
只是添加@woldemar 已经写了大部分想法...重复的答案只是指出您需要获取表架构并且列名“TABLE_NAME”的第一行将包含 Excel Sheet1名称,您可以在查询中使用。
标签: c# excel winforms datatable openfiledialog