使用OleDb更新Excel表

时间:2013-08-22 22:38:24

标签: c# excel oledb oledbcommand

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

现在我在查询表达式'下午06:31'中收到错误说#34;语法错误(缺少运算符)。

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

先谢谢大家。

        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} $上的单个单元格区域,如果没有我在连接字符串中指定的列名称,则F1是默认的列名称=没有。最后,{3}是我更新单元格的子字符串,并且是单引号,因为这是每个人似乎都做的事情。如果我删除单引号,它只会产生不同的错误。

2 个答案:

答案 0 :(得分:1)

我编辑的命令字符串是正确的。但是为了摆脱新的错误,我不得不在连接字符串中取出“IMEX = 1”。不是100%肯定为什么这会使它发挥作用,但确实如此。

在查看有关使用oledb命令的事情时,我注意到的一件事是许多人,比如我,似乎与命令的每个部分实际上正在做的事情相混淆。我仍然不完全理解你可以添加的一些特殊的东西,比如“WHERE”,但是我想在这里添加一些内容来帮助那些发现这个问题并且遇到类似问题的人。

在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。

答案 1 :(得分:0)

我花了一个周末来解决这个问题。最后,我可以解决。我将连接字符串更改为:

Microsoft.Jet.OLEDB.4.0;数据源='文件路径&#39 ;;扩展属性=' Excel 8.0'

WITH OUT IMEX或HDR选项。 以前,我检查并更改了excel文件中的cellprotection检查。我希望这有助于他人。