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

时间:2017-10-27 08:50:32

标签: c# excel oledb

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

我有路径:

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);
                    }
                }

1 个答案:

答案 0 :(得分:0)

您无法使用&#34; A4&#34;并希望OleDb理解Excel的行/列约定。对于OleDb,工作表只是一个DataTable,您需要加载它或提供WHERE条件来过滤要检索的行。

目前尚不清楚您的工作表是否有HEADER。您需要将关键字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 .....
}

现在由您来阅读数据表并使用列F1的内容(Excel的A列)