使用OleDB从Excel工作表(扩展名为.xlsm的文件)中检索第一列的值
我试图从名为“SP $”的Excel工作表中检索第一列的值。
我有path:
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); } }
您不能使用“A4”,并希望OleDb了解Excel的行/列约定。 对于OleDb,工作表只是一个DataTable,您需要全部加载或提供WHERE条件来过滤要检索的行。
目前还不清楚您的工作表是否有HEADER。 您需要将HDR = NO或HDR = YES添加到连接string中。 如果标题丢失,则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列)