Странное поведение при написании для Excel с оледом

Я просто пытаюсь написать что-нибудь в ячейке, но похоже, что количество строк увеличивается, даже если ячейка пуста. Например, у меня есть 20 ячеек, заполненных в столбце F1. Я вставляю в F1, теперь он заполнен 21 ячейкой. Затем я пытаюсь вставить F2, у которого есть пустые ячейки под ним, но он записывается в F2: 22. Разве он не должен вставляться в F2: 1? Надеюсь, я поняла.

Вот код:

string conStr = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\\sample.xls';Extended Properties=\"Excel 12.0;HDR=YES;\""; OleDbConnection oleDbCon = new OleDbConnection(conStr); oleDbCon.Open(); System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(); myCommand.Connection = oleDbCon; string sql = "Insert into [Sheet1$] (abc) values ('value')"; myCommand.CommandText = sql; myCommand.ExecuteNonQuery(); oleDbCon.Close(); 

Моя коллега Juliusz верна: каждый лист, действительно, рассматривается как таблица данных …

Но это не единственный способ определить «таблицу» в Excel: вы можете запросить именованный диапазон или явно указанный адрес в рабочей книге:

  SELECT * FROM [Sheet1$A1:F255] 

Если рабочая книга содержит именованный диапазон «MyTable», определенный как «= Sheet1! A1: F255», тогда можно запросить, как показано:

  SELECT * FROM [MyTable] 

Я бы рекомендовал вам протестировать вашу вставку в определенном диапазоне с некоторыми идентифицируемыми данными в ней, чтобы вы могли точно видеть, что происходит.

О, и слово мудрым: посмотрите, работает ли этот запрос со скрытыми экземплярами Excel.Exe или использует гораздо больше памяти, чем вы ожидали бы … И убедитесь, что это правильно очищается при выходе.

Каждый лист рассматривается как таблица базы данных, поэтому любые операции с ним выполняются на основе набора. Как указал Стив Велленс, если вы хотите поместить значение в столбец F2 на том же листе, вам нужно будет использовать синтаксис UPDATE.

Другой вариант – создать новый лист и поместить значения туда через INSERT. Наконец, вы можете добавить еще один лист, который мог бы объединить эти результаты вместе (что будет вести себя как VIEW в базе данных SQL)

Глядя на то, что вы делаете выше, вы добавляете новую строку в свою таблицу каждый раз, когда выполняете этот кусок кода.

Использование команды INSERT будет делать, как и следовало ожидать, вставить новую строку, даже если вы добавили данные без значения.

Если вы хотите обойти это, убедитесь, что значение вашего добавления не равно null или равно «», прежде чем вы назовете этот фрагмент кода.

Если вы используете графический интерфейс, проверьте значение перед отправкой изменений обратно в электронную таблицу.

  • Решите проблему с поставщиком "Microsoft.ACE.OLEDB.12.0" без установки "Microsoft Access Database Engine"
  • Зависимые ячейки Excel не обновляются автоматически
  • Запрошенная операция требует объекта OLE DB Session ... - Подключение Excel к SQL-серверу через ADO
  • Неверный брекетинг в вставке в команду excel с использованием c # и oledb?
  • C # Update Excel Использование Oledb datagridview
  • Как получить OleDb для чтения excel в основном проекте asp.net
  • C # - Получить NamedRanges определенного листа в Excel с помощью Oledb
  • .XLSX-файлы, не сгенерированные с помощью рабочих листов, имеющих записи более 8K
  • Ошибка загрузки файла Excel в ASP.NET
  • OLEDB записывает пространство в excel
  • Экспорт файла Excel с расширением .xlsx
  • Давайте будем гением компьютера.