Получение смешанных табличных и не табличных данных из Excel в Access - PullRequest
0 голосов
/ 26 октября 2010

Мои программы доступа немного ржавые, и я так много не работал с файлами Excel.

У меня есть требование перенести данные из таблиц Excel в Access 2007. Эти таблицы имеют фиксированный (предсказуемый) формат, но в них есть «область заголовка», где мне нужно прочитать отдельные элементы данных из определенных ячеек, после чего масса табличных данных (~ 500 строк в одном примере, который я видел до сих пор). Я буду обрабатывать все это в виде набора таблиц, которые нормализуются совершенно иначе, чем плоская структура электронной таблицы.

Я знаю, как открыть набор записей ADO для табличных данных, и он должен работать довольно хорошо для моих целей. Я также полагаю, что могу ссылаться на объектную модель Excel и открывать листы с помощью автоматизации, чтобы получить элементы данных «области заголовка».

У меня такой вопрос: поскольку я должен (я думаю) использовать подход автоматизации для «области заголовка», мне лучше просто оставить его открытым в этом режиме, чтобы перейти к табличным данным (с ячейкой / диапазоном) навигация), или закрытие этого режима и переход на ADO? Я подозреваю, что это последнее - и мне будет удобнее с этим - но я не хочу делать неправильные вещи только потому, что это более знакомо.

Редактировать Кажется, мне неясно, нужно ли мне встраивать эту возможность в «приложение», как то, что пользователь может повторить в дальнейшем. Я уверен, что могу доверять формату электронной таблицы (хотя я включу перехват ошибок при постепенном сбое, если это окажется ложным). Эти таблицы являются «официальными проектными документами» для аппаратного обеспечения, и моему приложению необходимо обрабатывать добавление новых и / или обновленных документов, чтобы отслеживать вещи, описанные в табличных данных, способами, которые не допускаются в плоском формате Excel. 1011 *

Ответы [ 4 ]

1 голос
/ 27 октября 2010

Если информация заголовка действительно сложная, это может упростить вашу работу по кодированию:

  1. В официальном файле Excel дизайна создайте скрытую вкладку.
  2. На этой вкладке сделайтетаблица из 1 строки, соединяющая все интересующие вас элементы заголовка (т. е. установите для строки 1 столбца 1 значение «Документ №», а для строки 2 столбца 1 - лист 1: А1)
  3. Затем вы можете повторноиспользуйте ту же процедуру VBA, чтобы импортировать как табличные данные, так и данные заголовка.
1 голос
/ 26 октября 2010

Из этих двух вариантов я бы выбрал второй просто потому, что мне удобнее работать с набором записей ADO.Это должно быть довольно просто, если вы можете назначить именованный диапазон табличным данным вашей таблицы.

Редактировать : Если ваша таблица содержит имена полей, подход набора записей будет менее подвержен разрыву из-заизменения в электронной таблице, такие как один или несколько новых столбцов, вставленных перед или между существующими столбцами, или переупорядочение существующих столбцов.

Но на самом деле, я думаю, Метод TransferSpreadsheet может быть более удобным.Вы можете указать диапазон электронной таблицы как именованный диапазон или по адресу ячейки, как в этом примере со связанной страницы:

DoCmd.TransferSpreadsheet acImport, 3, _
    "Employees","C:\Lotus\Newemps.wk3", True, "A1:G12"

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

Edit2 : создание ссылки (acLink вместо acImport) с TransferSpreadsheet позволит вам выполнить SQLзаявления против таблицы ссылок:

INSERT INTO DestinationTable (field1, field2, field3)
SELECT foo, bar, bat FROM LinkedTable;
0 голосов
/ 27 октября 2010

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

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

Я не уверен, рекомендую ли я это или нет, но это действительно довольно просто, не требуя много кода.

0 голосов
/ 26 октября 2010

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

...