Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OleDB从Excel工作表(扩展名为.xlsm的文件)检索第一列的值_C#_Excel_Oledb - Fatal编程技术网

C# 使用OleDB从Excel工作表(扩展名为.xlsm的文件)检索第一列的值

C# 使用OleDB从Excel工作表(扩展名为.xlsm的文件)检索第一列的值,c#,excel,oledb,C#,Excel,Oledb,我试图从Excel工作表中检索名为“SP$”的第一列的值 我有一条路: string path = @"C:\Users\atsurkanu\Desktop" + @"\TemplateClientExtraction_IDEAFIMIT_Conero_QUARTER_20170127.xlsm"; string connectionString = string.Format(@"provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extende

我试图从Excel工作表中检索名为“SP$”的第一列的值

我有一条路:

string path = @"C:\Users\atsurkanu\Desktop" + @"\TemplateClientExtraction_IDEAFIMIT_Conero_QUARTER_20170127.xlsm";
string connectionString = string.Format(@"provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extended Properties=Excel 12.0;", path);
string sheetName = "SP$";
还有一些像这样的代码:

using (OleDbConnection con = new OleDbConnection(connectionString))
        {
            try
            {                   
                var dataTable = new DataTable();

                con.Open();
                var tableschema = con.GetSchema("Tables");
                var firstsheet = tableschema.Rows[0]["SP$"].ToString();
                string name_query = "SELECT A4 FROM [" + firstsheet + "]";
                OleDbDataAdapter da = new OleDbDataAdapter(name_query, con);
                da.Fill(dataTable);
                con.Close();
但它不起作用。请告诉我如何从Excel工作表中检索第一列

更新: 我不确定它是如何工作的,但它有助于:

var dataTable = new DataTable();

                con.Open();
                var tableschema = con.GetSchema("Tables");

                // To get the first sheet name you use the first row and the column named TABLE_NAME
                var firstsheet = tableschema.Rows[0]["TABLE_NAME"].ToString();

                string name_query = "SELECT F1 FROM [" + "SP$" + "] WHERE F1 <> ''";
                OleDbDataAdapter da = new OleDbDataAdapter(name_query, con);
                da.Fill(dataTable);

                foreach (DataRow dataRow in dataTable.Rows)
                {
                    foreach (var item in dataRow.ItemArray)
                    {
                        listWithElementsFromSPfirstColumn.Add((string)item);
                    }
                }
var dataTable=new dataTable();
con.Open();
var tableschema=con.GetSchema(“表”);
//要获取第一个图纸名称,请使用第一行和名为TABLE_name的列
var firstsheet=tableschema.Rows[0][“TABLE_NAME”].ToString();
string name_query=“从[“+”SP$“+”]中选择F1,其中F1为“”;
OleDbDataAdapter da=新的OleDbDataAdapter(名称\u查询,con);
da.填充(数据表);
foreach(dataTable.Rows中的DataRow-DataRow)
{
foreach(dataRow.ItemArray中的变量项)
{
ListWithElementsFromsFirstColumn.Add((字符串)项);
}
}
您不能使用“A4”,希望OleDb理解Excel的行/列约定。对于OleDb,工作表只是一个DataTable,您需要将其全部加载或提供WHERE条件以筛选要检索的行

不清楚您的工作表是否有标题。您需要在连接字符串中添加键HDR=NO或HDR=YES。如果缺少标题,则OleDb会自动指定带有F1、F2、F3等的列名。 因此,您可以使用类似以下内容查询工作表,或将F1更改为A列的标题

using (OleDbConnection con = new OleDbConnection(connectionString))
{
    try
    {                   
        var dataTable = new DataTable();

        con.Open();
        var tableschema = con.GetSchema("Tables");

        // To get the first sheet name you use the first row and the column named TABLE_NAME
        var firstsheet = tableschema.Rows[0]["TABLE_NAME"].ToString();

        string name_query = "SELECT F1 FROM [" + firstsheet + "] WHERE F1 <> ''";
        OleDbDataAdapter da = new OleDbDataAdapter(name_query, con);
        da.Fill(dataTable);
   }
   catch .....
}
使用(OleDbConnection con=新的OleDbConnection(connectionString))
{
尝试
{                   
var dataTable=新的dataTable();
con.Open();
var tableschema=con.GetSchema(“表”);
//要获取第一个图纸名称,请使用第一行和名为TABLE_name的列
var firstsheet=tableschema.Rows[0][“TABLE_NAME”].ToString();
string name_query=“从[“+firstsheet+”]中选择F1,其中F1为“”;
OleDbDataAdapter da=新的OleDbDataAdapter(名称\u查询,con);
da.填充(数据表);
}
抓住。。。。。
}

现在,您可以阅读数据表并使用F1列(Excel的A列)的内容了。

到底什么不起作用?您是否有任何错误/异常?A4和SP$是什么?它们是否表示要检索的单元格以及用作表的工作表的名称?A4-调用的名称,我要从中开始检索数据(A4->A5->A6),依此类推。原因是——因为A1、A2、A3是空的。SP$-电子表格中工作表的名称。此外,我还有一些表名:成本、建筑等。我认为查询中的表名应使用
$
后缀:
string name\u query=“从[“+firstsheet+”$”中选择A4”。以及
tableschema.Rows[0][“SP$”]
返回的值是什么?