Создание рисунка по данным из базы
Предположим, имеется файл Excel. Примерно такой

По нему нужно нарисовать примерно такую картину

В качестве текста мы хотим видеть номер строки в таблице Excel и наименование прибора.
Для этого понадобится специальный мастер-шейп (чтобы передавать данные) и программа (макрос).
Мастер-шейп удобно разместить прямо в Document Stencil.

Обзовем его «Щ» (от слова «щит»).
Пусть это будет прямоугольник. Данные в него будем передавать через Custom Properties (в последних версиях Visio - Shape Data). Данных нужно две строки: в одной идентификатор, в другой название.
Вывод данных в шейп через вставленное поле, которое будет склеивать обе строки данных. В шейп-листе это выглядит следующим образом:

![]()
Все подготовлено, осталось написать программу.
Для облегчения будущих переделок разбиваем программу на три части:
· главный модуль ttt;
· модуль приема данных из Excel в коллекцию GetDataFromExcel;
· модуль рисования Draw.
Опять же для совместимости не используем появившихся в Visio 2007 встроенных объектов для связи с БД, а действуем через ADODB. Это будет работать и в Visio 2003.
Программа получается примерно такой:

Создаем объект Connection, указываем провайдера, настраиваем его и методом Open коннектимся к заданному файлу.
Открываем RecordSet, выбирающий все данные с листа ”Sheet1”.
Процедурой GetDataFromExcel выбираем все данные из Excel в коллекцию DataColl. Нам нужен только один первый столбец.
Обращаемся к макросу Draw для прорисовки коллекции.
Рисование начинается с точки x = 50 mm, y = 50 mm. Каждый следующий шейп пристраивается к предыдущему справа. Смещение рассчитывается через ширину шейпа.
В каждом шейпе заполняются две строки Shape Data. В первую помещается порядковый номер, во вторую - текст, который перед этим мы сохранили в коллекции.
Все. Теперь нужно выполнить макрос ttt и на листе появятся 4 прямоугольника с соответствующим текстом, как показано выше.
Примечание. В cn1.Open можно указывать не абсолютный, а относительный путь к файлу. При этом будет проще переносить пример с одной машины на другую.
В примере файл Excel баз сохранен в формате Excel 2003. Возможно, из более поздних форматов такая связка не пройдет. Нужно уточнять.
При сохранении в формате Excel 2007 видим ошибку

При попытке подставить Excel 9.0 в свойства Connection видим ошибку

Настройка подключения к данным в Excel 2007
В Office 2007 способ подключения к данным изменился. Во-первых, изменился формат данных в Excel, во-вторых, в Visio введены специальные объекты для связи с данными. Больше нет необходимости использовать ADODB. Кроме того, однажды подключенный источник данных хранится в документе, поэтому нет необходимости устанавливать соединение при каждом открытии документа.
Выбираем пункт "Связать данные с фигурами…" в меню "Данные".

Запускается визард "Выбор данных". Выбираем тип источника "Книга Microsoft Office Excel" и нажимаем "Далее".

На следующей странице нажимаем "Обзор" для выбора файла.

В диалоговом окне выбираем нужный файл Excel.

Видим заполненный путь к нужному файлу Excel. Нажимаем "Далее".

Визард предлагает выбрать лист в книге Excel для использования в качестве таблицы данных либо установить настраиваемый диапазон. Нам достаточно использовать целиком лист. Нажимаем "Далее".

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

Поскольку в нашем примере столбец "Name" подходит для однозначной идентифиакции строк, просто нажимаем "Далее".

Соглашаемся с тем, что импорт успешен и жмем "Готово".

Наблюдаем окно с подключенными данными.

Подключение завершено. Теперь можно приступать к программной обработке данных. Окно "Внешние данные" при этом будет не нужно, можно его закрыть, чтобы не мешало.
Программа тоже изменится.

Для выбора данных из Excel 2003 и ранее нужно будет использовать процедуру GetDataFromExcel8, а для более новых версий Excel - GetDataFromExcel12.
Метод выбора данных несколько отличается. DataRecordset не нужно открывать, он всегда открыт. Для движения по источнику вместо последовательного просмотра сначала выбираются в массив идентификаторы всех строк, затем идет движение по массиву идентификаторов.
Прорисовка данных, естественно, выполняется так же, как и ранее.


