2010-10-26 2 views
0

Мое программирование доступа немного ржавое, & Я никогда не работал с файлами Excel так много.Получение смешанных табличных и не табличных данных из Excel в Access

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

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

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

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

+1

Должно быть возможно использовать ADO для области заголовка. Набор записей может быть не меньше одной ячейки. ADO, скорее всего, будет быстрее, чем автоматизация. – Fionnuala

+0

Сколько файлов мы говорим? Из вашего описания это похоже на слишком много, чтобы справиться с копированием и вставкой. – PowerUser

+0

@ Remou - Я предполагаю, что знал это, но не думал об этом. Я рассмотрю это .... – RolandTumble

ответ

1

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

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

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

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

У меня нет никакой потребности или желания сохранить копию данных Access, как указано в электронной таблице. Могу ли я получить достаточное преимущество по скорости, переместив электронную таблицу, полностью обработав ее в нормализованные таблицы в Access и удалив таблицу импорта, чтобы сделать ее полезной (в отличие от любого из моих исходных параметров)? – RolandTumble

+0

Я упустил вашу точку зрения, что структура таблицы Access не будет соответствовать макету электронной таблицы. Таким образом, я не буду импортировать непосредственно в промежуточную таблицу. С любым из этих других вариантов, которые вы рассматриваете, вы можете написать только то, что хотите сохранить там, где хотите его сохранить. Это должно быть быстрее, чем писать промежуточную таблицу в дополнение к остальным. – HansUp

+0

Я принял этот ответ как можно ближе к моей собственной склонности, так как никто из них не дал мне определенности «х лучше, чем у». О, и для обозначения имен полей. Спасибо всем. – RolandTumble

0

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

0

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

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

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

1

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

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

На самом деле я не отношусь к моему подзаголовку, но хорошая мысль иметь в виду. – RolandTumble

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