使用 SQL 来操作 Excel 没有太多特殊的,但最特殊的一点是 SQL 语句 FROM 后面的表名,如何使用呢?
方法一,使用 Excel 中的表名加美元符号。
string sql = @"select * from [Sheet1$]";
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
Server.MapPath("foo.xls") + ";" +
"Extended Properties='Excel 8.0;HDR=NO;'");
conn.Open();
OleDbCommand cmd = new OleDbCommand(sql, conn);
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Response.Write(reader.GetString(0) + "<br />");
}
reader.Close();
reader.Dispose();
cmd.Dispose();
conn.Close();
conn.Dispose();
方法二,在 Excel 中指定区域。
打开 Excel,选中要操作的一个或多个单元格,单击右键,单击“命名单元格区域”,假如我们将其命名为 Range1,在 SQL 语句中 Range1 就是表名了。
示例:
string sql = @"update [Range1] set F1='foo'";
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
Server.MapPath("foo.xls") + ";" +
"Extended Properties='Excel 8.0;HDR=NO;'");
conn.Open();
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
conn.Dispose();
执行上述语句后,区域 Range1 中的第一列内容就全部变成 foo 了。
方法三,在 SQL 语句中指定区域。
在 Excel 的表名后加美元符号,再加起始单元格编号,冒号,结束单元格编号。
string sql = @"update [Sheet1$C2:D10] set F1='foo'";
如果起始单元格和结束单元格相同,则表示只处理该单元格。
说明
打开 Excel 的空白表,可以看到很多单元格,我们可以在任何一个单元格中写数据。但对于使用上面这种方式来操作 Excel 就要克服这一观念,要始终把它看作一个数据库,一个空白表,它是没有任何数据的,而不是空白数据。
比如只有三行数据,我们现在要 UPDATE 第四行的数据,对第四行就不会有影响,因为第四行根本不存在。
但如果我们把第五行的单元格边框设置一下,或者把第四行写点数据(写了再删除也可以),此时就相当于执行了数据填充,第四行就可以被更新了。