FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9145
Вход
Считываение информации из неструктурированных EXCEL - документов? Легко!

Вашему вниманию предлагается техника, позволяющая достаточно просто решить проблемы импорта в БД информации из EXCEL документов произвольной структуры. Идея была когда-то воплощена в VB программу (мною-же), а теперь я сделал класс для VFP. Для демонстрации прилагается программа и тестовый XLS документ. С уважением, Jimmy


 
Прислал: Дмитрий Орлов   Категория: Foxpro и другие приложения


Посвящается she

Считывание информации в БД из документов EXCEL произвольной формы.

Уважаемые коллеги!

Хочу предварить описание некоторыми пояснениями:

  • До идеи, описанной здесь, дошел сам, но не претендую на первенство, т.к. допускаю, что могут быть люди (да наверное и есть), которые уже давно используют такую технику работы.
  • Текст, изложенный ниже - это моя пояснительная записка для шефа, так что прошу не судить строго за стиль.
  • Собственно реализация идеи - класс cstXLSscaner в демопрограмме. Описывать его интерфейс не стал - там все предельно просто.
  • Перед запуском программы посмотрите пояснения в Test.xls (кстати, он содержит пару макросов - не бойтесь).
  • Буду благодарен за комментарии и поправки (только вежливо, пожалуйста).

Формирование БД на основе документов EXCEL.

Если основой информационного наполнения БД являются некие документы в формате EXCEL , то неизбежно встает вопрос о переносе данных в БД, где информация хранится в собственном формате и структуре. Посему, информацию нужно либо вводить вручную, либо автоматизировать процесс преобразования. Естественно, что далее будет рассматриваться именно вопрос автоматизации данного процесса.

Представление информации в документе EXCEL.

Документ EXCEL – двумерная таблица (на самом деле – n-мерная, но традиционно воспринимаемая, как двумерная), содержащая информацию в своих ячейках. Каждая ячейка имеет свои координаты - адрес.

По степени однородности информации и ее структурированности можно выделить два типа документов:

  1. Информация представлена в виде таблицы, содержащей жестко структурированную однородную информацию. Каждая запись таблицы (независимо от ее расположения в таблице) содержит одинаковый набор реквизитов, расположенных в одинаковой последовательности. Формализовать алгоритм считывания данных в этом случае достаточно просто – достаточно знать состав реквизитов и количество записей (строк) таблицы.
  2. Документ содержит разнородную информацию переменной структуры ( набор реквизитов зависит от расположения записи в таблице), а часто и вовсе не табличного вида. Формализовать алгоритм считывания для таких документов, как правило, достаточно трудно или даже невозможно. Это объясняется тем, что при необходимости представления дополнительной информации документ может подвергнуться серьезным изменениям. Для считывания данных часто пользуются картой адресов ячеек, согласно которой программа и считывает информацию. Однако, при любом изменении документа необходимо корректировать и карту адресов.

Наиболее распространен именно второй тип документов, так что имеет смысл ориентироваться именно на них.

Идентификация данных в документе.

Как видно из вышесказанного, главная задача при считывании данных из документов в БД – идентификация считанных значений. Чаще всего это карта адресов или диапазон адресов, согласно которым программа и идентифицирует данные. Т.е. попросту координатная идентификация. Такой подход вызывает определенные сложности при изменении документов (ведь придется менять и код программы!), и, что более важно, для каждого документа необходимо иметь свою карту адресов.

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

Создание скрытых идентификаторов в документе EXCEL.

Ячейка в EXCEL – своего рода слоеный пирог. Первый слой – данные пользователя; второй – данные о формате ячейки; третий – комментарий.

Комментарии!!!

Комментарии не видны (при определенных настройках EXCEL), их нельзя случайно удалить, они сохраняются при удалении информации из ячейки, копируются вместе с ячейкой, не влияют на работу EXCEL, и, наконец, доступны для программы, поддерживающей механизм OLE.

Таким образом, появляется возможность хранить в комментарии ячейки ее идентификатор, не заботясь об ее физическом адресе в документе. Единственное (и самое важное) , что для этого нужно – это создание единого кодификатора реквизитов. При наличии такого кодификатора, нетрудно создать шаблоны основных документов, уже содержащие эти идентификаторы, или изменить соответствующим образом алгоритм формирования этих документов, если они формируются автоматически.

Алгоритм считывания.

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

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

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.754) Вложение [22.75]kb
Дополнения пользователей
Считываение информации из неструктурированных EXCEL - документов? Легко!
[+][?]
Александр
26.04.02 17:54:40

А нельзя ли у Вас получить аналог класса в VB, как Вы пишите в "Назанчении". Если такая
возможность есть - сбросьте пожалуйста на мой E-mail - буду весьма признателен.
Lagutenkov Igor
26.04.02 19:34:48

Классное решение!
Дмитрий Орлов
27.04.02 10:00:04

2 Александр
Могу кинуть на мыло весь VB проект. Только твой e-mail сообщи или сразу мне на jeagle@mail.ru
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика