Запись на чистый лист Excel с ADO.NET - PullRequest
2 голосов
/ 15 июля 2010

Я пытаюсь использовать ADO.NET для подключения и записи в файл Excel. Я создал пустой файл со стандартными листами Excel (я также пытался использовать пользовательский лист).

По какой-то причине я не могу записать полный ряд данных на лист. Если я создаю новый лист, он работает нормально, однако у меня слишком много листов, и я не могу удалить листы.

Есть ли что-то особенное, что вам нужно сделать, чтобы записать строку данных на чистый лист?

Я пытаюсь сделать:

path= the path including my file. 

connString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=NO;\"", Server.MapPath(path));

dbCmd.CommandText = "Update  [Sheet1$] Set F1 = 'Col1', F2 = 'Col2', F3 = 'Col3', F4 = 'Col4'";
dbCmd.ExecuteNonQuery(); 

1 Ответ

8 голосов
/ 16 июля 2010

Вот пример создания новой электронной таблицы, создания листа (Sheet1) и вставки в него строки. Большая часть этого примера основана на записи в блоге Дэвида Хейдена (отличная запись в блоге для этой задачи, кстати !!).

Кроме того, вам следует ознакомиться с этой статьей Microsoft KB для чтения / записи в Excel из ADO.NET - в ней действительно много деталей.

    //Most of this code was from David Hayden's blog:
    // http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx
    static void Main(string[] args)
    {
        string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\TestSO1.xls;Extended Properties=""Excel 8.0;HDR=NO;""";
        DbProviderFactory factory =
          DbProviderFactories.GetFactory("System.Data.OleDb");

        using (DbConnection connection = factory.CreateConnection())
        {
            connection.ConnectionString = connectionString;
            using (DbCommand command = connection.CreateCommand())
            {
                connection.Open();  //open the connection

                //use the '$' notation after the sheet name to indicate that this is
                // an existing sheet and not to actually create it.  This basically defines
                // the metadata for the insert statements that will follow.
                // If the '$' notation is removed, then a new sheet is created named 'Sheet1'.
                command.CommandText = "CREATE TABLE [Sheet1$] (F1 number, F2 char(255), F3 char(128))";
                command.ExecuteNonQuery();

                //now we insert the values into the existing sheet...no new sheet is added.
                command.CommandText = "INSERT INTO [Sheet1$] (F1, F2, F3) VALUES(4,\"Tampa\",\"Florida\")";
                command.ExecuteNonQuery();

                //insert another row into the sheet...
                command.CommandText = "INSERT INTO [Sheet1$] (F1, F2, F3) VALUES(5,\"Pittsburgh\",\"Pennsylvania\")";
                command.ExecuteNonQuery();
            }
        }
    }

Единственная проблема, которую я обнаружил, заключается в том, что, хотя в строке подключения указано, что заголовки не используются, вы все равно должны определить имена столбцов для своего листа, и ADO.NET вставляет строку при создании листа с именами заголовков строк , Я не могу найти способ обойти это, кроме как войти после того, как я вставил все и удалил первый ряд. Не очень элегантно.

Надеюсь, это поможет !! Дайте мне знать, если у вас есть другие вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...