使用OleDb更新Excel工作表

本文关键字:工作 Excel 更新 OleDb 使用 | 更新日期: 2023-09-27 18:28:38

我正在尝试更新Excel工作表的单个单元格。请注意,在下面的示例代码中,我为列和行使用变量,因为这将根据程序的其他部分而更改,但出于调试目的,我已将它们分别设置为A和1。

现在我收到一个错误,说"查询表达式‘06:31 PM’中的语法错误(缺少运算符)。

请不要简单地建议我参数化,因为我知道这不会解决我的问题,而且我不担心注射。

提前感谢大家。

        string newColumn = "A";
        string newRow = "1";
        string worksheet2 = strMonth;
        var cnnStr2 = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='"Excel 8.0;IMEX=1;HDR=NO'"", textBox1.Text);
        var cnn2 = new OleDbConnection(cnnStr2);
        cnn2.Open();
        string sql2 = String.Format("UPDATE [{0}$] SET {1}{2}={3}", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));
        OleDbCommand objCmdSelect = new OleDbCommand(sql2, cnn2);
        objCmdSelect.ExecuteNonQuery();
        cnn2.Close();

编辑:根据Gerhard建议的链接,我已将命令文本更改为以下内容:

string sql2 = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));

这现在会产生错误"操作必须使用可更新的查询"。不确定现在该怎么办。{1}{2}:{1}{2}给出了工作表{0}$上的单个单元格范围,如果在HDR=no的连接字符串中没有指定列名,则F1是给定的默认列名。最后,{3}是我更新单元格时使用的子字符串,并且使用单引号,因为这似乎是每个人都要做的事情。如果我删除单引号,只会产生不同的错误。

使用OleDb更新Excel工作表

我编辑的命令字符串是正确的。然而,为了消除新的错误,我不得不在连接字符串中去掉"IMEX=1"。不是100%确定为什么这会让它起作用,但它确实起作用了。

在查找有关使用oledb命令的信息时,我注意到有一件事,很多人和我一样,似乎对命令的每个部分的实际作用感到困惑。我仍然不完全理解你可以添加到其中的一些特殊内容,比如"哪里",但我想在这里添加一些内容,以帮助任何发现这个问题并有类似问题的人。

在SELECT语句中,如果你想选择一个单元格,你可以使用这样的东西:

string commandString = String.Format("SELECT * FROM [{0}${1}{2}:{1}{2}]", worksheetName, column, row);

"SELECT*FROM"将从"worksheetName"中选择所有内容。然后,您必须在工作表的名称后面加上"$"。接下来,"{1}{2}:{1}{2}"是您要选择的单元格范围。在这里,通过使冒号两侧的列和行相同,可以选择单个单元格的范围。例如,"E3:E3"将只选择单元格E3中的内容。

在UPDATE语句中,如果您想更新单个单元格,可以使用以下内容:

string commandString = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'",worksheetName, column, row, data);

这里需要注意的唯一区别是"SET F1='{3}'"。这将把您在区域中指定的单元格设置为数据变量中的单元格。注意"F1"的用法。这只是在连接字符串中指定"HDR=NO"时使用的默认值,换句话说,没有列标题或名称。如果你有列标题,你会用它来代替F1。重要的是要理解F1在任何方面都不对应于细胞F1。

我花了一个周末的时间来解决这个问题。终于,我下定决心了。我将连接字符串更改为:

Microsoft.Jet.OLEDB.4.0;数据源="文件路径";扩展属性="异常8.0"

WITH OUT IMEX或HDR选项。之前,我在excel文件中检查并更改了cellprotection检查。我希望这能帮助其他人。