Сравните строки в электронной таблице с записями в базе данных

У меня есть электронная таблица Excel, предоставленная в качестве отчета, хотя на самом деле это скорее база данных, где номер строки действует как первичный ключ. Мне нужно сравнить некоторые столбцы в этом наборе с другим набором записей из базы данных Access 2007. Чтобы усложнить ситуацию, это нужно делать автоматически, без участия пользователя, по регулярному расписанию.

Как лучше всего получить данные из электронной таблицы и как лучше всего провести сравнение. Что касается получения данных из электронной таблицы, ACEDAO кажется лучшим вариантом, поскольку это Excel 2007, но в MSDN нет информации, которую я мог бы найти о том, как запрашивать Excel с помощью DAO/ACEDAO, только для экспорта в Excel с использованием DAO/ACEDAO. Что касается запуска сравнения, кроме сравнения каждого столбца каждой записи, я не могу найти лучшего способа сделать это.


person Andrew Scagnelli    schedule 30.06.2009    source источник
comment
Это разовая процедура? Если это так, вы можете импортировать лист Excel в базу данных Access с помощью Access и создавать SQL-запросы с помощью средства Access QBE для создания желаемого отчета.   -  person Bob Mc    schedule 30.06.2009
comment
Это не разовый процесс; он повторяется по установленному расписанию.   -  person Andrew Scagnelli    schedule 30.06.2009


Ответы (4)


Если память не изменяет, вы можете создать связанную таблицу с электронной таблицей Excel. Как только она будет связана с Access, вы сможете обращаться с ней как с любой другой таблицей.

Запрос для сравнения выглядит примерно так (см. рисунок ниже). Он вернет строки из электронной таблицы Excel, которые не совпадают (щелкните правой кнопкой мыши изображение и сохраните его на свой компьютер для более четкого просмотра).

Что касается автоматизации, если вы хотите оставить копию Access работающей, вы можете настроить таймер в форме. Если нет, вам придется использовать Office Automation. См. здесь пример "hello world" на C#:
http://rnararayana.blogspot.com/2008/02/access-2007-office-automation-using-c.html

альтернативный текст

person Robert Harvey    schedule 30.06.2009
comment
Спасибо за идею автоматизации офиса. Я планировал запустить макрос, запускающий обновления при запуске, и запускать эту БД в Access с помощью пакетного файла. - person Andrew Scagnelli; 01.07.2009
comment
Я создал эту структуру в запросе (СОЕДИНЯЙТЕСЬ СЛЕВА от таблицы к таблице, где ID равен NULL); однако он не проходит тест Is Null и возвращает все записи, а не отсутствующие в таблице. - person Andrew Scagnelli; 01.07.2009
comment
Чтобы строка была исключена из выходного набора, каждое из соединений должно совпадать со значениями с обеих сторон. Возможно ли, что одно из соединений указывает на неправильное поле с одной стороны? Начните с одного объединения, наблюдайте за пустым набором и добавляйте дополнительные объединения по одному, проверяя по мере продвижения. - person Robert Harvey; 01.07.2009
comment
Приведенная выше структура работает, ошибка возникла из другого источника (тестовые данные, а не SQL-запрос). Однако как можно было бы пойти в другом направлении (вернуть все записи в таблице, которых нет в связанной таблице), пока в таблице есть дополнительные столбцы, которых нет в связанной таблице. - person Andrew Scagnelli; 01.07.2009

Используя ACE, вы можете напрямую запрашивать книгу, например.

SELECT S1.seq AS seq_ACE, 
       S2.seq AS seq_Excel
  FROM Sequence AS S1
       LEFT OUTER JOIN [Excel 12.0;Database=C:\Test.xlsx;].Sequence AS S2
          ON S1.seq = S2.seq;
person onedaywhen    schedule 01.07.2009

Если листы Excel структурированы в виде списков, то ADO может подойти — дополнительная информация здесь


редактировать: здесь есть несколько различных возможных подходов

  • используйте ADO в Excel для чтения из базы данных Access и используйте VBA для сравнения возвращаемых значений с рабочим листом Excel. Вероятно, будет полезно только для простых сравнений относительно небольших наборов записей.

  • как описано в ответе Роберта Харви, сделайте рабочий лист Excel связанной таблицей в базе данных Access и запросите с помощью SQL, используя сам Access

  • с помощью ADO и ADOX сделайте рабочий лист Excel связанной таблицей в базе данных Access и запросите с помощью SQL, используя ADO в Excel

Я не знал, что DAO снова используется с Access 2007. Поскольку я использую Excel для подключения к базам данных, DAO уже давно устарел (причем ADO является предпочтительным методом подключения). теперь я знаю лучше

person barrowc    schedule 30.06.2009
comment
В предыдущем вопросе я спросил, будет ли лучше ADO или DAO, и ответом был DAO, поскольку ACEDAO является стандартом для ACEDB в Access 2k7: stackoverflow.com/questions/1039224/ - person Andrew Scagnelli; 01.07.2009
comment
В ответ на этот вопрос я ответил (перефразируя), что вы не должны использовать исключительно ACEDAO или исключительно ADO, а использовать то, что имеет смысл в каждом конкретном случае. В более чем 99% случаев между ними нет существенной разницы. Это программная инженерия, а не философия :) - person onedaywhen; 01.07.2009
comment
Совместимы ли наборы записей ADO и ACEDAO? - person Andrew Scagnelli; 01.07.2009
comment
'совместимый'? Ответ - нет, но почему вы думаете, что это имеет значение? - person onedaywhen; 01.07.2009
comment
Если они совместимы (то есть: их смешивание позволяет объекту ADO читать набор записей ACEDAO), то различие не имеет значения; но для текущего проекта это имеет значение, поскольку его нужно использовать. - person Andrew Scagnelli; 01.07.2009
comment
Набор записей ACEDAO не может прочитать набор записей ACEDAO. Как вы думаете, почему это происходит, т.е. что вы здесь делаете? - person onedaywhen; 02.07.2009
comment
Поскольку вы можете создать набор записей ADO, вы можете считывать в него данные в данных памяти, и эти данные в памяти могут быть набором записей ACEDAO, набором записей ADO и так далее. Таким образом, набор записей ADO более «совместим», чего бы это ни стоило. Но я не уверен, какова ваша конечная цель. - person onedaywhen; 03.07.2009

Я знаю, что меня за это захлопнут, потому что это не очень "программистски", но если это единичный случай, а результирующая таблица Access - просто временная рабочая копия данных для нескольких запросов, вы можете просто скопируйте/вставьте данные непосредственно в таблицу в режиме таблицы.

Это быстрый, грязный способ без излишеств, но он работает и требует очень мало дополнительной работы.

Примечание. Если таблица ДЕЙСТВИТЕЛЬНО большая или активно используется другими, возможно, вы не захотите этого делать. Это может быть медленным и привести к большому количеству блокировок.

person JohnFx    schedule 23.08.2010
comment
Это также может иметь непредсказуемые результаты в отношении целевых типов данных. Но вы правы, добавляя его в смесь для разовых посещений. - person David-W-Fenton; 23.08.2010
comment
Я использовал его миллион раз для таких запросов, как «Можете ли вы удалить все элементы из TableX с одним из кодов продуктов, перечисленных в прикрепленной таблице?» - person JohnFx; 23.08.2010