2010-07-15 5 views
1

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

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

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

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

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(); 
+0

Я думаю, что вы должны использовать INSERT INTO вместо UPDATE, так как ячейки фактически не содержат никаких данных и поэтому не могут быть обновлены. Работает ли ваш код на электронной таблице, которая уже содержит данные? Возможно, я ошибаюсь, поэтому не спрашивайте меня. – Tester101

+0

Когда я пытаюсь сделать «INSERT INTO [Sheet1 $] (F1, F2, F3) VALUES (4,5,6)« Я получаю сообщение о том, что F2 не существует и данные не добавляются. – Serg

ответ

7

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

Кроме того, вы должны проверить это Microsoft KB article для чтения/записи в 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 вставляет строку при создании листа, который имеет имена заголовков строк. Кажется, я не могу найти способ обойти это, кроме как после того, как я вставляю все и удаляю первую строку. Не очень элегантный.

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

+0

Проблема в том, что если я добавлю новый лист в документ, у меня теперь будет более 1 листа ... Я пытаюсь иметь только 1 лист после ввода данных. Если я создам таблицу, мне нужно как-то отказаться от таблицы, но команда drop не работает для меня. Любые идеи, как просто иметь 1 лист? – Serg

+0

Изменен код для использования существующего листа из книги по умолчанию (с 3 листами). Это не добавит новые листы в книгу. Если вы используете код, который у меня был раньше, он создаст книгу с одним листом (протестированным в Excel 2010 и 2007). Дайте мне знать, если у вас остались вопросы или я не полностью понимаю проблему. Благодаря!! –

+0

Спасибо большое! Я не знал, что $ работал так. Я также обнаружил, что если файл не существует, то новый действительно создается. – Serg

Смежные вопросы