C# 更新Excel 2010,但不更改行

C# 更新Excel 2010,但不更改行,c#,sql,sql-update,oledb,excel-2010,C#,Sql,Sql Update,Oledb,Excel 2010,我想用以下代码使用OLEDB更新Excel 2010文件 我发现当我调试这段代码时,没有例外,但是excel文件列(状态)的内容没有更新,有人能帮我吗 另外,sql语句如下所示: 更新[Sheet1$]设置Status='Imported',其中Status位于(从[Sheet1$]中选择前5位状态) 知道要找到解决这些神秘问题的方法有多困难,我建议您发布excel文件的摘录。此外,我需要知道GetExcelConnectionStringByWrite(文件路径)中发生了什么 由于这些项目不存

我想用以下代码使用OLEDB更新Excel 2010文件

我发现当我调试这段代码时,没有例外,但是excel文件列(状态)的内容没有更新,有人能帮我吗

另外,sql语句如下所示:

更新[Sheet1$]设置Status='Imported',其中Status位于(从[Sheet1$]中选择前5位状态)


知道要找到解决这些神秘问题的方法有多困难,我建议您发布excel文件的摘录。此外,我需要知道GetExcelConnectionStringByWrite(文件路径)中发生了什么

由于这些项目不存在,我只能给出两个常见的原因:

  • 连接字符串中的HDR部分未设置为“是”,并且您的提供商不知道任何标头名称
  • 提供者将检查前八行中的列数据类型->您的工作表是否在这八行中提供了足够的数据值
问候
Jan

我使用了完全相同的代码,但做了如下细微的修改,并按要求运行

之前:

 COLUMN A has fieldname called Status
 A1 Status
 A2 A
 A3 B
 A4 C
 A5 D
 A6 E
 A7 F
代码:

之后:

 COLUMN A has fieldname called Status
 A1 Status
 A2 Imported
 A3 Imported
 A4 Imported
 A5 Imported
 A6 Imported
 A7 F

你好,Jan,函数GetExcelConnectionStringByWrite(文件路径)将返回一个字符串:Provider=Microsoft.ACE.OLEDB.12.0;数据源=D:\\\\Michael\\\\Project1\\\\Test.xlsx;扩展属性=\“Excel 12.0;HDR=YES;IMEX=0;MAXSCANROWS=10;READONLY=FALSE\”,Test.xlsx有标题和1000多行。我已经测试了sql“UPDATE[Sheet1$]SET Status='Imported'”的工作原理。Excel的OLEDB似乎不支持“UPDATE[Sheet1$]SET Status='Imported'(从[Sheet1$]中选择前5个状态)”SQL语句。似乎Excel不是Oracle:-)谢谢zfus,我想可能我的OLEDB驱动程序不正确,我的操作系统是Win7 64位,Office 2010是32位。所以OLEDB驱动程序是32位!我在64位Win7+32位office上成功运行了上述代码。当您使用一个新的简单XLSX文件尝试上述代码时会发生什么情况?@Michael我已将a解决方案上载到。继续下载并点击Raw。解压缩、打开项目并运行应用程序。Test.xlsx位于bin/debug和bin/release目录中。检查项目是否运行良好。嗨,zfus,谢谢你的分享。你的代码没有引发与我之前编写的相同的异常,不幸的是,test.xlsx文件无法在我的笔记本电脑上更新为“导入”。我不知道为什么。嗨@Michael,你正在打开StackOverflow18627032/bin/Debug目录下的test.xlsx吗?如果是,请在Excel中打开它,并更改单元格中的某些信息,保存它,然后重试。我很好奇为什么更新不能在你的电脑上运行。
using System;
using System.Data.OleDb;

namespace StackoverflowExcel
{
    class Program
    {
        static void Main()
        {

            using(var myConnection = new OleDbConnection(GetExcelConnectionStringByWrite()))
            using (var myCommand = new OleDbCommand())
            {
                myConnection.Open();

                myCommand.Connection = myConnection;
                myCommand.CommandText =
                    "UPDATE [Sheet1$] SET Status ='Imported' WHERE Status IN ( SELECT TOP 5 Status FROM [Sheet1$] )";
                myCommand.ExecuteNonQuery();
                myConnection.Close();
            }

            Console.WriteLine("Done");
            Console.ReadKey();
        }

        private static string GetExcelConnectionStringByWrite()
        {
            return
                @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\users\cys\desktop\Test.xlsx;Extended Properties='Excel 12.0;HDR=YES;IMEX=0;MAXSCANROWS=10;READONLY=FALSE'";
        }

    }
}
 COLUMN A has fieldname called Status
 A1 Status
 A2 Imported
 A3 Imported
 A4 Imported
 A5 Imported
 A6 Imported
 A7 F