C# 使用OLEDB读取列excel工作表的查询

C# 使用OLEDB读取列excel工作表的查询,c#,excel,oledb,rowcount,C#,Excel,Oledb,Rowcount,我对OleDB和excel文件一无所知。我的工作表有3列(姓名-姓氏-电子邮件地址),我需要: 知道行数吗 读取第三列中的所有地址 逐个提取每个地址 我使用OpenFileDialog对象(ofd)和文本框(excel)来显示所选文件。这是我的代码: if (ofd.ShowDialog() == DialogResult.OK) { excel.Text = ofd.FileName; connection = "Provider=Microsoft.ACE.OLEDB.1

我对OleDB和excel文件一无所知。我的工作表有3列(姓名-姓氏-电子邮件地址),我需要:

  • 知道行数吗
  • 读取第三列中的所有地址
  • 逐个提取每个地址
我使用OpenFileDialog对象(ofd)和文本框(excel)来显示所选文件。这是我的代码:

if (ofd.ShowDialog() == DialogResult.OK)
{
    excel.Text = ofd.FileName;
    connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excel.Text + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\"";
    conn.ConnectionString = connection;
    conn.Open();
    string name_query = "SELECT A FROM[" + ofd.SafeFileName + "]";
    OleDbDataAdapter da = new OleDbDataAdapter(name_query, conn);
    da.Fill(table);
    conn.Close();
    j = table.Rows.Count;
}
它不工作,在“FROM…”中有一个查询问题。我通常阅读这种类型的查询:

"SELECT * FROM [Sheet1$]"
但是我找不到确切的
Sheet1$
。有人能给我解释一下正确的问题吗

2) 要访问表的每个元素(它只包含第三列)并将其保存在字符串变量中,我必须做什么


非常感谢

要获取sheetnames,可以使用数据提供程序(connection.getschema)的默认getschema功能。 如果没有列标题(HDR=NO),则列的名称为F1、F2等,因此对于第三个字段,可以查询F3。如果您想完全确定,还可以使用getschema来获取使用第一个getschema找到的工作表/表的列名。 最后,要获取字符串列表中的值,可以使用一点Linq(参见示例中的stringlist)。不确定您是指单个字符串值,但如果是这种情况,可以在linq select上使用string.join

组合代码起始形式连接打开:

conn.Open();
var tableschema = conn.GetSchema("Tables");
var firstsheet = tableschema.Rows[0]["TABLE_NAME"].ToString();
string name_query = "SELECT F3 FROM [" + firstsheet + "]";
OleDbDataAdapter da = new OleDbDataAdapter(name_query, conn);
da.Fill(table);
conn.Close();
j = table.Rows.Count;
var stringlist = table.Rows.Cast<DataRow>().Select(dr => dr[0].ToString()).ToList();
conn.Open();
var tableschema=conn.GetSchema(“表”);
var firstsheet=tableschema.Rows[0][“TABLE_NAME”].ToString();
string name_query=“从[“+firstsheet+”]中选择F3”;
OleDbDataAdapter da=新的OleDbDataAdapter(名称\查询,conn);
da.填写(表格);
康涅狄格州关闭();
j=table.Rows.Count;
var stringlist=table.Rows.Cast().Select(dr=>dr[0].ToString()).ToList();

要获取图纸名称,可以使用数据提供程序(connection.getschema)的默认getschema功能。 如果没有列标题(HDR=NO),则列的名称为F1、F2等,因此对于第三个字段,可以查询F3。如果您想完全确定,还可以使用getschema来获取使用第一个getschema找到的工作表/表的列名。 最后,要获取字符串列表中的值,可以使用一点Linq(参见示例中的stringlist)。不确定您是指单个字符串值,但如果是这种情况,可以在linq select上使用string.join

组合代码起始形式连接打开:

conn.Open();
var tableschema = conn.GetSchema("Tables");
var firstsheet = tableschema.Rows[0]["TABLE_NAME"].ToString();
string name_query = "SELECT F3 FROM [" + firstsheet + "]";
OleDbDataAdapter da = new OleDbDataAdapter(name_query, conn);
da.Fill(table);
conn.Close();
j = table.Rows.Count;
var stringlist = table.Rows.Cast<DataRow>().Select(dr => dr[0].ToString()).ToList();
conn.Open();
var tableschema=conn.GetSchema(“表”);
var firstsheet=tableschema.Rows[0][“TABLE_NAME”].ToString();
string name_query=“从[“+firstsheet+”]中选择F3”;
OleDbDataAdapter da=新的OleDbDataAdapter(名称\查询,conn);
da.填写(表格);
康涅狄格州关闭();
j=table.Rows.Count;
var stringlist=table.Rows.Cast().Select(dr=>dr[0].ToString()).ToList();

我添加了它,但它不工作(在“da.Fill(table)”中出错)。那个“表格”字符串是什么?还有“表名”?第一张?在excel上使用OLEDB时,工作表被解释为表格。因此,查询表模式中的表名将返回表名。tableschema.Rows[0]返回包含第一个表信息的datarow。[“TABLE_NAME”]调用datarow上名为TABLE_NAME的列索引,其中包含工作表的名称。我添加了它,但它不起作用(在“da.Fill(TABLE)”处出错)。那个“表格”字符串是什么?还有“表名”?第一张?在excel上使用OLEDB时,工作表被解释为表格。因此,查询表模式中的表名将返回表名。tableschema.Rows[0]返回包含第一个表信息的datarow。[“TABLE_NAME”]调用datarow上名为TABLE_NAME的列索引,其中包含工作表的名称。