Создание Office Web Components (OWC) - набора компонентов, реализующих основную функциональность Excel, которые могут работать на Web-страницах - явилось одним из наиболее важных достижений фирмы Microsoft в области компонентного программирования. Создание высококачественных компонентов различными фирмами - производителями программных продуктов и построение собственных решений на базе готовых, многократно используемых и проверенных компонентов - в этом суть компонентного программирования. Компоненты OWC созданы на основе Com-технологии и являются Com-объектами или, как теперь принято говорить, элементами ActiveX. Как и всякие элементы ActiveX, они могут использоваться в различных приложениях - контейнерах ActiveX, если последние построены в соответствии со стандартами, принятыми для подобных контейнеров.
Все основные приложения Microsoft, такие как Internet Explorer, начиная с версии 4, Visual Basic, Visual C++, FrontPage, InterDev, Office UserForms и другие приложения от Microsoft и от других фирм могут служить контейнерами для компонентов OWC. Конечно, несмотря на стандарт, контейнер контейнеру рознь, и возможны определенные особенности в работе того или иного контейнера с данными компонентами.
В название рассматриваемых компонентов включены два термина - Office и Web. Первый отражает тот факт, что эти компоненты вошли в состав Office 2000 и являются важной частью этого пакета. Второй термин подчеркивает, что компоненты могут с успехом работать на Web-страницах - точнее, что Internet Explorer является одним из допустимых контейнеров этих элементов. Вместе с тем следует понимать, что компоненты OWC могут работать не только на Web-страницах: их можно также с успехом использовать в собственных решениях, не связанных с документами Office 2000.
Подводя первый итог, отметим, что эти компоненты позволяют решить две важнейшие задачи:
Microsoft не только создал эти компоненты, но и первым показал пример их использования, встроив их в Office 2000. Их появление позволило достичь важнейшей для Office 2000 цели - придания интерактивности документам Office 2000, опубликованным в виде Web-страниц и доступным пользователям интрасетей.
Здесь и в дальнейшем под интрасетью я буду понимать все вариации сетей - internet, intranet,
Интрасети становятся стратегическим направлением развития Microsoft. "Документы создаются в сети и для работы в сети" - вот девиз сегодняшнего дня и ближайшего десятилетия.
Иметь возможность просматривать в сети документы Office 2000 - отчеты, подготовленные в Word, презентации, подготовленные в Power Point, - анализировать данные, сведенные в таблицы Excel, сопровождаемые графиками и диаграммами, - все это крайне важно для пользователей, работающих с документами. Но этого уже недостаточно. Статические страницы не всегда могут удовлетворить запросы активно работающего пользователя. Пожалуй, прежде всего, это касается пользователей, задача которых состоит в анализе деятельности своего офиса, в оценке эффективности тех или иных процессов. Для таких пользователей Excel является одним из основных инструментов, позволяющим проводить исследования типа "что если". Например, его может интересовать, как изменятся характеристики изучаемого процесса при изменении значений тех или иных параметров, что произойдет, если изменить цены или ввести те или иные скидки. Когда у пользователей, работающих в сети, возникают такие задачи, без OWC не обойтись.
Для программистов важно то, что они могут использовать компоненты OWC в своих решениях. Не менее важно и то, что для программистов эти компоненты являются обычными объектами с известной объектной моделью, а потому, используя свойства и методы этих объектов, можно нужным образом настроить свое решение. Компоненты OWC являются программируемыми объектами.
Набор OWC разработан той же командой, что создавала приложение Excel, и представляет собой компоненты, реализующие основную функциональность Excel. В набор OWC входят четыре компонента:
Spreadsheet . Этот элемент реализует функциональность Excel, как электронной таблицы. Он включает:Pivot Table . Функциональность этого компонента включает свойства сводной таблицы Excel с рядом полезных дополнений. Этот элемент позволяет:Chart. Этот компонент позволяет не только просматривать график или диаграмму как статический рисунок, но, благодаря связи с источником данных, мгновенно отображать на диаграмме изменения, происходящие с данными источника. Также как и остальные Web-компоненты, объект Chart является полностью программируемым и допускает обращение к его свойствам и методам при выполнении VBScript-кода в Internet Explorer.Data Source. Этот компонент не имеет визуального образа при размещении его на Web-странице. В отличие от остальных трех элементов он не играет самостоятельной роли. Обеспечивая соединение с источником данных с последующей доставкой данных, этот элемент играет роль посредника между источником данных и другими компонентами OWC.Поскольку компоненты OWC встроены в Office 2000, то для большинства пользователей Office работа с компонентами скрыта. Пользователь, работающий с документами Excel или Access, может использовать эти компоненты, даже не подозревая о том, что он их использует. Конечно же, опытный пользователь - программист, знающий объектную модель компонентов и умеющий программировать на VBScript, может произвести настройку компонентов OWC, расположенных на Web-странице, включив дополнительные свойства, учитывающие специфику работы с его документом.
Включение компонентов OWC в состав Office 2000 привело к появлению новых возможностей по публикации документов в Excel 2000. В связи с этим существенно изменился внешний вид и функции диалогового окна "Сохранение документа". Также как и в Word, здесь появилась панель с кнопками (ярлыками), позволяющая уточнить расположение сохраняемого документа. В частности, кнопка "Web Folders" открывает Web-папки, хранящиеся на сервере, и позволяет публиковать документ (Web-страницу) непосредственно в папку на сервере, тем самым мгновенно делая его доступным всем участникам совместной работы над документом в интерсети. В этом же диалоговом окне можно указать, следует ли публиковать всю рабочую книгу или отдельный лист, нужно ли добавлять интерактивность публикуемой странице. Командная кнопка "Опубликовать" этой панели открывает новое диалоговое окно "Публикация Web-страницы", в котором можно более детально задать элемент рабочей книги, предназначенный для публикации, а также вид и нтерактивности, придаваемой публикуемому элементу.
В зависимости от типа публикуемых данных на Web-странице автоматически располагаются различные Web-компоненты. Я не буду сейчас останавливаться на деталях этого процесса, но надеюсь, что из сказанного уже очевидно, что, работая в Excel, создавать интерактивные Web-страницы с встроенными компонентами OWC достаточно просто, - нужно лишь грамотно задавать параметры при сохранении страниц рабочей книги Excel или отдельных элементов этих страниц. Аналогичная ситуация имеет место и при работе в Access, где также могут автоматически создаваться интерактивные страницы с расположенными на них компонентами OWC.
Вот как выглядит в Internet Explorer соответствующая Web-страница, полученная при сохранении в Excel интерактивной диаграммы, расположенной на рабочем листе книги Excel.
(рис 10.1) Интерактивная диаграмма и рабочий лист с источником данных при просмотре в Internet ExplorerЗаметьте, в этом случае на Web-страницу выносится как сама диаграмма, так и рабочий лист с источником данных этой диаграммы. В данном конкретном случае диаграмма отображает поквартальную динамику объема продаж, выполненных группой дилеров, с подведением итогов за год. При просмотре в Internet Explorer этой Web-страницы можно ввести новые, уточненные данные, например, за 3-й и 4-й кварталы - тут же машина вычислений пересчитает итоги, тут же перестроится и диаграмма.
Все это становится возможным благодаря тому, что на Web-странице в момент ее сохранения в Excel автоматически размещаются три компонента OWC - Chart, Data Source и
<object id="BookFour_29850_WebChart" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E500-0000-0000-C000-000000000046" width=378 height=217> <param name=XMLData value= …> </object> <object id="BookFour_29850_DSC" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E530-0000-0000-C000-000000000046"> <param name=XMLData value= …> </object> <object id="BookFour_29850_WebCalc" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E510-0000-0000-C000-000000000046"> <param name=DisplayTitleBar value=false> <param name=DataType value=HTMLData> <param name=HTMLData value= …> </object>
Компоненты вставляются как объекты. Параметр classid позволяет найти их, если они зарегистрированы на компьютере пользователя, просматривающего соответствующую Web-страницу. Параметр codebase позволяет найти их, если они еще не зарегистрированы. Контент, передаваемый компоненту, задается тегом param этих объектов. Я не привожу достаточно длинное значение параметра value этого тега. По правде говоря, можно обойтись и без задания этого контента, что будет видно из последующих примеров.
Надеюсь, понятно, что для того чтобы работа с этой страницей стала возможной, на компьютере пользователя должны присутствовать компоненты OWC или они должны быть доступны для загрузки с источника, указанного параметром codebase.
Давайте поговорим теперь более подробно о компонентах.
Приложение Excel многофункционально. Excel создавался как электронная таблица, - и в этом его основное назначение. Главная особенность электронной таблицы состоит в том, что в ее ячейки можно вводить не только данные, но и формулы. Формулы Excel, также как и обычные математические формулы и выражения в языках программирования, оперируют при вычислении значений константами, переменными и функциями. В электронной таблице роль переменных играют отдельные ячейки и области таблицы. Машина вычислений, связанная с электронной таблицей, при каждом изменении данных в таблице, инициированных пользователем или внешними ссылками, пересчитывает формулы, зависящие от этих данных. Такие повторные вычисления делают электронную таблицу живой, - изменение значения одной ячейки приводит, возможно, к пересчету всей таблицы.
Компонент представляет электронную таблицу, наследующую многие из свойств электронной таблицы Excel. Рассмотрим основные свойства этой электронной таблицы.
Машина вычислений компонента практически сохраняет все основные возможности машины вычислений Excel. Конечно же, здесь нет возможности вести циклические вычисления, тем более, нет встроенных возможностей по решению оптимизационных задач. Но вычисления, определяющие суть электронной таблицы, ведутся по тому же алгоритму, что и в Excel.
Практически сохранена библиотека функций Excel, допустимых при построении формул. Следует сказать, что чрезвычайно обширная библиотека функций Excel является его гордостью. Компонент может также гордиться своей библиотекой. В ее состав входят функции, разбитые на 10 основных категорий:
Важно, однако, понимать, что не все функции, имеющиеся в Excel, реализованы, может быть реализовано только 95% функций, например, нет функции (транспонирования) из класса математических функций, Trend - из класса статистических функций, Asc - информационной функции и некоторых других функций. Более полную информацию о функциях, включенных в состав библиотеки, можно найти в справочной системе, сопровождающей компонент.
С каждым компонентом связывается один рабочий лист - одна электронная таблица. Ее максимальный размер 65536 строк на 702 столбца (с именами от A до ZZ). Заметьте, что в Excel 2000 при том же числе строк число столбцов меньше почти в три раза - всего 256. Однако не стоит особенно обольщаться возможным большим размером листа, так как тут же возникает проблема времени его загрузки при работе в сети.
Поскольку с каждым компонентом связывается только один лист, то при публикации на Web нельзя сохранить в интерактивном режиме сразу всю рабочую книгу Excel, состоящую из нескольких рабочих листов. Приходится независимо сохранять каждый рабочий лист или часть этого листа на отдельной Web-странице.
В формулах Excel могут использоваться как внутренние, так и внешние ссылки. Компонент не поддерживает внешних ссылок. Более того, поскольку каждый рабочий лист сохраняется как независимая Web-страница, то ссылки на ячейки других рабочих листов той же книги считаются внешними и не поддерживаются. В самом приложении Excel ссылки между страницами одной книги считаются внутренними.
Что касается внутренних ссылок, то для них могут использоваться различные форматы - абсолютные адреса ($A$1) и относительные - (A1). Формат относительных ссылок RC, задающий смещение по строкам и столбцам (Row - Column), считается устаревшим и не поддерживается. Использование в формулах именованных диапазонов также, к сожалению, не поддерживается. При сохранении листа Excel именованные диапазоны преобразуются в абсолютные адреса, поэтому уже написанные формулы будут, конечно, работать, но написать новую формулу в интерактивном режиме, содержащую именованный диапазон, не удастся. Поддержку именованных диапазонов можно обеспечить лишь программным путем. Не поддерживается и обновление Web-запросов.
Компонент поддерживает переход по гиперссылкам, задающим адреса (URL) в Интернете. Достаточно напечатать в любой ячейке строку, начинающуюся с http://, как она будет воспринята в качестве гиперссылки и щелчок по этой ячейке задаст переход к соответствующей странице в Интернете. Другой способ состоит в том, чтобы задать в ячейке таблицы формулу, вызывающую функцию Hyperlink.
Одними из основных операций, которые чаще всего выполняют пользователи, работающие в интерактивном режиме с электронной таблицей, - это операции "Копировать" - "Вставить", использующие буфер. Поскольку есть ряд отличий от выполнения их в Excel, то на некоторые моменты хочу обратить внимание.
Paste Special отсутствует. Никаких дополнительных операций, возможных в Excel в момент копирования, здесь нет.Копирование и вставка используются не только для операций, выполняемых внутри электронной таблицы, но и для обмена данными с другими программами.
Допускается форматирование внешнего вида электронной таблицы. Замечу, что можно удалить сетку, заголовок таблицы, имена столбцов. Разрешается удалять и добавлять строки и столбцы таблицы, изменять их размеры, форматировать отдельные ячейки, изменять границы, шрифты и производить другие подобные операции.
Как я уже говорил, Excel является многофункциональным приложением, и над данными, располагаемыми на его страницах, можно выполнять самые разнообразные операции. Компонент полной функциональностью Excel, конечно, не обладает; тем не менее, ряд важных дополнительных функций включен в его состав.
SpreadSheet допустим только один вариант - AutoFilter, и критерии фильтрации существенно упрощены в сравнении с аналогичным вариантом Excel. Замечу, что спрятанные Как можно видеть на рис. 10.1, в верхней части компонента располагается панель инструментальных кнопок, каждая из которых позволяет выполнять определенное действие над данными электронной таблицы. Опишем коротко назначение этих кнопок.
- кнопка с логотипом Office отображает информацию о компоненте, задавая номер инсталлированной версии. Имеет ссылку, позволяющую перейти на узел технической поддержки пользователей программных продуктов Microsoft.
- позволяет производить "откат" - поочередно отменяя последние выполненные действия.
- хорошо известные кнопки, позволяющие выполнять операции "Вырезать", "Копировать", "Вставить".
- кнопка автосуммирования, позволяющая выполнять одну из самых распространенных операций над данными.
- эта группа кнопок выполняет операции по сортировке и фильтрации данных, о которых я говорил чуть выше.
- кнопка, позволяющая осуществлять экспорт данных электронной таблицы SpreadSheet в Excel, создавая новую рабочую книгу Excel. Я еще буду говорить об этой возможности в следующем параграфе.
- открывает справочную систему по компоненту SpreadSheet .
- эта кнопка открывает инструментальную панель, элементы которой задают расширенные возможности управления свойствами компонента SpreadSheet . Вот как выглядит эта панель в раскрытом виде:
(рис 10.2) Инструментальная панель управления свойствами компонента SpreadSheet
Как и все элементы управления ActiveX, компонент не имеет собственных средств, позволяющих открыть или сохранить этот элемент - команды Open и Save не являются частью интерфейса таких элементов. Выполнение этих функций - прерогатива контейнеров, содержащих эти элементы. Тем не менее, у объекта есть целый набор способов, позволяющих ему общаться с внешним миром, - передавая и получая данные.
Ввод данных в электронную таблицу может осуществляться разными способами.
SpreadSheet с уже заполненным содержанием, источником которого является рабочий лист Excel. Это один из основных способов первоначального ввода данных, применяемый при работе с офисными документами.SpreadSheet . Замечу, что эти данные сохраняются только на момент сеанса и, если не предпринять специальных мер, будут утеряны при закрытии Web-страницы.SpreadSheet . Замечу, что объект SpreadSheet среди многих других свойств имеет свойство HTMLURL, которое содержит URL, указывающий источник данных для загрузки. URL должен возвращать HTML-документ, в котором есть, по крайней мере, одна таблица.<input Id = "myTextField" type = text size = 30>При просмотре этого документа в Internet Explorer я ввел в это поле текст "Привет от компонентов OWC!". В одну из ячеек электронной таблицы ввел формулу:
=Document.myTextField.ValueЗаметьте, здесь используется возможность работы в ячейках электронной таблицы с объектом "
Document ", задающим контейнер, в данном случае - Web-страницу, просматриваемую в Internet Explorer. Зная ID элементов, располагаемых на этих страницах, можно добраться до их свойств, - в данном примере до свойства Value поля ввода. Надеюсь, понятно, что значением данной формулы будет текст, введенный в поле ввода.Операции ввода-вывода данных симметричны. Почти каждому способу ввода данных соответствует свой способ вывода:
SpreadSheet . Очевидно, эта операция является обратной к операции публикации страниц рабочей книги Excel. Экспорт - это один из основных способов сохранения результатов работы с офисными документами в сети.SpreadSheet , например, в таблицу документа Word, или в заданную область рабочего листа Excel.<!-- Передача данных из таблицы компонента SpreadSheet на Web-страницу! --> <table datasrc = #BookFour_29850_WebCalc.A2:D6 border = 1> <thead> <tr> <th>Итоги продаж</th> <th>Иванов </th> <th>Петров </th> <th>Сидоров </th> </thead> <tbody> <tr> <td> <div datafld = "A"> </div> </td> <td> <div datafld = "B"> </div> </td> <td> <div datafld = "C"> </div> </td> <td> <div datafld = "D"> </div> </td> </tr> </tbody> </table>
Надеюсь, Вы понимаете, что я продолжаю работать с документом, приведенным на рис. 10.1. В данном случае в нем создается новая таблица, источником данных для которой является наш компонент . В параметре таблицы datasrc указывается ID компонента, после точки следует адрес области данных. Префикс # указывает, что источник данных находится на той же странице, что и строящаяся таблица. Вот как выглядит построенная таблица:
(рис 10.3) Таблица, построенная по данным компонента SpreadSheet
Для программиста компонент является обычным объектом, свойства и методы которого он может вызывать в своих программах, также как и проводить обработку событий, происходящих в процессе работы пользователя с компонентом. Замечу, что объектная модель компонента во многом напоминает соответствующую часть объектной модели Excel. Программирование позволяет построить собственное решение, в полной мере использующее возможности этого компонента.
Прежде чем перейти к деталям, хочу напомнить об одной особенности построения объектной модели компонент OWC - объектные модели всех компонент построены независимо, нет объекта, объединяющего их, в который все они были бы вложены. Каждый из четырех рассматриваемых нами объектов является корневым объектом в соответствующей модели.
Я приведу сейчас описание основных элементов объектной модели компонента , проводя по ходу дела сравнение с соответствующими объектами Excel. Напомню, что описание объектной модели Excel я дал в главе 11. Справочная система по объектам OWC доступна и находится в файле msowcvba.chm, путь к которому обычно следующий: C:\ProgranFiles\Microsoft Office\Office\1033.
Давайте вспомним, как устроена объектная модель Excel, На верхнем уровне здесь находится объект Application, в который среди прочего вложена коллекция рабочих книг - Workbooks, каждая из которых содержит коллекцию листов книги - Sheets. Листы книги могут быть разного типа, определяющее Worksheet. Одним из главных объектов рабочего листа, с которым чаще всего приходится работать программисту, является объект Range.
В объектной модели компонента на верхнем уровне расположен сам объект , он в определенном смысле играет роль объекта Application и во многом наследует его свойства и методы. Конечно же, никакой коллекции рабочих листов, не говоря уже о рабочих книгах, в объект не вложено, в него встроен лишь объект Worksheet, задающий единственный рабочий лист, связанный с компонентом. Этот объект во многом устроен также как и его тезка в Excel, в частности, в него встроен объект Range, позволяющий программисту работать с областями рабочего листа, связанного с компонентом .
Давайте рассмотрим свойства, общие для объектов и Excel Application. Их сводка дана в следующей таблице:
| Свойства | Назначение |
|---|---|
ActiveCell, ActiveSheet |
ActiveSheet для объекта играет значительно более важную роль, чем для объекта Application, поскольку именно оно возвращает центральный элемент этой модели - объект WorkSheet - тот единственный рабочий лист, который задает электронную таблицу. |
Cells, Columns, Rows |
Коллекции ячеек, строк и столбцов |
DisplayScrollBar |
Булево свойство, позволяющее включать или отключать скроллинг. У объекта есть два свойства, позволяющие отдельно управлять вертикальным и горизонтальным скроллингом. |
EnableEvents |
Булево свойство, позволяющее включать события объекта. |
MoveAfterReturn, MoveAfretReturnDirection |
Булево свойство, позволяющее указать, будет ли изменяться |
Range |
Свойство, возвращающее объект Range. Аргументы свойства позволяют задать требуемую область рабочего листа. |
Selection |
Свойство, возвращающее выделенный (активный) объект. Если выделена область в рабочем листе, то этот объект принадлежит классу Range. |
Version |
Свойство, возвращающее версию. |
Общих свойств не столь уже и много. Может быть, более интересно понять, каких свойств объекта Application не имеет объект , и какие дополнительные свойства он приобрел.
По понятным причинам объект устроен намного проще, чем объект Application, а посему и многих свойств объекта Application он не имеет. Вот, например, чего у него нет:
Active -свойств, возвращающих активную диаграмму, рабочую книгу, принтер или окно.AddIns и ComAddIns, возвращающих соответствующие коллекции. Объект SpreadSheet может работать только с COM объектами.AnswerWizard, Assistant, Dialogs, FileSearch, CommandBars, Charts, Workbooks, Sheets, Windows и рядом других мощных объектов Excel.Application намного богаче совокупность булевых Display - свойств, позволяющая в Excel управлять отображением на экране тех или иных элементов, например, строки статуса.Enable -свойствами. У объекта Application их значительно больше, они позволяют, например, включить или отключить звук или анимацию.Я не буду подробно останавливаться на всех возможностях объекта Application. Перейдем к рассмотрению тех свойств объекта , которых нет у объекта Application.
Рассмотрим те свойства, которые приобрел объект . Многие из них связаны с главным предназначением этого объекта - обеспечением возможности интерактивной работы с электронной таблицей на Web-страницах.
ActivePane - это свойство заменяет свойство ActiveWindow и возвращает объект Pane - активное подокно, в котором размещается электронная таблица.AllowPropertyToolbox - булево свойство, позволяющее включать или отключать панель свойств в период выполнения.ViewableRange позволяет задать объект Range, определяющий область электронной таблицы, допустимую для просмотра пользователем. Остальная область будет для него скрыта. Свойства MaxWidth, MaxHeight определяют максимальные размеры видимой части электронной таблицы по ширине и высоте. Они могут быть заданы либо в пикселях, либо в процентах от величины контейнера, содержащего электронную таблицу. Наконец, булево свойство AutoFit позволяет наилучшим способом отобразить допустимую для просмотра область. Если его значение задано, как True, то электронная таблица будет отображать допустимую для просмотра область со скроллингом или без него в зависимости от числа строк и столбцов области и значений MaxWidth и MaxHeight. Вот пример установки этих свойств в обработчике события OnLoad:<script language=vbscript> Sub Window_onLoad() 'Инициализация параметров электронной таблицы With BooKFour_1787_WebCalc .ViewableRange = "A1:G10" .MaxWidth = "90%" .MaxHeight = "90%" .AutoFit = True End With End Sub </script>Этот код я добавил в конец тега (рис 10.4) Управление отображением области, допустимой для просмотраЗаметьте, если уменьшить значение параметров
MaxWidth и MaxHeight, например, до 50%, то область отображения электронной таблицы уменьшится, и появятся полосы, позволяющие осуществлять скроллинг внутри области.BuildNumber задает номер версии компонента.CanUndo со статусом "только для чтения" возвращает значение True, если предыдущее действие может быть отменено.Constants позволяет справиться с проблемой Constants позволяет обойти ограничение VBScript и дает возможность работы с именованными константами, принадлежащим различным перечислениям. Это свойство задает набор из всех именованных констант VB. После вызова свойства достаточно указать через точку имя константы, чтобы работать с ней в VBScript также как и в VB /VBA . Вот небольшой пример кода на использование трех последних свойств:Dim myc 'Задание набора констант
Set myc = .Constants
.Range("D5:F8").Borders.Weight = myc.owcLineWeightThick
.Range("D5:F8").Borders.Color = "Green"
.TitleBar.Caption = "OWC SpreadSheet Build - " .BuildNumber
.TitleBar.Font.Color = "Green"
If .CanUndo Then .TitleBar.Font.Color = RGB(255,125,125)
Этот код я добавил в предыдущую процедуру Window_onLoad. Не буду приводить рисунка, демонстрирующего изменения внешнего вида электронной таблицы. Замечу, что все отработало должным образом. Свойство CanUndo вернуло значение True, так что цвет в заголовке окончательно был установлен с использованием функции RGB.CSVURL также устанавливает или возвращает данные, разделенные символом " запятая ", но источник данных в этом случае задается URL-адресом. Свойство HTMLData позволяет получать или возвращать данные, представленные в HTML-таблице. Свойство HTMLURL позволяет работать с данными такого же формата, но источник данных задается URL-адресом. Это может быть, например, адрес Web-страницы, на которой расположена HTML-таблица. Источником может быть и
страница документа Excel 2000, сохраненная как интерактивная Web-страница. Если одновременно заданы
несколько из этих свойств, то возникает дилемма, откуда брать данные. Свойство DataType позволяет решить данную проблему. Четыре возможных значения этого свойства совпадают с именами четырех рассмотренных только что свойств, задающих источники данных. Значение DataType однозначно определяет, каким свойством следует пользоваться для доставки данных.Display -свойства. Серия этих свойств позволяет отображать те или иные элементы электронной таблицы - заголовки столбцов и строк, сетку, вертикальную и горизонтальную полосу прокрутки, панель свойств и панель инструментов, заголовок таблицы. Вот их перечисление: DisplayColHeaders, DisplayRowHeaders, DisplayGridlines, DisplayHorizontalScrollBar, DisplayVerticalScrollBar, DisplayPropertyToolbox, DisplayToolbar, DisplayTitlebar. Конечно же, всеми этими элементами можно управлять и в объектной модели Excel, но там они не являются свойствами объекта Application.Enable -свойства. Серия этих свойств позволяет включать или отключать те или иные возможности электронной таблицы - автоматическое вычисление, возможность отката. Вот эти свойства: EnableAutoCalculate, EnableUndo.ScreenUpdating - булево свойство, позволяющее отключить перерисовку экрана при обновлении данных. Полезно пользоваться этим свойством при программном обновлении данных. До начала обновления установить это свойство, как False, затем обновить все необходимые данные, затем установить для свойства значение True, чтобы перерисовать экран, когда все данные изменились.Практически я рассмотрел все свойства объекта . Как видите, их немало, и есть новые свойства, весьма полезные при программной работе с интерактивными документами.
Методов у объекта немного - всего 9. Три из них схожи с методами объекта Excel.Application. Два из этих методов - Union и Intersect задают объединение и пересечение областей электронной таблицы, возвращая соответствующий объект Range в качестве результата. От одноименных методов объекта Application отличаются числом возможных аргументов. У методов объекта аргументов два - Range1 и Range2, которые и задают области, пересечение или объединение которых ищется. Методы объекта Application позволяют проводить эти операции одновременно над большим числом аргументов. Третий общий метод Undo также имеет некоторые различия в семантике. Для объекта он позволяет не только отменить последнее действие, сделанное, например, пользователем в процессе работы с интерфейсными объектами, но и отменить действия последнего выполняемого
программного блока, помеченного специальными метками " BeginUndo " и " EndUndo ".
Из 6 методов, специально созданных для объекта , методы:
BeginUndo, EndUndo - позволяют произвести разметку программного блока, чтобы можно было при необходимости отменить его выполнение, вызвав метод Undo.LoadText - позволяет загрузить в электронную таблицу данные из текстового файла. В отличие от свойства CSVURL, позволяющего решать схожую задачу, ограничителем данных в текстовом файле может выступать не только символ " запятая ", но и другие ограничители - пробелы, символы табуляции и другие.Refresh - позволяет провести обновление данных, перезагружая их из источника и перерисовывая объект - электронную таблицу.UpdatePropertyToolbox - позволяет обновить значения свойств, заданных панелью свойств.AddIn - добавляет Addin к объекту, позволяя работать с его свойствами и методами.Получить объект WorkSheet можно двумя способами - можно спуститься вниз по иерархии, вызвав свойство ActiveSheet корневого объекта , можно подняться вверх по иерархии, вызвав свойство Parent объекта Range.
Объект большинство своих свойств унаследовал от одноименного объекта в стандартной модели Excel. Поэтому мне остается их только перечислить, а за описанием можно обратиться к главе 11, где рассматриваются объекты Excel, в том числе и объект WorkSheet. Вот краткая характеристика подобных свойств объекта:
Cells, Columns, Rows, Range - свойства, возвращающие одноименные объекты. Заметьте, этими свойствами обладает и корневой объект SpreadSheet . Упомяну еще одно свойство - ViewableRange, общее для этих двух объектов, которое задает область, допустимую для просмотра. Пример использования этого свойства приводился.AutoFilter, AutoFilterMode, EnableAutoFilter, FilterMode, EnableAutoCalculate, Parent, UsedRange. Большинство свойств этой группы предназначено для работы с фильтрами. Чуть выше в одном из разделов этой главы я останавливался на особенностях фильтрации данных при работе с объектом SpreadSheet .Рассмотрю теперь свойства, имеющие некоторую специфику:
Protection - свойство, возвращающее объект Protection, с помощью свойств которого и устанавливается защита. Свойство Enabled объекта Protection устанавливает, включена ли защита или нет. Если она включена, то остальные булевы свойства определяют, что именно защищается. Например, свойство AllowSorting позволяет задать допустимость сортировки данных в электронной таблице, а свойства AllowDeletingRows и AllowInsertingRows - удаление и вставку строк таблицы.FreezePanes - булево свойство, имеющее статус "только для чтения", возвращает значение True, когда электронная таблица содержит "замороженные" подокна.VisibleRange - свойство, возвращающее объект Range, содержащий видимую область электронной таблицы. Заметьте, видимая область может не совпадать с областью, допустимой для просмотра, возвращаемой при вызове свойства ViewableRange.Объект имеет 5 методов: Calculate, Eval, ShowAllData, Export, Scroll, первые три из которых в этом списке унаследованы от объекта WorkSheet модели Excel.
Метод Export(FileName, ExportAction) позволяет экспортировать электронную таблицу. Второй аргумент метода указывает нужно ли открыть таблицу в Excel или сохранить ее в файле, имя которого задается первым аргументом метода.
Метод Scroll(Range) производит горизонтальную и вертикальную прокрутку так, чтобы область, заданная аргументом попала в левый верхний угол электронной таблицы.
Объект Range является основой основ в объектной модели Excel. Также обстоит дело и в модели компонента . Десятки свойств и методов различных объектов этой модели возвращают в качестве результата объект Range. Заметьте, коллекции Cells, Rows, Columns, возвращаемые одноименными свойствами, являются одновременно объектами Range. Такие свойства как Range, Selection, ViewableRange, VisibleRange, такие методы как Union, Intersection и многие другие - возвращают объект Range.
Модель этого объекта хорошо отработана еще в Excel и потому не удивительно, что объект унаследовал большую часть свойств объекта Excel.Range. Конечно, часть свойств исходного объекта была потеряна - исчезла возможность работы с формулами над массивами, возможность хранения зависимостей, работы с циклическими ссылками, но основные свойства объекта Excel.Range сохранились. Заметьте, у объекта почти не появилось новых свойств, которых не было бы у объекта Excel.Range. Достаточно сказать, что из 46 свойств объекта 45 свойств перешли по наследству от объекта Excel.Range. Появилось лишь одно новое свойство - HTMLData, о котором уже шла речь при рассмотрении объекта . Для объекта Range это свойство имеет статус "только для чтения" и позволяет вернуть HTML-таблицу, хранящуюся в ячейках области, заданной
объектом Range.
Поскольку объект Excel.Range описан мной достаточно подробно, то я не буду останавливаться на деталях описания аналогичных свойств объекта и даже не буду всех их перечислять. Скажу только, что свойства объекта позволяют работать с коллекциями ячеек, строк и столбцов области, отдельными ячейками, границами области, используемым шрифтом, формулами и значениями, хранимыми в ячейках, их форматами и многим другим.
Приведу пример программной работы с объектами Range. Заметьте, эти объекты уже появлялись в ранее приведенной процедуре - обработчике события OnLoad объекта Window. Но еще один пример не помешает. К Web-странице, показанной на рис. 10.4, я добавил командную кнопку. Вот описание соответствующего тега:
<p><input type="button" value="Работа с объектом Range" name="myButton" OnClick = WorkWithRange></p>
Далее я написал обработчик события Click для этой кнопки, в котором создаю и работаю с объектами Range нашей электронной таблицы, размещенной на этой странице. Вот VBScript код этого обработчика:
Sub WorkWithRange()
'Работа с областями электронной таблицы
Dim myc 'Задание набора констант
Dim myr, myr1, myr2, myr3, myr4, myr5, myr6 'объекты Range
Dim strFormula 'Строка, задающая формулу
With BooKFour_1787_WebCalc
Set myc = .Constants
Set myr2 = .Range("E12:G14")
myr2.Borders.Weight = myc.owcLineWeightMedium
myr2.Borders.Color = "Blue"
'Изменяю область, доступную для просмотра
.ViewableRange = "A1:G20"
'Создаю объекты Range для программной работы с ними
Set myr = .Range("A11:G20")
With myr
.Font.Size = 12
.Font.Bold = True
Set myr1 = .Cells(2,5)
myr1.Value = "Строки и столбцы"
Set myr3 = myr1.Offset(1)
myr3.Value = myr.Rows.Count
Set myr4 =myr1.Offset(1,1)
myr4.Value = myr.Columns.Count
Set myr5 = myr1.Offset(2)
strFormula = "=" myr3.Address "+" myr4.Address
myr5.Formula = strFormula
Set myr6 = myr1.Offset(2,2)
strFormula = "=" myr3.Address "*" myr4.Address
myr6.Formula = "=E13 * F13"
'Замораживание подокна
myr.FreezePanes myc.ssFreezeTop
End With
End With
End Sub
В этом примере я создаю большое число объектов Range. В процессе работы с этими объектами создаются объекты Font и Borders, как результат вызова соответствующих свойств. Здесь же появляются коллекции Cells, Columns, Rows, являющиеся, как я уже говорил, объектами Range. Я использую различные свойства и методы объектов Range, - в частности, свойства ViewableRange, Address, Value, Formula, методы Offset и FreezePanes.
Взгляните, как выглядит страница в Internet Explorer после нажатия в окне браузера командной кнопки с именем "Работа с объектом Range":
(рис 10.5) Программная работа с областями электронной таблицы Что касается методов объекта Range, то их чуть более 20, и практически все они наследованы от объекта Excel.Range. Из специфических методов можно упомянуть лишь два:
LoadText - позволяет загружать данные из текстового файла в заданную область. Об этом методе я уже говорил при описании объекта SpreadSheet .FreezePanes - "замораживает" подокно. Вот небольшой пример. В предыдущей процедуре можно видеть следующие строчки:'Замораживание подокна myr.FreezePanes myc.ssFreezeTop
В результате действия этого оператора произошло расщепление окна, и окружающее сверху подокно было заморожено, так что, например, прокрутка не оказывает действие на это подокно - оно всегда видимо. Заметьте, на рисунке 10.5 видна черта, отделяющая подокна.
Я уже говорил о том, что можно делать с помощью методов объекта Range. Напомню, - можно выполнять фильтрацию, сортировку и поиск данных в пределах области. Можно осуществлять чистку содержимого и формата, удалять и вставлять столбцы и строки и ряд других подобных операций.
На этом я закончу рассмотрение объектной модели компонента . Я специально достаточно подробно рассмотрел эту модель, чтобы показать, что объекты OWC построены также как и все остальные объекты Office 2000, и работа с этими объектами ведется аналогичным образом. Для других компонентов OWC я не буду уже столь подробно разбирать объектную модель, а ограничусь кратким обзором и примерами.
Говоря о замечательных свойствах приложения Excel, на первое место я поставил его машину вычислений. Второе место по справедливости занимает способность Excel представлять данные в наглядной графической форме. Казалось бы, что представление данных, хранящихся в таблицах, столь же информативно, как и их отображение в виде графиков и гистограмм. Более того, понятно, что информация, хранимая в больших таблицах Excel или в различных хранилищах данных, значительно более полна в сравнении с той, которая может быть отображена в тех или иных графиках и гистограммах. Однако для человека графическая форма представления информации является более приемлемой, позволяя ему значительно быстрее воспринять информацию, обработать ее, осознать тенденции процессов, показанных на графиках, что, в конечном итоге, позволяет быстро принять необходимые решения. Компонент Chart реализует практически в полном объеме все возможности Excel по визуализации данных - представлению их в графической форме.
Также как, во многом, мощь машины вычислений Excel определяется разнообразием функций, составляющих ее библиотеку, так мощь визуализации определяется разнообразием возможных типов диаграмм. Элемент Chart сохранил это многообразие, отказавшись, правда, от объемных, трехмерных изображений, - такие диаграммы будут представляться в обычном двухмерном изображении. На мой взгляд, это небольшая потеря. Зато появилась новая возможность - рисовать графики в
Конечно же, объект Chart обладает свойствами, позволяющими при отображении диаграмм показывать не только саму диаграмму, но и все ее основные элементы оси категорий и значений, заголовок и легенду. Сохранена также такая важная возможность, как показ линии тренда с прогнозом будущих и предыдущих значений, не представленных данными диаграммы. Можно также показывать на диаграмме интервалы, задающие возможную погрешность данных. Следует отметить, что не сохранена возможность показа текущих справок при подведении курсора к той или иной области диаграммы. Однако при желании, эту возможность можно ввести в собственном решении, используя программную настройку и те возможности, которые предоставляет объектная модель компонента Chart.
На следующем рисунке показана уже знакомая диаграмма с данными об объемах продаж, просматриваемая в Internet Explorer. На диаграмме показана линия тренда с прогнозом продаж, которые можно ожидать от одного из продавцов в следующем периоде. Для данных другого продавца показаны пределы возможной погрешности.
(рис 10.6) Диаграмма с линией тренда и интервалом погрешностей
Элемент Chart не имеет собственного интерфейса. Поэтому если поместить этот элемент в единственном числе на Web-странице или в каком-либо другом допустимом контейнере, то у пользователя не будет никаких возможностей взаимодействия с этим элементом. По существу, в этом случае все сведется лишь к статическому просмотру диаграммы. В этом тоже есть некоторый смысл, поскольку диаграмма при перерисовке будет отображать последние изменения источника данных. Возможны два пути решения проблемы создания интерактивной диаграммы:
Chart, но и два других компонента - SpreadSheet и Data Source. Первый из них задает источник данных для построения диаграммы, второй - служит мостиком для передачи данных от компонента SpreadSheet к компоненту Chart. Достоинством такого подхода является то, что пользователь получает возможность изменять данные в таблице компонента SpreadSheet и тут же увидеть, как эти изменения отражаются на диаграмме. Пользователь может также использовать интерфейс компонента SpreadSheet , но он по-прежнему не сможет изменить, например, тип отображаемой диаграммы. В собственном решении можно сочетать достоинства обоих подходов.Что может служить источником данных для построения диаграммы компонента Chart? Это, наверное, один из основных вопросов, на который следует ответить. Компонент Chart можно связать со следующими источниками данных:
SpreadSheet , PivotTable, Data Source ;RecordSet ;IDataSource, документированный, например, в OLE DB SDK.Понятно, что связывание данных с диаграммой не простой процесс, поскольку необходимо задавать разнообразную информацию - названия осей диаграммы, имена, задающие серии данных, наконец, массивы значений для каждой из серий, и многое другое. Обычно, для этой цели используется, как это делается в Excel, специальный мастер - Chart Wizard. Но, поскольку, в конечном счете, все сводится к работе с соответствующими объектами, составляющими объектную модель компонента, то связывание можно осуществить в собственном решении программным путем.
Начну с некоторого обзора, позволяющего дать общее представление об объектной модели этого компонента. Прежде всего, замечу, что корневым объектом в этой модели является не объект Chart, а объект - ChartSpace, задающий пространство диаграммы, в котором можно разместить несколько объектов Chart. Содержательно это означает, что компонент ChartSpace играет роль листа книги, который может одновременно отображать несколько диаграмм. Для программиста важно то, что объект ChartSpace имеет свойство Charts, возвращающее коллекцию объектов Chart и для добавления элементов в эту коллекцию используется стандартный для коллекций метод Add.
Особую роль среди методов объекта ChartSpace играет метод ExportPicture, позволяющий экспортировать пространство диаграммы со всем ее содержимым в графический файл в формате GIF. Такой прием применяется при размещении компонент OWC на серверной стороне, о чем я еще скажу особо. Из свойств объекта Chart упомяну свойство Type, позволяющее задать тип диаграммы. Говоря о методах этого объекта, назову метод SetData, который используется для того, чтобы установить связь с разнообразными источниками данных и направить их в те или иные области диаграммы. Одноименный метод объекта Series, входящего в коллекцию серий данных - SeriesCollection объекта Chart, - позволяет загружать данные отдельной серии. Из событий объекта Chart нельзя не назвать событие DataSetChange. Это событие зажигается, когда связанный источник данных изменяет свои данные. При возникновении события компонент Chart автоматически перестраивается, чтобы соответствовать обновленным данным. Но, если обновление связано с изменением структуры диагра
ммы, например, появлением новой серии, то для подобных обновлений следует написать собственный обработчик события.
В заключение обзора хочу представить схему, отражающую устройство основных объектов модели - ChartSpace, WCChart, WCSeries:
(рис 10.7) Схема устройства основных объектов модели Заметьте, свойства объекта ChartSpace - ChartDataSources и Charts - возвращают соответственно коллекцию WCDataSources и WCCharts. Первая из них с элементами WCDataSource задает источники данных, которых может быть несколько, вторая - с элементами WCCharts - определяет объекты, задающие диаграммы, расположенные в общем пространстве, заданном объектом ChartSpace.
Объект WCChart, который и определяет саму диаграмму, устроен достаточно сложно, поскольку сложным является устройство самой диаграммы. Свойства этого объекта позволяют получить объекты, задающие основные элементы диаграммы:
SeriesCollection - возвращает коллекцию объектов WCSeriesCollection, задающих данные, используемые для построения диаграммы. Заметьте, имя класса отличается от имени свойства приставкой WC, указывающей на классы Web-компонент.Axes - возвращает коллекцию WCAxes - объектов, задающих оси диаграммы.Title - возвращает объект WCTitle, задающий заголовок диаграммы.Legend - возвращает объект WCLegend, задающий описание (легенду) диаграммы.PlotArea - возвращает объект WCPlotArea, представляющий область отводимую для построения диаграммы. Свойство имеет статус "только для чтения". Не для всех объектов Chart возвращается соответствующий объект. Его не имеют диаграммы типа "pie", "Третьим объектом, устройство которого показано на рисунке 10.6, является объект WCSeries, задающий одну группу (серию) данных, используемых для построения диаграммы. Как можно видеть, соответствующие свойства возвращают объекты, позволяющие программно работать не только с самими данными, но и строить тренды и доверительные интервалы для данной серии данных.
Я не буду дальше погружаться в описание деталей построения объектов, а ограничусь примером программного построения диаграммы на Web-странице. Я продолжил работу с HTML-документом, показанным на рис. 10.5. Я использовал этот документ для демонстрации некоторых возможностей работы с компонентом и написал, как Вы помните обработчик события, связанного с нажатием соответствующей командной кнопки, расположенной на документе. Теперь я добавлю к документу еще одну командную кнопку, по нажатию которой будет строиться диаграмма, источником данных для которой будет компонент , уже расположенный на этом документе. Чтобы пример был интереснее, я добавлю к документу еще один управляющий элемент - выпадающий список, элементы которого будут задавать тип диаграммы. Тем самым пользователь будет иметь возможность не только построить саму диаграмму, но и перед построением задать ее тип.
Все эти действия я выполнил в приложении FrontPage. Не буду останавливаться на деталях выполнения этого этапа работы. Приведу лишь описание тега <object>, в котором я определил компонент Chart:
<object id = "myChartSpace" classid = "CLSID:0002E500-0000-0000-C000-000000000046" width="5" height ="5">
Чтобы не
(рис 10.8) Начальное состояние Web-страницыА вот как выглядит эта страница, после того, как из списка выбран тип "диаграмма" и нажата командная кнопка "Создать диаграмму":
(рис 10.9) Web-страница с программно построенной диаграммойА теперь давайте разберемся в программном коде, решающем эту задачу. Вот текст обработчика события, вызываемого при нажатии командной кнопки:
Sub CreateChart()
'Создание диаграммы
Dim myc 'Константы
Dim cht 'Объект, задающий диаграмму
Dim Ax 'Объект, задающий ось диаграммы
Dim Ser 'Объект, задающий серию данных
Dim strDebug 'Строка, используемая при отладке
With myChartSpace
'strDebug="step 1 "
'MsgBox(strDebug)
Set myc = .Constants
'размеры области диаграммы
.width = "100%"
.height = "300"
'Источник данных
If .ChartDataSources.Count = 0 Then
.DataSource = BooKFour_1787_WebCalc
Else
.DataSource.Refresh
End If
'Добавляем Объект Chart в коллекцию
Set cht = .Charts(0)
'strDebug="step 2 "
'MsgBox(strDebug .Charts.Count)
'Устанавливаем его параметры
With cht
'По умолчанию - тип диаграмма
.Type = myc.chChartTypeColumnClustered
strDebug = "ColumnClustered"
If SelType.Value = "График" Then
.Type = myc.chChartTypeLineMarkers
strDebug = "LineMarkers"
End If
'MsgBox("Тип диаграммы - " strDebug)
'Легенда и заголовок диаграмы
.HasLegend = True
.HasTitle = True
.Title.Caption = "Дилеры и Объемы продаж"
'Заголовки осей
Set Ax = .Axes(myc.chAxisPositionLeft)
Ax.HasTitle = True
Ax.Title.Font.Italic = True
Ax.Title.Font.Bold = True
Ax.Title.Caption = "Объем Продаж"
Set Ax = .Axes(myc.chAxisPositionBottom)
Ax.HasTitle = True
Ax.Title.Font.size = 14
Ax.Title.Font.Bold = True
Ax.Title.Caption = "Кварталы -2001"
'Установка данных
.SetData myc.chDimCategories, 0, "C5:C8"
.SetData myc.chDimSeriesNames, 0, "D4:F4"
.SeriesCollection(0).SetData myc.chDimValues, 0, "D5:D8"
.SeriesCollection(1).SetData myc.chDimValues, 0, "E5:E8"
.SeriesCollection(2).SetData myc.chDimValues, 0, "F5:F8"
'Работа с серией данных. Определение тренда
Set Ser = .SeriesCollection(1)
Ser.TrendLines.Add
Ser.TrendLines(0).Type = myc.chTrendLineTypeExponential
Ser.TrendLines(0).Order = 2
Ser.TrendLines(0).IsDisplayingEquation = True
End With
End With
End Sub
Хотя процедура снабжена комментариями, но целесообразно дать дополнительные пояснения:
cht, Ax, Ser и другие. Хотя VBScript и бестиповый язык, но объявлять переменные все равно целесообразно - это правильный стиль программирования.ChartSpace. Заметьте, имя MyChartSpace, которым я пользуюсь, - это ID объекта, заданное при определении соответствующего тега object, приведенного выше. Я использую свойства width и height, чтобы задать подходящую область пространства диаграмм. При первоначальном определении объекта в теге его размеры задавались минимальными, теперь область расширяется до подходящих размеров.SpreadSheet , расположенный на этой же Web-странице. Заметьте, я выполняю проверку того, не установлена ли уже связь с этим источником. Дело в том, что командная кнопка может нажиматься многократно и, следовательно, процедура может работать многократно, а попытка связи с уже присоединенным источником приводит к ошибке. Так что, когда связь уже установлена, то вызывается только метод Refresh для обновления данных источника.cht класса WCChart я не использую метод Add для добавления нового элемента в коллекцию, поскольку один элемент этой коллекции создается автоматически. Конечно, если бы я хотел одновременно показать несколько диаграмм, без использования этого метода не обойтись.cht, - задаются параметры, определяющие его элементы.SelType - задается его ID, определенным при размещении элемента на Web-странице. Конечно, я без труда мог бы дать пользователю больший набор возможных типов, что лишь слегка бы увеличило размер нашей процедуры.Title, Legend, Axes, Axis и другими.SeriesCollection. Поскольку источником данных является электронная таблица - объект SpreadSheet , то мне достаточно указать диапазон ячеек, где находятся данные серии.Полагаю, что данный пример позволил продемонстрировать способы программной работы с компонентом Chart. В заключение взгляните, как выглядит этот же интерактивный документ, когда пользователь выберет из списка значение "график" и нажмет кнопку построения диаграммы:
(рис 10.10) Программное построение диаграммы другого типа
В предыдущей главе, посвященной анализу офисной деятельности, подробно рассматривались сводные таблицы - один из самых мощных инструментов, позволяющий эффективно анализировать большие объемы данных, хранящихся в различных источниках. Сводные таблицы позволяют анализировать информацию под разными углами зрения, получать различные срезы, сортировать, фильтровать, группировать данные нужным образом. Сводные диаграммы, тесно связанные со сводными таблицами, позволяют тут же отобразить в графической форме полученную информацию.
Конечно же, иметь подобный инструмент при работе с документами в интрасетях чрезвычайно важно. И такой инструмент был создан - среди компонентов OWC имеется компонент PivotTable, позволяющий создать интерактивный Web-документ, содержащий сводную таблицу, с которой можно практически работать также, как в обычном Excel.
Самый простой способ создать интерактивную Web-страницу, содержащую сводную таблицу, - использовать для этой цели Excel. Здесь давно существовала возможность создать сводную таблицу по данным реляционной базы данных, например, Microsoft Access или Microsoft SQL Server. В Excel 2000 в процессе создания сводной таблицы можно параллельно создать и OLAP - куб, который и будет служить источником данных для этой таблицы. После того, как сводная таблица в Excel получена, ее можно сохранить в виде интерактивной Web-страницы, на которой будет помещен компонент PivotTable. При публикации можно присоединить и сводную диаграмму. Замечу, что фактически на Web-странице Excel разместит два компонента - PivotTable и Data Source. Источником данных для компонента Data Source может служить, например, OLAP-куб, а уж затем данные будут переданы компоненту PivotTable. Взгляните, как выглядит подобная Web-страница со сводной таблицей, открытая в Internet Explorer:
Sґ
(рис 10.11) Интерактивная Web-страница со сводной таблицей
Одним из главных вопросов, требующих решения при работе со сводными таблицами, является организация связи с источником данных. Как я уже говорил, при создании в Excel такого инструмента анализа данных, как сводная таблица, с самого начала предполагалось, что основным источником данных для них будут внешние источники - базы данных. Естественно, что возможность использования в качестве источника данных таблиц самого Excel подразумевалась сама собой, и была гарантирована в первую очередь. Три основных типа внешних источников данных могут быть использованы сводными таблицами Excel:
Компонент сохранил все эти возможные источники данных. Более того, еще одним источником данных может быть DataSource - четвертый компонент, входящий в состав OWC. Для связи с базами данных используется интерфейс OLE DB - стандарт, разработанный Microsoft. Для связи с OLAP источниками данных Microsoft разработала модификацию этого стандарта - OLE DB for OLAP, которая позволяет взаимодействовать с многомерными хранилищами данных аналогично тому, как это взаимодействие происходит при работе с табличными базами данных. Этот стандарт поддерживается как базами данных от Microsoft, так и многими другими многомерными хранилищами данных.
Взаимодействие компонента с источником данных начинается с того, что указанный при соединении провайдер источника данных определяет механизм этого взаимодействия. Для OLE DB for OLAP провайдера используется интерфейс TCP/IP. После того как соединение установлено, в список полей компонента - , который будет более подробно рассматриваться ниже - передается структура OLAP-куба, его поля, измерения, а также иерархии, связанные с измерениями. Когда пользователь начинает в интерактивном режиме оперировать со сводной таблицей или когда это делается программным путем, компонент генерирует соответствующий MDX-запрос (
В качестве источника данных для компонента можно указать адрес в Internet - URL, который возвращает XML-поток данных. Конечно, данные этого потока должны удовлетворять определенным требованиям. Microsoft разработала стандарт, которому должен удовлетворять XML-поток данных, и провайдера - OLE DB persistence provider, который способен принимать данные в этом формате. В главе, посвященной ADO, упоминался среди прочих и этот провайдер данных.
Давайте поговорим теперь о том, что может делать пользователь, работая с компонентом в интерактивном режиме. Вот основные действия, доступные пользователю:
Pivot Table содержит набор командных кнопок, запускающих выполнение определенных команд.Инструментальная панель расположена в верхней части компонента и содержит 19 командных кнопок, часть из которых уже знакома нам по интерфейсу компонента , часть - по работе с инструментальной панелью сводной таблицы в Excel. Вот краткое описание этих кнопок:
- кнопка с логотипом Office отображает информацию о компоненте, задавая номер инсталлированной версии. Имеет ссылку, позволяющую перейти на узел технической поддержки пользователей программных продуктов Microsoft.
- позволяет скопировать выделенную часть сводной таблицы в буфер, а затем содержимое буфера перенести в то или иное приложение. Таким образом, можно осуществлять передачу данных от компонента Pivot Table в приложения, допускающие работу с буфером. Заметьте, что в отличие от компонента SpreadSheet , здесь нет кнопки Paste, так что обратная передача данных не допускается. Очевидно, что наличие этой возможности противоречило бы самой сути сводных таблиц, поскольку проводимый анализ не связан с изменением данных в процессе анализа. Данные можно изменять только в самом источнике.
- знакомые нам кнопки позволяют проводить сортировку выделенных данных сводной таблицы в порядке возрастания или убывания. Последняя из этой группы кнопок включает или выключает фильтр, заданный полями фильтра сводной таблицы.
- кнопка автосуммирования позволяет произвести вычисление итогов для выбранного поля, применяя одну из возможных функций. Серый цвет кнопки означает, что тип поля не позволяет подводить итоги или провайдер не обеспечивает выполнения такой функции. Замечу, что OLAP-провайдер не допускает автосуммирования, поскольку подобные вычисления проводятся на стороне сервера, а не на клиентской машине. Таким образом, при работе с кубами OLAP эта кнопка всегда будет оставаться серой.
- позволяет включать или выключать промежуточные итоги для выбранного поля. Эта кнопка работает и для OLAP-провайдера.
- эта группа кнопок позволяет перемещать поля между измерениями, перенося поле соответственно на ось строк, столбцов, фильтра или в область данных.
- эта пара кнопок также позволяетперемещать поля, но внутри одного измерения, меняя их порядок следования.
- включает или выключает иерархию, допустимую для данного измерения.
- обновляет список полей сводной таблицы, с учетом всех изменений, которые могли произойти в источнике данных.
- создает новую рабочую книгу Excel и копирует туда сводную таблицу с сохранением ее интерактивности. Это позволяет сохранить в Excel структуру сводной таблицы, выбранную пользователем. Замечу, что данные не передаются в Excel, а поступают туда из источника данных. Возможность экспорта сводной таблицы в Excel, конечно же, увеличивает мощь компонента Pivot Table .
- открывает инструментальную панель свойств, набор кнопок которой зависит от контекста, - какой из элементов сводной таблицы является выделенным.
- открывает окно, содержащее список полей, доступных для конструирования сводной таблицы в интерактивном режиме.
- открывает справочную систему по компоненту Pivot Table .Панель свойств задает дополнительный набор команд, которые можно выполнять над тем или иным элементом. Вот какой вид имеет эта панель при выборе поля строки:
(рис 10.12) Панель свойств элемента "поле строки"Как видно на рисунке, свойства на этой панели сгруппированы по разделам. Для всех элементов сводной таблицы присутствует раздел "Общее", где отображается выбранный элемент сводной таблицы и есть кнопка, позволяющая перейти в справочную систему. Для всех элементов сводной таблицы доступен также раздел "Формат" с различными возможностями, зависящими от типа элементов. Форматирование позволяет менять используемый шрифт, цвета, размеры поля. Для числовых полей и полей дат разрешается применять различные форматы записи. Раздел "Отображение" позволяет изменять внешний вид сводной таблицы, включая или отключая те или иные элементы, например, индикаторы развертывания или главную инструментальную панель. Я не буду в деталях описывать все возможные команды, доступные на этой панели.
Окно со списком полей играет важную роль в работе пользователя, предоставляя ему широкие возможности по конструированию сводной таблицы. Список полей создается, как я уже говорил, в тот момент, когда устанавливается связь с источником данных сводной таблицы. Он отображает все поля, доступные для формирования сводной таблицы. Например, для OLAP-куба это все его измерения и все иерархии. Пользователь может включать в сводную таблицу лишь часть из этих полей. Но в любой момент, открыв этот список, он может перестроить таблицу, добавив туда нужные ему поля. При удалении из сводной таблицы поле по-прежнему остается в списке полей.
В предыдущей главе, учитывая важность этого вопроса, я много внимания уделил сводным таблицам в Excel. В частности, там подробно анализировалась объектная модель этого компонента, рассматривались вопросы программного создания сводных таблиц. Переходя к обзору объектной модели компонента PivotTable, замечу сразу, что его объектная модель имеет существенные отличия от своего аналога в Excel, по крайней мере, эти отличия сказываются на верхнем уровне модели.
Напомню, в Excel два класса объектов и их коллекции определяют работу со сводными таблицами. Объекты PivotCache и коллекция PivotCaches отвечают за связь с источником данных и хранение в оперативной памяти данных, необходимых для сводной таблицы. Именно эти объекты имеют такие свойства, как SourceType, SourceData, Connection, CommandText, которые обеспечивают связь с источником данных. Объект PivotTable в этой модели отвечает за структуру сводной таблицы, работу с ней.
В объектной модели компонента PivotTable объект Pivot Cache и его коллекция исчезли, - их функции перешли к самому объекту PivotTable. Теперь у него есть свойства: DataSource, ConnectionString, CommandText, ProviderType, XMLData, DataMember, позволяющие связаться с различными источниками данных. Ту роль, которую играл объект PivotTable в модели Excel, теперь играет новый объект PivotView, встроенный в объект PivotTable. Этот объект возвращается при вызове свойства ActiveView, и он отвечает за конфигурацию сводной таблицы.
В объектной модели PivotView также много новых объектов, если не по сути, то по названию. Конфигурация сводной таблицы задается в первую очередь ее измерениями - в данной объектной модели они называются осями и представляются объектами Axis. Соответствующие свойства объекта PivotView возвращают объекты:
RowAxis, ColumnAxis возвращают объект PivotGroupAxis - определяющий измерения (оси) по строкам и столбцам сводной таблицы.DataAxis - возвращает объект PivotDataAxis, задающий ось данных.FilterAxis - возвращает объект PivotFilterAxis, задающий ось фильтров.Все Axis-объекты и сам объект PivotView имеют свойство FieldSets, возвращающее соответствующую коллекцию PivotFieldSets, которая задает множество полей, расположенных на той или иной оси. Методы и свойства объекта PivotField, задающего отдельное поле позволяют выполнять операции над этим полем - сортировку, фильтрацию.
Я ограничусь этим кратким обзором, и не буду углубляться в детали объектной модели. В следующей главе будет дан пример построения интерактивного Web-документа, содержащего сводную таблицу. Там мы на практике познакомимся со многими упомянутыми здесь объектами.
Компонент Data Source (, оставаясь невидимым, выполняет большую работу по связыванию с различными внешними источниками данных, построению и выполнению команд по их доставке. В свою очередь он служит, как правило, источником данных для других компонент OWC - . Этот компонент несет основную нагрузку по доставке данных и при работе со страницами доступа данных в Access (Access 2000 Data Access Pages).
Так как реализует стандартный интерфейс источников данных - IDataSource Interface, - определенный и поддерживаемый Internet Explorer (начиная с версии 5) и Visual Basic (начиная с версии 6), то эти контейнеры воспринимают его как правильный источник данных. Это означает, что при размещении компонента
Замечу, что не только , но и другие компоненты OWC могут служить источниками данных и удовлетворяют интерфейсу IDataSource. Так, компонент может поставлять данные компонентам Chart и , а последний, в свою очередь, может поставлять данные для компонента Chart.
Источники данных имеют достаточно сложную структуру и состоят из наборов данных, называемых элементами (членами) источника - . Каждый такой элемент задает некоторый набор данных - Recordset, который может использоваться при связывании источника данных с тем или иным элементом, расположенным на Web-странице. Для компонента в качестве элемента источника - - может использоваться любой диапазон его ячеек. Для компонента RecordsetDefs.
В детали объектной модели этого компонента я углубляться не буду. Вместо этого я приведу пример, в котором на Web-странице строится круговая диаграмма по данным внешнего источника - базы данных Access. Посредником в связывании данных будет выступать компонент Data Source. На этом примере я постараюсь прояснить и роль , и роль RecordsetDefs.
Прежде чем перейти к примеру, хочу отметить следующее. Надеюсь, понятно, что поскольку элемент является невидимым, то никакого интерфейса у него нет, так что общение с ним возможно только на программном уровне. Поэтому в данном разделе я приведу достаточно большой кусок программного кода. Следует заметить также, что элемент действительно невидим в момент выполнения, например при просмотре Web-страницы в Internet Explorer. Однако в режиме проектирования, например, при открытии страницы в приложении FrontPage, местоположение элемента отмечается небольшим значком с изображением ключа -
.
В наших примерах неоднократно появлялась база данных "Офис РР". В главе 18 она использовалась при построении OLAP-куба и сводной таблицы. Теперь я воспользуюсь ею и построенным OLAP-кубом, чтобы создать Web-страницу, на которой будет строиться круговая диаграмма, отражающая вклад каждого из сотрудников в общее дело добывания заказов. На страницу будут помещены два компонента OWC - Chart и Data Source. Компонент будет посредником в передаче данных от базы данных к диаграмме.
Наша страница не будет интерактивной, так как сам элемент Chart, как вы помните, не имеет собственной инструментальной панели. И я не буду выносить сами данные на страницу, передавая их, например, в элемент . Не буду я и программно добавлять интерфейс элементу Chart. Тем не менее, этот пример кажется мне достаточно интересным, так как позволяет продемонстрировать, как самому создать страницу с расположенными на ней элементами OWC. А главное, он показывает роль как посредника при передаче данных. Вот полный HTML-текст Web-страницы, созданной в редакторе FrontPage:
<html>
<head>
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>MDB-база данных -> Data Source -> Chart</title>
<link rel="STYLESHEET" href="file:///Styles.css" type="text/css">
</head>
<body>
<h1>Связывание: MDB-база данных -> Data Source -> Chart </h1>
<!-- Chart Control -->
<object classid="clsid:0002E500-0000-0000-C000-000000000046" id="ChartSpace1"
style="HEIGHT:80%; WIDTH:100%" width="576" height="384">
</object>
<p> </p>
<!-- Data Source Control -->
<object classid="clsid:0002E530-0000-0000-C000-000000000046" id="DSC" width="16"
height="15">
<param name="XMLData" value="<xml xmlns="urn:schemas-microsoft-com:office:access">
<DataSourceControl>
<OWCVersion <9.0.0.2710> </OWCVersion>
<MaxRecords> 0 </MaxRecords>
<GridX> 10 </GridX>
<GridY> 10 </GridY>
<Datamodel version="0816"> </Datamodel>
</DataSourceControl>
</xml>">
</object>
<!-- Script for loading the chart -->
<script language=VBScript>
'--------------------------------------------------------------------------
Sub Window_onLoad()
' Код выполняется при загрузке страницы в браузер.
' Устанавливается соединение компонента DSC с базой данных Access.
' Формируется RecordsetDef как источник данных для построения диаграммы.
' Установка строки соединения элемента DSC
Dim sDBPath 'Путь к базе данных
sDBPath = "c:\!o2000\DsCd\Ch19\dbPP2000.mdb"
DSC.ConnectionString = _
"provider=microsoft.jet.oledb.4.0;data source=" sDBPath
' Добавляется RecordsetDef с именем ChartData,
' который будет источником данных для компонента Chart
' Формируется запрос к базе данных Access
Dim myQ 'Запрос к базе данных
myQ = "SELECT Заказы.Сотрудник, Sum(Заказы.Стоимость) AS [Sum-Стоимость]" _
"FROM Заказы " _
"WHERE (((Заказы.ДатаЗаказа)>=#9/1/1997# And" _
"(Заказы.ДатаЗаказа)<=#11/9/2001#))" _
"GROUP BY Заказы.Сотрудник"
'Определение Recordset, который будет элементом,
'определяющим данные - Data Member для компонента Chart
DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"
'Вызов процедуры, осуществляющей связывание DSC с компонентом Chart.
BindChartToDSC ChartSpace1, DSC, "ChartData", "Сотрудник", "SUM-Стоимость"
End Sub 'Window_onLoad()
'--------------------------------------------------------------------------
Sub BindChartToDSC(cspace, dsc, sRSName, sCategories, sValues)
' Связывает Chart с набором данных - Recordset компонента Data Source.
' Создает круговую диаграмму - Pie chart.
' Параметры процедуры:
' cspace ссылка на ChartSpace object
' dsc ссылка на Data Source control
' sRSName имя набора Recordset в Data Source
' sCategories имя столбца в наборе, содержащего имена сотрудников
' sValues имя столбца в наборе, содержащего суммарную стоимость заказов
Dim cht ' Chart object который будет создан в пространстве диаграммы
Dim ser ' серия данных
Dim dls 'метки круговой диаграммы
' Определение объекта Constants, позволяющего использовать
' именованные константы в script-коде.
set c = cspace.Constants
' Чистим Chart space
cspace.Clear
' Устанавливаем DSC как источник данных для Chart
set cspace.DataSource = dsc
' Устанавливаем набор данных внутри Data Source, используемый Chart.
cspace.DataMember = sRSName
' Создаем круговую диаграмму Pie chart в пространстве диаграмм.
set cht = cspace.Charts.Add()
cht.HasLegend = True
cht.HasTitle = True
cht.Title.Caption = "Распределение заказов в стоимостном исчислении"
cht.Title.Font.Bold = True
cht.Type = c.chChartTypePie
' Определяем единственную серию в диаграмме - объект ser
' и вызываем ее метод SetData для связывания с данными серии.
' Значение 0 второго параметра указывает, что используется первый набор
' данных источника Data Source.
set ser = cht.SeriesCollection.Add()
ser.SetData c.chDimCategories, 0, sCategories 'Ось категорий
ser.SetData c.chDimValues, 0, sValues 'Ось значений
' задаем метки круговой диаграммы - Pie chart.
set dls = ser.DataLabelsCollection.Add()
dls.HasPercentage = True
dls.HasValue = False
End Sub 'BindChartToDSC()
</script>
</body>
</html>
А вот как выглядит эта страница, открытая в Internet Explorer:
(рис 10.13) Web-страница с компонентами Data Source и ChartГлавное в этом коде - сценарий, написанный мной на VBScript. Почти половину программного текста составляют комментарии, поясняющие все этапы работы. Тем не менее, я добавлю еще несколько общих замечаний:
Chart и Data Source - и, естественно, script кода.Window_onLoad. В ней и выполняется нужная нам работа по связыванию базы данных и компонентов.DSC связывается с базой данных и получает от нее данные. На втором шаге - вызывается процедура BindChartToDsc, строящая диаграмму, источником данных для которой уже служит сам DSC .Говоря о работе , можно отметить:
ConnectionString - устанавливается связь с базой данных.DSC.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source=" sDBPathСоответствующая строка, как обычно, состоит из двух частей и задает провайдера базы данных и путь к самой базе. В данном случае используется провайдер Jet для связи с базой данных Access.
RecordsetDefs, определяющий набор данных - Data Member источника данных.DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"Этот набор получает имя
ChartData. Команда, определяющая действия по доставке данных, в данном случае задается текстом SQL-запроса к базе данных. Сам текст запроса записан в строку, заданную переменной myQ. В процессе выполнения запроса данные группируются, происходит суммирование стоимости всех заказов, выполненных тем или иным сотрудником.BindChartToDsc, строящая диаграмму, которой передается информация о DSC и его наборе данных - ChartData. Замечу еще, что для тех, кто привык работать с ADO, нет ничего нового в синтаксисе и семантике работы с DSC .Несколько слов о работе процедуры BindChartToDsc. Отмечу главное:
set cspace.DataSource = dsc cspace.DataMember = sRSName
так устанавливается связь объекта cspace, - основного объекта, задающего пространство диаграммы, - с источником данных и набором данных внутри этого источника. Остальные операторы внутри процедуры выполняют рутинную работу по формированию различных областей диаграммы.
Надеюсь, этот пример позволяет ощутить возможности компонента и его роль в получении данных от различных источников с последующей их передачей другим компонентам OWC.
Одно из достоинств компонентов OWC заключается в том, что они могут работать на стороне сервера. Причины, по которым целесообразно перенести их работу на сервер, могут быть самыми разными. Вот три основные:
Обычно Com-объекты работают либо как видимые объекты, либо как невидимые объекты (in memory). Компоненты OWC спроектированы так, что для них возможны оба способа работы. На стороне сервера они работают, конечно же, как невидимые объекты, поскольку там нет клиента, который мог бы с ними работать в интерактивном режиме. Они создаются программно, с использованием метода CreateObject, вызываемого объектом Server. Вот как может выглядеть код, создающий на стороне сервера компонент Chart, или, более точно, основной его объект cspase:
Set m_cspace = Server.CreateObject("OWC.Chart")
После того как объект получен, остальная часть работы с этим объектом на сервере ведется так же, как и на стороне клиента. Завершающим аккордом на стороне сервера является преобразование построенной диаграммы или сводной таблицы в графический образ, который и пересылается клиенту. Для этой цели используется метод ExportPicture, которым обладают компоненты OWC.
Подводя итоги, отмечу, что включенные в состав Office 2000 компоненты OWC выполняют важную работу, позволяя проводить полноценный анализ данных, возможный ранее только в Excel, как при работе в интрасетях, так и при построении собственных решений на базе различных контейнеров, допускающих работу с COM-объектами.
Как и всегда при работе в мощной среде Office 2000, многие задачи, требующие использования этих компонентов, могут решаться "руками" - по существу, несколькими нажатиями кнопки мыши. Однако, возможно, самое главное достоинство этой среды, в том числе и компонентов OWC, заключается в том, что можно произвести тонкую настройку решения, учитывающую специфику задачи. Когда стандартных решений становится недостаточно, за дело берется программист, который, работая с имеющимися в его распоряжении объектами среды, может создать собственное решение, существенно расширяющее стандартные возможности среды.
Объектная модель компонент OWC весьма разнообразна и предоставляет программисту широкие возможности. Программная работа по созданию решений, использующих компоненты OWC, по существу, является важной частью офисного программирования.
Создание Office Web Components (OWC) - набора компонентов, реализующих основную функциональность Excel, которые могут работать на Web-страницах - явилось одним из наиболее важных достижений фирмы Microsoft в области компонентного программирования. Создание высококачественных компонентов различными фирмами - производителями программных продуктов и построение собственных решений на базе готовых, многократно используемых и проверенных компонентов - в этом суть компонентного программирования. Компоненты OWC созданы на основе Com-технологии и являются Com-объектами или, как теперь принято говорить, элементами ActiveX. Как и всякие элементы ActiveX, они могут использоваться в различных приложениях - контейнерах ActiveX, если последние построены в соответствии со стандартами, принятыми для подобных контейнеров.
Все основные приложения Microsoft, такие как Internet Explorer, начиная с версии 4, Visual Basic, Visual C++, FrontPage, InterDev, Office UserForms и другие приложения от Microsoft и от других фирм могут служить контейнерами для компонентов OWC. Конечно, несмотря на стандарт, контейнер контейнеру рознь, и возможны определенные особенности в работе того или иного контейнера с данными компонентами.
В название рассматриваемых компонентов включены два термина - Office и Web. Первый отражает тот факт, что эти компоненты вошли в состав Office 2000 и являются важной частью этого пакета. Второй термин подчеркивает, что компоненты могут с успехом работать на Web-страницах - точнее, что Internet Explorer является одним из допустимых контейнеров этих элементов. Вместе с тем следует понимать, что компоненты OWC могут работать не только на Web-страницах: их можно также с успехом использовать в собственных решениях, не связанных с документами Office 2000.
Подводя первый итог, отметим, что эти компоненты позволяют решить две важнейшие задачи:
Microsoft не только создал эти компоненты, но и первым показал пример их использования, встроив их в Office 2000. Их появление позволило достичь важнейшей для Office 2000 цели - придания интерактивности документам Office 2000, опубликованным в виде Web-страниц и доступным пользователям интрасетей.
Здесь и в дальнейшем под интрасетью я буду понимать все вариации сетей - internet, intranet,
Интрасети становятся стратегическим направлением развития Microsoft. "Документы создаются в сети и для работы в сети" - вот девиз сегодняшнего дня и ближайшего десятилетия.
Иметь возможность просматривать в сети документы Office 2000 - отчеты, подготовленные в Word, презентации, подготовленные в Power Point, - анализировать данные, сведенные в таблицы Excel, сопровождаемые графиками и диаграммами, - все это крайне важно для пользователей, работающих с документами. Но этого уже недостаточно. Статические страницы не всегда могут удовлетворить запросы активно работающего пользователя. Пожалуй, прежде всего, это касается пользователей, задача которых состоит в анализе деятельности своего офиса, в оценке эффективности тех или иных процессов. Для таких пользователей Excel является одним из основных инструментов, позволяющим проводить исследования типа "что если". Например, его может интересовать, как изменятся характеристики изучаемого процесса при изменении значений тех или иных параметров, что произойдет, если изменить цены или ввести те или иные скидки. Когда у пользователей, работающих в сети, возникают такие задачи, без OWC не обойтись.
Для программистов важно то, что они могут использовать компоненты OWC в своих решениях. Не менее важно и то, что для программистов эти компоненты являются обычными объектами с известной объектной моделью, а потому, используя свойства и методы этих объектов, можно нужным образом настроить свое решение. Компоненты OWC являются программируемыми объектами.
Набор OWC разработан той же командой, что создавала приложение Excel, и представляет собой компоненты, реализующие основную функциональность Excel. В набор OWC входят четыре компонента:
Spreadsheet . Этот элемент реализует функциональность Excel, как электронной таблицы. Он включает:Pivot Table . Функциональность этого компонента включает свойства сводной таблицы Excel с рядом полезных дополнений. Этот элемент позволяет:Chart. Этот компонент позволяет не только просматривать график или диаграмму как статический рисунок, но, благодаря связи с источником данных, мгновенно отображать на диаграмме изменения, происходящие с данными источника. Также как и остальные Web-компоненты, объект Chart является полностью программируемым и допускает обращение к его свойствам и методам при выполнении VBScript-кода в Internet Explorer.Data Source. Этот компонент не имеет визуального образа при размещении его на Web-странице. В отличие от остальных трех элементов он не играет самостоятельной роли. Обеспечивая соединение с источником данных с последующей доставкой данных, этот элемент играет роль посредника между источником данных и другими компонентами OWC.Поскольку компоненты OWC встроены в Office 2000, то для большинства пользователей Office работа с компонентами скрыта. Пользователь, работающий с документами Excel или Access, может использовать эти компоненты, даже не подозревая о том, что он их использует. Конечно же, опытный пользователь - программист, знающий объектную модель компонентов и умеющий программировать на VBScript, может произвести настройку компонентов OWC, расположенных на Web-странице, включив дополнительные свойства, учитывающие специфику работы с его документом.
Включение компонентов OWC в состав Office 2000 привело к появлению новых возможностей по публикации документов в Excel 2000. В связи с этим существенно изменился внешний вид и функции диалогового окна "Сохранение документа". Также как и в Word, здесь появилась панель с кнопками (ярлыками), позволяющая уточнить расположение сохраняемого документа. В частности, кнопка "Web Folders" открывает Web-папки, хранящиеся на сервере, и позволяет публиковать документ (Web-страницу) непосредственно в папку на сервере, тем самым мгновенно делая его доступным всем участникам совместной работы над документом в интерсети. В этом же диалоговом окне можно указать, следует ли публиковать всю рабочую книгу или отдельный лист, нужно ли добавлять интерактивность публикуемой странице. Командная кнопка "Опубликовать" этой панели открывает новое диалоговое окно "Публикация Web-страницы", в котором можно более детально задать элемент рабочей книги, предназначенный для публикации, а также вид и нтерактивности, придаваемой публикуемому элементу.
В зависимости от типа публикуемых данных на Web-странице автоматически располагаются различные Web-компоненты. Я не буду сейчас останавливаться на деталях этого процесса, но надеюсь, что из сказанного уже очевидно, что, работая в Excel, создавать интерактивные Web-страницы с встроенными компонентами OWC достаточно просто, - нужно лишь грамотно задавать параметры при сохранении страниц рабочей книги Excel или отдельных элементов этих страниц. Аналогичная ситуация имеет место и при работе в Access, где также могут автоматически создаваться интерактивные страницы с расположенными на них компонентами OWC.
Вот как выглядит в Internet Explorer соответствующая Web-страница, полученная при сохранении в Excel интерактивной диаграммы, расположенной на рабочем листе книги Excel.
(рис 10.1) Интерактивная диаграмма и рабочий лист с источником данных при просмотре в Internet ExplorerЗаметьте, в этом случае на Web-страницу выносится как сама диаграмма, так и рабочий лист с источником данных этой диаграммы. В данном конкретном случае диаграмма отображает поквартальную динамику объема продаж, выполненных группой дилеров, с подведением итогов за год. При просмотре в Internet Explorer этой Web-страницы можно ввести новые, уточненные данные, например, за 3-й и 4-й кварталы - тут же машина вычислений пересчитает итоги, тут же перестроится и диаграмма.
Все это становится возможным благодаря тому, что на Web-странице в момент ее сохранения в Excel автоматически размещаются три компонента OWC - Chart, Data Source и
<object id="BookFour_29850_WebChart" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E500-0000-0000-C000-000000000046" width=378 height=217> <param name=XMLData value= …> </object> <object id="BookFour_29850_DSC" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E530-0000-0000-C000-000000000046"> <param name=XMLData value= …> </object> <object id="BookFour_29850_WebCalc" codebase="file:G:\msowc.cab#version=9,0,0,2710" classid="CLSID:0002E510-0000-0000-C000-000000000046"> <param name=DisplayTitleBar value=false> <param name=DataType value=HTMLData> <param name=HTMLData value= …> </object>
Компоненты вставляются как объекты. Параметр classid позволяет найти их, если они зарегистрированы на компьютере пользователя, просматривающего соответствующую Web-страницу. Параметр codebase позволяет найти их, если они еще не зарегистрированы. Контент, передаваемый компоненту, задается тегом param этих объектов. Я не привожу достаточно длинное значение параметра value этого тега. По правде говоря, можно обойтись и без задания этого контента, что будет видно из последующих примеров.
Надеюсь, понятно, что для того чтобы работа с этой страницей стала возможной, на компьютере пользователя должны присутствовать компоненты OWC или они должны быть доступны для загрузки с источника, указанного параметром codebase.
Давайте поговорим теперь более подробно о компонентах.
Приложение Excel многофункционально. Excel создавался как электронная таблица, - и в этом его основное назначение. Главная особенность электронной таблицы состоит в том, что в ее ячейки можно вводить не только данные, но и формулы. Формулы Excel, также как и обычные математические формулы и выражения в языках программирования, оперируют при вычислении значений константами, переменными и функциями. В электронной таблице роль переменных играют отдельные ячейки и области таблицы. Машина вычислений, связанная с электронной таблицей, при каждом изменении данных в таблице, инициированных пользователем или внешними ссылками, пересчитывает формулы, зависящие от этих данных. Такие повторные вычисления делают электронную таблицу живой, - изменение значения одной ячейки приводит, возможно, к пересчету всей таблицы.
Компонент представляет электронную таблицу, наследующую многие из свойств электронной таблицы Excel. Рассмотрим основные свойства этой электронной таблицы.
Машина вычислений компонента практически сохраняет все основные возможности машины вычислений Excel. Конечно же, здесь нет возможности вести циклические вычисления, тем более, нет встроенных возможностей по решению оптимизационных задач. Но вычисления, определяющие суть электронной таблицы, ведутся по тому же алгоритму, что и в Excel.
Практически сохранена библиотека функций Excel, допустимых при построении формул. Следует сказать, что чрезвычайно обширная библиотека функций Excel является его гордостью. Компонент может также гордиться своей библиотекой. В ее состав входят функции, разбитые на 10 основных категорий:
Важно, однако, понимать, что не все функции, имеющиеся в Excel, реализованы, может быть реализовано только 95% функций, например, нет функции (транспонирования) из класса математических функций, Trend - из класса статистических функций, Asc - информационной функции и некоторых других функций. Более полную информацию о функциях, включенных в состав библиотеки, можно найти в справочной системе, сопровождающей компонент.
С каждым компонентом связывается один рабочий лист - одна электронная таблица. Ее максимальный размер 65536 строк на 702 столбца (с именами от A до ZZ). Заметьте, что в Excel 2000 при том же числе строк число столбцов меньше почти в три раза - всего 256. Однако не стоит особенно обольщаться возможным большим размером листа, так как тут же возникает проблема времени его загрузки при работе в сети.
Поскольку с каждым компонентом связывается только один лист, то при публикации на Web нельзя сохранить в интерактивном режиме сразу всю рабочую книгу Excel, состоящую из нескольких рабочих листов. Приходится независимо сохранять каждый рабочий лист или часть этого листа на отдельной Web-странице.
В формулах Excel могут использоваться как внутренние, так и внешние ссылки. Компонент не поддерживает внешних ссылок. Более того, поскольку каждый рабочий лист сохраняется как независимая Web-страница, то ссылки на ячейки других рабочих листов той же книги считаются внешними и не поддерживаются. В самом приложении Excel ссылки между страницами одной книги считаются внутренними.
Что касается внутренних ссылок, то для них могут использоваться различные форматы - абсолютные адреса ($A$1) и относительные - (A1). Формат относительных ссылок RC, задающий смещение по строкам и столбцам (Row - Column), считается устаревшим и не поддерживается. Использование в формулах именованных диапазонов также, к сожалению, не поддерживается. При сохранении листа Excel именованные диапазоны преобразуются в абсолютные адреса, поэтому уже написанные формулы будут, конечно, работать, но написать новую формулу в интерактивном режиме, содержащую именованный диапазон, не удастся. Поддержку именованных диапазонов можно обеспечить лишь программным путем. Не поддерживается и обновление Web-запросов.
Компонент поддерживает переход по гиперссылкам, задающим адреса (URL) в Интернете. Достаточно напечатать в любой ячейке строку, начинающуюся с http://, как она будет воспринята в качестве гиперссылки и щелчок по этой ячейке задаст переход к соответствующей странице в Интернете. Другой способ состоит в том, чтобы задать в ячейке таблицы формулу, вызывающую функцию Hyperlink.
Одними из основных операций, которые чаще всего выполняют пользователи, работающие в интерактивном режиме с электронной таблицей, - это операции "Копировать" - "Вставить", использующие буфер. Поскольку есть ряд отличий от выполнения их в Excel, то на некоторые моменты хочу обратить внимание.
Paste Special отсутствует. Никаких дополнительных операций, возможных в Excel в момент копирования, здесь нет.Копирование и вставка используются не только для операций, выполняемых внутри электронной таблицы, но и для обмена данными с другими программами.
Допускается форматирование внешнего вида электронной таблицы. Замечу, что можно удалить сетку, заголовок таблицы, имена столбцов. Разрешается удалять и добавлять строки и столбцы таблицы, изменять их размеры, форматировать отдельные ячейки, изменять границы, шрифты и производить другие подобные операции.
Как я уже говорил, Excel является многофункциональным приложением, и над данными, располагаемыми на его страницах, можно выполнять самые разнообразные операции. Компонент полной функциональностью Excel, конечно, не обладает; тем не менее, ряд важных дополнительных функций включен в его состав.
SpreadSheet допустим только один вариант - AutoFilter, и критерии фильтрации существенно упрощены в сравнении с аналогичным вариантом Excel. Замечу, что спрятанные Как можно видеть на рис. 10.1, в верхней части компонента располагается панель инструментальных кнопок, каждая из которых позволяет выполнять определенное действие над данными электронной таблицы. Опишем коротко назначение этих кнопок.
- кнопка с логотипом Office отображает информацию о компоненте, задавая номер инсталлированной версии. Имеет ссылку, позволяющую перейти на узел технической поддержки пользователей программных продуктов Microsoft.
- позволяет производить "откат" - поочередно отменяя последние выполненные действия.
- хорошо известные кнопки, позволяющие выполнять операции "Вырезать", "Копировать", "Вставить".
- кнопка автосуммирования, позволяющая выполнять одну из самых распространенных операций над данными.
- эта группа кнопок выполняет операции по сортировке и фильтрации данных, о которых я говорил чуть выше.
- кнопка, позволяющая осуществлять экспорт данных электронной таблицы SpreadSheet в Excel, создавая новую рабочую книгу Excel. Я еще буду говорить об этой возможности в следующем параграфе.
- открывает справочную систему по компоненту SpreadSheet .
- эта кнопка открывает инструментальную панель, элементы которой задают расширенные возможности управления свойствами компонента SpreadSheet . Вот как выглядит эта панель в раскрытом виде:
(рис 10.2) Инструментальная панель управления свойствами компонента SpreadSheet
Как и все элементы управления ActiveX, компонент не имеет собственных средств, позволяющих открыть или сохранить этот элемент - команды Open и Save не являются частью интерфейса таких элементов. Выполнение этих функций - прерогатива контейнеров, содержащих эти элементы. Тем не менее, у объекта есть целый набор способов, позволяющих ему общаться с внешним миром, - передавая и получая данные.
Ввод данных в электронную таблицу может осуществляться разными способами.
SpreadSheet с уже заполненным содержанием, источником которого является рабочий лист Excel. Это один из основных способов первоначального ввода данных, применяемый при работе с офисными документами.SpreadSheet . Замечу, что эти данные сохраняются только на момент сеанса и, если не предпринять специальных мер, будут утеряны при закрытии Web-страницы.SpreadSheet . Замечу, что объект SpreadSheet среди многих других свойств имеет свойство HTMLURL, которое содержит URL, указывающий источник данных для загрузки. URL должен возвращать HTML-документ, в котором есть, по крайней мере, одна таблица.<input Id = "myTextField" type = text size = 30>При просмотре этого документа в Internet Explorer я ввел в это поле текст "Привет от компонентов OWC!". В одну из ячеек электронной таблицы ввел формулу:
=Document.myTextField.ValueЗаметьте, здесь используется возможность работы в ячейках электронной таблицы с объектом "
Document ", задающим контейнер, в данном случае - Web-страницу, просматриваемую в Internet Explorer. Зная ID элементов, располагаемых на этих страницах, можно добраться до их свойств, - в данном примере до свойства Value поля ввода. Надеюсь, понятно, что значением данной формулы будет текст, введенный в поле ввода.Операции ввода-вывода данных симметричны. Почти каждому способу ввода данных соответствует свой способ вывода:
SpreadSheet . Очевидно, эта операция является обратной к операции публикации страниц рабочей книги Excel. Экспорт - это один из основных способов сохранения результатов работы с офисными документами в сети.SpreadSheet , например, в таблицу документа Word, или в заданную область рабочего листа Excel.<!-- Передача данных из таблицы компонента SpreadSheet на Web-страницу! --> <table datasrc = #BookFour_29850_WebCalc.A2:D6 border = 1> <thead> <tr> <th>Итоги продаж</th> <th>Иванов </th> <th>Петров </th> <th>Сидоров </th> </thead> <tbody> <tr> <td> <div datafld = "A"> </div> </td> <td> <div datafld = "B"> </div> </td> <td> <div datafld = "C"> </div> </td> <td> <div datafld = "D"> </div> </td> </tr> </tbody> </table>
Надеюсь, Вы понимаете, что я продолжаю работать с документом, приведенным на рис. 10.1. В данном случае в нем создается новая таблица, источником данных для которой является наш компонент . В параметре таблицы datasrc указывается ID компонента, после точки следует адрес области данных. Префикс # указывает, что источник данных находится на той же странице, что и строящаяся таблица. Вот как выглядит построенная таблица:
(рис 10.3) Таблица, построенная по данным компонента SpreadSheet
Для программиста компонент является обычным объектом, свойства и методы которого он может вызывать в своих программах, также как и проводить обработку событий, происходящих в процессе работы пользователя с компонентом. Замечу, что объектная модель компонента во многом напоминает соответствующую часть объектной модели Excel. Программирование позволяет построить собственное решение, в полной мере использующее возможности этого компонента.
Прежде чем перейти к деталям, хочу напомнить об одной особенности построения объектной модели компонент OWC - объектные модели всех компонент построены независимо, нет объекта, объединяющего их, в который все они были бы вложены. Каждый из четырех рассматриваемых нами объектов является корневым объектом в соответствующей модели.
Я приведу сейчас описание основных элементов объектной модели компонента , проводя по ходу дела сравнение с соответствующими объектами Excel. Напомню, что описание объектной модели Excel я дал в главе 11. Справочная система по объектам OWC доступна и находится в файле msowcvba.chm, путь к которому обычно следующий: C:\ProgranFiles\Microsoft Office\Office\1033.
Давайте вспомним, как устроена объектная модель Excel, На верхнем уровне здесь находится объект Application, в который среди прочего вложена коллекция рабочих книг - Workbooks, каждая из которых содержит коллекцию листов книги - Sheets. Листы книги могут быть разного типа, определяющее Worksheet. Одним из главных объектов рабочего листа, с которым чаще всего приходится работать программисту, является объект Range.
В объектной модели компонента на верхнем уровне расположен сам объект , он в определенном смысле играет роль объекта Application и во многом наследует его свойства и методы. Конечно же, никакой коллекции рабочих листов, не говоря уже о рабочих книгах, в объект не вложено, в него встроен лишь объект Worksheet, задающий единственный рабочий лист, связанный с компонентом. Этот объект во многом устроен также как и его тезка в Excel, в частности, в него встроен объект Range, позволяющий программисту работать с областями рабочего листа, связанного с компонентом .
Давайте рассмотрим свойства, общие для объектов и Excel Application. Их сводка дана в следующей таблице:
| Свойства | Назначение |
|---|---|
ActiveCell, ActiveSheet |
ActiveSheet для объекта играет значительно более важную роль, чем для объекта Application, поскольку именно оно возвращает центральный элемент этой модели - объект WorkSheet - тот единственный рабочий лист, который задает электронную таблицу. |
Cells, Columns, Rows |
Коллекции ячеек, строк и столбцов |
DisplayScrollBar |
Булево свойство, позволяющее включать или отключать скроллинг. У объекта есть два свойства, позволяющие отдельно управлять вертикальным и горизонтальным скроллингом. |
EnableEvents |
Булево свойство, позволяющее включать события объекта. |
MoveAfterReturn, MoveAfretReturnDirection |
Булево свойство, позволяющее указать, будет ли изменяться |
Range |
Свойство, возвращающее объект Range. Аргументы свойства позволяют задать требуемую область рабочего листа. |
Selection |
Свойство, возвращающее выделенный (активный) объект. Если выделена область в рабочем листе, то этот объект принадлежит классу Range. |
Version |
Свойство, возвращающее версию. |
Общих свойств не столь уже и много. Может быть, более интересно понять, каких свойств объекта Application не имеет объект , и какие дополнительные свойства он приобрел.
По понятным причинам объект устроен намного проще, чем объект Application, а посему и многих свойств объекта Application он не имеет. Вот, например, чего у него нет:
Active -свойств, возвращающих активную диаграмму, рабочую книгу, принтер или окно.AddIns и ComAddIns, возвращающих соответствующие коллекции. Объект SpreadSheet может работать только с COM объектами.AnswerWizard, Assistant, Dialogs, FileSearch, CommandBars, Charts, Workbooks, Sheets, Windows и рядом других мощных объектов Excel.Application намного богаче совокупность булевых Display - свойств, позволяющая в Excel управлять отображением на экране тех или иных элементов, например, строки статуса.Enable -свойствами. У объекта Application их значительно больше, они позволяют, например, включить или отключить звук или анимацию.Я не буду подробно останавливаться на всех возможностях объекта Application. Перейдем к рассмотрению тех свойств объекта , которых нет у объекта Application.
Рассмотрим те свойства, которые приобрел объект . Многие из них связаны с главным предназначением этого объекта - обеспечением возможности интерактивной работы с электронной таблицей на Web-страницах.
ActivePane - это свойство заменяет свойство ActiveWindow и возвращает объект Pane - активное подокно, в котором размещается электронная таблица.AllowPropertyToolbox - булево свойство, позволяющее включать или отключать панель свойств в период выполнения.ViewableRange позволяет задать объект Range, определяющий область электронной таблицы, допустимую для просмотра пользователем. Остальная область будет для него скрыта. Свойства MaxWidth, MaxHeight определяют максимальные размеры видимой части электронной таблицы по ширине и высоте. Они могут быть заданы либо в пикселях, либо в процентах от величины контейнера, содержащего электронную таблицу. Наконец, булево свойство AutoFit позволяет наилучшим способом отобразить допустимую для просмотра область. Если его значение задано, как True, то электронная таблица будет отображать допустимую для просмотра область со скроллингом или без него в зависимости от числа строк и столбцов области и значений MaxWidth и MaxHeight. Вот пример установки этих свойств в обработчике события OnLoad:<script language=vbscript> Sub Window_onLoad() 'Инициализация параметров электронной таблицы With BooKFour_1787_WebCalc .ViewableRange = "A1:G10" .MaxWidth = "90%" .MaxHeight = "90%" .AutoFit = True End With End Sub </script>Этот код я добавил в конец тега (рис 10.4) Управление отображением области, допустимой для просмотраЗаметьте, если уменьшить значение параметров
MaxWidth и MaxHeight, например, до 50%, то область отображения электронной таблицы уменьшится, и появятся полосы, позволяющие осуществлять скроллинг внутри области.BuildNumber задает номер версии компонента.CanUndo со статусом "только для чтения" возвращает значение True, если предыдущее действие может быть отменено.Constants позволяет справиться с проблемой Constants позволяет обойти ограничение VBScript и дает возможность работы с именованными константами, принадлежащим различным перечислениям. Это свойство задает набор из всех именованных констант VB. После вызова свойства достаточно указать через точку имя константы, чтобы работать с ней в VBScript также как и в VB /VBA . Вот небольшой пример кода на использование трех последних свойств:Dim myc 'Задание набора констант
Set myc = .Constants
.Range("D5:F8").Borders.Weight = myc.owcLineWeightThick
.Range("D5:F8").Borders.Color = "Green"
.TitleBar.Caption = "OWC SpreadSheet Build - " .BuildNumber
.TitleBar.Font.Color = "Green"
If .CanUndo Then .TitleBar.Font.Color = RGB(255,125,125)
Этот код я добавил в предыдущую процедуру Window_onLoad. Не буду приводить рисунка, демонстрирующего изменения внешнего вида электронной таблицы. Замечу, что все отработало должным образом. Свойство CanUndo вернуло значение True, так что цвет в заголовке окончательно был установлен с использованием функции RGB.CSVURL также устанавливает или возвращает данные, разделенные символом " запятая ", но источник данных в этом случае задается URL-адресом. Свойство HTMLData позволяет получать или возвращать данные, представленные в HTML-таблице. Свойство HTMLURL позволяет работать с данными такого же формата, но источник данных задается URL-адресом. Это может быть, например, адрес Web-страницы, на которой расположена HTML-таблица. Источником может быть и
страница документа Excel 2000, сохраненная как интерактивная Web-страница. Если одновременно заданы
несколько из этих свойств, то возникает дилемма, откуда брать данные. Свойство DataType позволяет решить данную проблему. Четыре возможных значения этого свойства совпадают с именами четырех рассмотренных только что свойств, задающих источники данных. Значение DataType однозначно определяет, каким свойством следует пользоваться для доставки данных.Display -свойства. Серия этих свойств позволяет отображать те или иные элементы электронной таблицы - заголовки столбцов и строк, сетку, вертикальную и горизонтальную полосу прокрутки, панель свойств и панель инструментов, заголовок таблицы. Вот их перечисление: DisplayColHeaders, DisplayRowHeaders, DisplayGridlines, DisplayHorizontalScrollBar, DisplayVerticalScrollBar, DisplayPropertyToolbox, DisplayToolbar, DisplayTitlebar. Конечно же, всеми этими элементами можно управлять и в объектной модели Excel, но там они не являются свойствами объекта Application.Enable -свойства. Серия этих свойств позволяет включать или отключать те или иные возможности электронной таблицы - автоматическое вычисление, возможность отката. Вот эти свойства: EnableAutoCalculate, EnableUndo.ScreenUpdating - булево свойство, позволяющее отключить перерисовку экрана при обновлении данных. Полезно пользоваться этим свойством при программном обновлении данных. До начала обновления установить это свойство, как False, затем обновить все необходимые данные, затем установить для свойства значение True, чтобы перерисовать экран, когда все данные изменились.Практически я рассмотрел все свойства объекта . Как видите, их немало, и есть новые свойства, весьма полезные при программной работе с интерактивными документами.
Методов у объекта немного - всего 9. Три из них схожи с методами объекта Excel.Application. Два из этих методов - Union и Intersect задают объединение и пересечение областей электронной таблицы, возвращая соответствующий объект Range в качестве результата. От одноименных методов объекта Application отличаются числом возможных аргументов. У методов объекта аргументов два - Range1 и Range2, которые и задают области, пересечение или объединение которых ищется. Методы объекта Application позволяют проводить эти операции одновременно над большим числом аргументов. Третий общий метод Undo также имеет некоторые различия в семантике. Для объекта он позволяет не только отменить последнее действие, сделанное, например, пользователем в процессе работы с интерфейсными объектами, но и отменить действия последнего выполняемого
программного блока, помеченного специальными метками " BeginUndo " и " EndUndo ".
Из 6 методов, специально созданных для объекта , методы:
BeginUndo, EndUndo - позволяют произвести разметку программного блока, чтобы можно было при необходимости отменить его выполнение, вызвав метод Undo.LoadText - позволяет загрузить в электронную таблицу данные из текстового файла. В отличие от свойства CSVURL, позволяющего решать схожую задачу, ограничителем данных в текстовом файле может выступать не только символ " запятая ", но и другие ограничители - пробелы, символы табуляции и другие.Refresh - позволяет провести обновление данных, перезагружая их из источника и перерисовывая объект - электронную таблицу.UpdatePropertyToolbox - позволяет обновить значения свойств, заданных панелью свойств.AddIn - добавляет Addin к объекту, позволяя работать с его свойствами и методами.Получить объект WorkSheet можно двумя способами - можно спуститься вниз по иерархии, вызвав свойство ActiveSheet корневого объекта , можно подняться вверх по иерархии, вызвав свойство Parent объекта Range.
Объект большинство своих свойств унаследовал от одноименного объекта в стандартной модели Excel. Поэтому мне остается их только перечислить, а за описанием можно обратиться к главе 11, где рассматриваются объекты Excel, в том числе и объект WorkSheet. Вот краткая характеристика подобных свойств объекта:
Cells, Columns, Rows, Range - свойства, возвращающие одноименные объекты. Заметьте, этими свойствами обладает и корневой объект SpreadSheet . Упомяну еще одно свойство - ViewableRange, общее для этих двух объектов, которое задает область, допустимую для просмотра. Пример использования этого свойства приводился.AutoFilter, AutoFilterMode, EnableAutoFilter, FilterMode, EnableAutoCalculate, Parent, UsedRange. Большинство свойств этой группы предназначено для работы с фильтрами. Чуть выше в одном из разделов этой главы я останавливался на особенностях фильтрации данных при работе с объектом SpreadSheet .Рассмотрю теперь свойства, имеющие некоторую специфику:
Protection - свойство, возвращающее объект Protection, с помощью свойств которого и устанавливается защита. Свойство Enabled объекта Protection устанавливает, включена ли защита или нет. Если она включена, то остальные булевы свойства определяют, что именно защищается. Например, свойство AllowSorting позволяет задать допустимость сортировки данных в электронной таблице, а свойства AllowDeletingRows и AllowInsertingRows - удаление и вставку строк таблицы.FreezePanes - булево свойство, имеющее статус "только для чтения", возвращает значение True, когда электронная таблица содержит "замороженные" подокна.VisibleRange - свойство, возвращающее объект Range, содержащий видимую область электронной таблицы. Заметьте, видимая область может не совпадать с областью, допустимой для просмотра, возвращаемой при вызове свойства ViewableRange.Объект имеет 5 методов: Calculate, Eval, ShowAllData, Export, Scroll, первые три из которых в этом списке унаследованы от объекта WorkSheet модели Excel.
Метод Export(FileName, ExportAction) позволяет экспортировать электронную таблицу. Второй аргумент метода указывает нужно ли открыть таблицу в Excel или сохранить ее в файле, имя которого задается первым аргументом метода.
Метод Scroll(Range) производит горизонтальную и вертикальную прокрутку так, чтобы область, заданная аргументом попала в левый верхний угол электронной таблицы.
Объект Range является основой основ в объектной модели Excel. Также обстоит дело и в модели компонента . Десятки свойств и методов различных объектов этой модели возвращают в качестве результата объект Range. Заметьте, коллекции Cells, Rows, Columns, возвращаемые одноименными свойствами, являются одновременно объектами Range. Такие свойства как Range, Selection, ViewableRange, VisibleRange, такие методы как Union, Intersection и многие другие - возвращают объект Range.
Модель этого объекта хорошо отработана еще в Excel и потому не удивительно, что объект унаследовал большую часть свойств объекта Excel.Range. Конечно, часть свойств исходного объекта была потеряна - исчезла возможность работы с формулами над массивами, возможность хранения зависимостей, работы с циклическими ссылками, но основные свойства объекта Excel.Range сохранились. Заметьте, у объекта почти не появилось новых свойств, которых не было бы у объекта Excel.Range. Достаточно сказать, что из 46 свойств объекта 45 свойств перешли по наследству от объекта Excel.Range. Появилось лишь одно новое свойство - HTMLData, о котором уже шла речь при рассмотрении объекта . Для объекта Range это свойство имеет статус "только для чтения" и позволяет вернуть HTML-таблицу, хранящуюся в ячейках области, заданной
объектом Range.
Поскольку объект Excel.Range описан мной достаточно подробно, то я не буду останавливаться на деталях описания аналогичных свойств объекта и даже не буду всех их перечислять. Скажу только, что свойства объекта позволяют работать с коллекциями ячеек, строк и столбцов области, отдельными ячейками, границами области, используемым шрифтом, формулами и значениями, хранимыми в ячейках, их форматами и многим другим.
Приведу пример программной работы с объектами Range. Заметьте, эти объекты уже появлялись в ранее приведенной процедуре - обработчике события OnLoad объекта Window. Но еще один пример не помешает. К Web-странице, показанной на рис. 10.4, я добавил командную кнопку. Вот описание соответствующего тега:
<p><input type="button" value="Работа с объектом Range" name="myButton" OnClick = WorkWithRange></p>
Далее я написал обработчик события Click для этой кнопки, в котором создаю и работаю с объектами Range нашей электронной таблицы, размещенной на этой странице. Вот VBScript код этого обработчика:
Sub WorkWithRange()
'Работа с областями электронной таблицы
Dim myc 'Задание набора констант
Dim myr, myr1, myr2, myr3, myr4, myr5, myr6 'объекты Range
Dim strFormula 'Строка, задающая формулу
With BooKFour_1787_WebCalc
Set myc = .Constants
Set myr2 = .Range("E12:G14")
myr2.Borders.Weight = myc.owcLineWeightMedium
myr2.Borders.Color = "Blue"
'Изменяю область, доступную для просмотра
.ViewableRange = "A1:G20"
'Создаю объекты Range для программной работы с ними
Set myr = .Range("A11:G20")
With myr
.Font.Size = 12
.Font.Bold = True
Set myr1 = .Cells(2,5)
myr1.Value = "Строки и столбцы"
Set myr3 = myr1.Offset(1)
myr3.Value = myr.Rows.Count
Set myr4 =myr1.Offset(1,1)
myr4.Value = myr.Columns.Count
Set myr5 = myr1.Offset(2)
strFormula = "=" myr3.Address "+" myr4.Address
myr5.Formula = strFormula
Set myr6 = myr1.Offset(2,2)
strFormula = "=" myr3.Address "*" myr4.Address
myr6.Formula = "=E13 * F13"
'Замораживание подокна
myr.FreezePanes myc.ssFreezeTop
End With
End With
End Sub
В этом примере я создаю большое число объектов Range. В процессе работы с этими объектами создаются объекты Font и Borders, как результат вызова соответствующих свойств. Здесь же появляются коллекции Cells, Columns, Rows, являющиеся, как я уже говорил, объектами Range. Я использую различные свойства и методы объектов Range, - в частности, свойства ViewableRange, Address, Value, Formula, методы Offset и FreezePanes.
Взгляните, как выглядит страница в Internet Explorer после нажатия в окне браузера командной кнопки с именем "Работа с объектом Range":
(рис 10.5) Программная работа с областями электронной таблицыЧто касается методов объекта Range, то их чуть более 20, и практически все они наследованы от объекта Excel.Range. Из специфических методов можно упомянуть лишь два:
LoadText - позволяет загружать данные из текстового файла в заданную область. Об этом методе я уже говорил при описании объекта SpreadSheet .FreezePanes - "замораживает" подокно. Вот небольшой пример. В предыдущей процедуре можно видеть следующие строчки:'Замораживание подокна myr.FreezePanes myc.ssFreezeTop
В результате действия этого оператора произошло расщепление окна, и окружающее сверху подокно было заморожено, так что, например, прокрутка не оказывает действие на это подокно - оно всегда видимо. Заметьте, на рисунке 10.5 видна черта, отделяющая подокна.
Я уже говорил о том, что можно делать с помощью методов объекта Range. Напомню, - можно выполнять фильтрацию, сортировку и поиск данных в пределах области. Можно осуществлять чистку содержимого и формата, удалять и вставлять столбцы и строки и ряд других подобных операций.
На этом я закончу рассмотрение объектной модели компонента . Я специально достаточно подробно рассмотрел эту модель, чтобы показать, что объекты OWC построены также как и все остальные объекты Office 2000, и работа с этими объектами ведется аналогичным образом. Для других компонентов OWC я не буду уже столь подробно разбирать объектную модель, а ограничусь кратким обзором и примерами.
Говоря о замечательных свойствах приложения Excel, на первое место я поставил его машину вычислений. Второе место по справедливости занимает способность Excel представлять данные в наглядной графической форме. Казалось бы, что представление данных, хранящихся в таблицах, столь же информативно, как и их отображение в виде графиков и гистограмм. Более того, понятно, что информация, хранимая в больших таблицах Excel или в различных хранилищах данных, значительно более полна в сравнении с той, которая может быть отображена в тех или иных графиках и гистограммах. Однако для человека графическая форма представления информации является более приемлемой, позволяя ему значительно быстрее воспринять информацию, обработать ее, осознать тенденции процессов, показанных на графиках, что, в конечном итоге, позволяет быстро принять необходимые решения. Компонент Chart реализует практически в полном объеме все возможности Excel по визуализации данных - представлению их в графической форме.
Также как, во многом, мощь машины вычислений Excel определяется разнообразием функций, составляющих ее библиотеку, так мощь визуализации определяется разнообразием возможных типов диаграмм. Элемент Chart сохранил это многообразие, отказавшись, правда, от объемных, трехмерных изображений, - такие диаграммы будут представляться в обычном двухмерном изображении. На мой взгляд, это небольшая потеря. Зато появилась новая возможность - рисовать графики в
Конечно же, объект Chart обладает свойствами, позволяющими при отображении диаграмм показывать не только саму диаграмму, но и все ее основные элементы оси категорий и значений, заголовок и легенду. Сохранена также такая важная возможность, как показ линии тренда с прогнозом будущих и предыдущих значений, не представленных данными диаграммы. Можно также показывать на диаграмме интервалы, задающие возможную погрешность данных. Следует отметить, что не сохранена возможность показа текущих справок при подведении курсора к той или иной области диаграммы. Однако при желании, эту возможность можно ввести в собственном решении, используя программную настройку и те возможности, которые предоставляет объектная модель компонента Chart.
На следующем рисунке показана уже знакомая диаграмма с данными об объемах продаж, просматриваемая в Internet Explorer. На диаграмме показана линия тренда с прогнозом продаж, которые можно ожидать от одного из продавцов в следующем периоде. Для данных другого продавца показаны пределы возможной погрешности.
(рис 10.6) Диаграмма с линией тренда и интервалом погрешностей
Элемент Chart не имеет собственного интерфейса. Поэтому если поместить этот элемент в единственном числе на Web-странице или в каком-либо другом допустимом контейнере, то у пользователя не будет никаких возможностей взаимодействия с этим элементом. По существу, в этом случае все сведется лишь к статическому просмотру диаграммы. В этом тоже есть некоторый смысл, поскольку диаграмма при перерисовке будет отображать последние изменения источника данных. Возможны два пути решения проблемы создания интерактивной диаграммы:
Chart, но и два других компонента - SpreadSheet и Data Source. Первый из них задает источник данных для построения диаграммы, второй - служит мостиком для передачи данных от компонента SpreadSheet к компоненту Chart. Достоинством такого подхода является то, что пользователь получает возможность изменять данные в таблице компонента SpreadSheet и тут же увидеть, как эти изменения отражаются на диаграмме. Пользователь может также использовать интерфейс компонента SpreadSheet , но он по-прежнему не сможет изменить, например, тип отображаемой диаграммы. В собственном решении можно сочетать достоинства обоих подходов.Что может служить источником данных для построения диаграммы компонента Chart? Это, наверное, один из основных вопросов, на который следует ответить. Компонент Chart можно связать со следующими источниками данных:
SpreadSheet , PivotTable, Data Source ;RecordSet ;IDataSource, документированный, например, в OLE DB SDK.Понятно, что связывание данных с диаграммой не простой процесс, поскольку необходимо задавать разнообразную информацию - названия осей диаграммы, имена, задающие серии данных, наконец, массивы значений для каждой из серий, и многое другое. Обычно, для этой цели используется, как это делается в Excel, специальный мастер - Chart Wizard. Но, поскольку, в конечном счете, все сводится к работе с соответствующими объектами, составляющими объектную модель компонента, то связывание можно осуществить в собственном решении программным путем.
Начну с некоторого обзора, позволяющего дать общее представление об объектной модели этого компонента. Прежде всего, замечу, что корневым объектом в этой модели является не объект Chart, а объект - ChartSpace, задающий пространство диаграммы, в котором можно разместить несколько объектов Chart. Содержательно это означает, что компонент ChartSpace играет роль листа книги, который может одновременно отображать несколько диаграмм. Для программиста важно то, что объект ChartSpace имеет свойство Charts, возвращающее коллекцию объектов Chart и для добавления элементов в эту коллекцию используется стандартный для коллекций метод Add.
Особую роль среди методов объекта ChartSpace играет метод ExportPicture, позволяющий экспортировать пространство диаграммы со всем ее содержимым в графический файл в формате GIF. Такой прием применяется при размещении компонент OWC на серверной стороне, о чем я еще скажу особо. Из свойств объекта Chart упомяну свойство Type, позволяющее задать тип диаграммы. Говоря о методах этого объекта, назову метод SetData, который используется для того, чтобы установить связь с разнообразными источниками данных и направить их в те или иные области диаграммы. Одноименный метод объекта Series, входящего в коллекцию серий данных - SeriesCollection объекта Chart, - позволяет загружать данные отдельной серии. Из событий объекта Chart нельзя не назвать событие DataSetChange. Это событие зажигается, когда связанный источник данных изменяет свои данные. При возникновении события компонент Chart автоматически перестраивается, чтобы соответствовать обновленным данным. Но, если обновление связано с изменением структуры диагра
ммы, например, появлением новой серии, то для подобных обновлений следует написать собственный обработчик события.
В заключение обзора хочу представить схему, отражающую устройство основных объектов модели - ChartSpace, WCChart, WCSeries:
(рис 10.7) Схема устройства основных объектов моделиЗаметьте, свойства объекта ChartSpace - ChartDataSources и Charts - возвращают соответственно коллекцию WCDataSources и WCCharts. Первая из них с элементами WCDataSource задает источники данных, которых может быть несколько, вторая - с элементами WCCharts - определяет объекты, задающие диаграммы, расположенные в общем пространстве, заданном объектом ChartSpace.
Объект WCChart, который и определяет саму диаграмму, устроен достаточно сложно, поскольку сложным является устройство самой диаграммы. Свойства этого объекта позволяют получить объекты, задающие основные элементы диаграммы:
SeriesCollection - возвращает коллекцию объектов WCSeriesCollection, задающих данные, используемые для построения диаграммы. Заметьте, имя класса отличается от имени свойства приставкой WC, указывающей на классы Web-компонент.Axes - возвращает коллекцию WCAxes - объектов, задающих оси диаграммы.Title - возвращает объект WCTitle, задающий заголовок диаграммы.Legend - возвращает объект WCLegend, задающий описание (легенду) диаграммы.PlotArea - возвращает объект WCPlotArea, представляющий область отводимую для построения диаграммы. Свойство имеет статус "только для чтения". Не для всех объектов Chart возвращается соответствующий объект. Его не имеют диаграммы типа "pie", "Третьим объектом, устройство которого показано на рисунке 10.6, является объект WCSeries, задающий одну группу (серию) данных, используемых для построения диаграммы. Как можно видеть, соответствующие свойства возвращают объекты, позволяющие программно работать не только с самими данными, но и строить тренды и доверительные интервалы для данной серии данных.
Я не буду дальше погружаться в описание деталей построения объектов, а ограничусь примером программного построения диаграммы на Web-странице. Я продолжил работу с HTML-документом, показанным на рис. 10.5. Я использовал этот документ для демонстрации некоторых возможностей работы с компонентом и написал, как Вы помните обработчик события, связанного с нажатием соответствующей командной кнопки, расположенной на документе. Теперь я добавлю к документу еще одну командную кнопку, по нажатию которой будет строиться диаграмма, источником данных для которой будет компонент , уже расположенный на этом документе. Чтобы пример был интереснее, я добавлю к документу еще один управляющий элемент - выпадающий список, элементы которого будут задавать тип диаграммы. Тем самым пользователь будет иметь возможность не только построить саму диаграмму, но и перед построением задать ее тип.
Все эти действия я выполнил в приложении FrontPage. Не буду останавливаться на деталях выполнения этого этапа работы. Приведу лишь описание тега <object>, в котором я определил компонент Chart:
<object id = "myChartSpace" classid = "CLSID:0002E500-0000-0000-C000-000000000046" width="5" height ="5">
Чтобы не
(рис 10.8) Начальное состояние Web-страницыА вот как выглядит эта страница, после того, как из списка выбран тип "диаграмма" и нажата командная кнопка "Создать диаграмму":
(рис 10.9) Web-страница с программно построенной диаграммойА теперь давайте разберемся в программном коде, решающем эту задачу. Вот текст обработчика события, вызываемого при нажатии командной кнопки:
Sub CreateChart()
'Создание диаграммы
Dim myc 'Константы
Dim cht 'Объект, задающий диаграмму
Dim Ax 'Объект, задающий ось диаграммы
Dim Ser 'Объект, задающий серию данных
Dim strDebug 'Строка, используемая при отладке
With myChartSpace
'strDebug="step 1 "
'MsgBox(strDebug)
Set myc = .Constants
'размеры области диаграммы
.width = "100%"
.height = "300"
'Источник данных
If .ChartDataSources.Count = 0 Then
.DataSource = BooKFour_1787_WebCalc
Else
.DataSource.Refresh
End If
'Добавляем Объект Chart в коллекцию
Set cht = .Charts(0)
'strDebug="step 2 "
'MsgBox(strDebug .Charts.Count)
'Устанавливаем его параметры
With cht
'По умолчанию - тип диаграмма
.Type = myc.chChartTypeColumnClustered
strDebug = "ColumnClustered"
If SelType.Value = "График" Then
.Type = myc.chChartTypeLineMarkers
strDebug = "LineMarkers"
End If
'MsgBox("Тип диаграммы - " strDebug)
'Легенда и заголовок диаграмы
.HasLegend = True
.HasTitle = True
.Title.Caption = "Дилеры и Объемы продаж"
'Заголовки осей
Set Ax = .Axes(myc.chAxisPositionLeft)
Ax.HasTitle = True
Ax.Title.Font.Italic = True
Ax.Title.Font.Bold = True
Ax.Title.Caption = "Объем Продаж"
Set Ax = .Axes(myc.chAxisPositionBottom)
Ax.HasTitle = True
Ax.Title.Font.size = 14
Ax.Title.Font.Bold = True
Ax.Title.Caption = "Кварталы -2001"
'Установка данных
.SetData myc.chDimCategories, 0, "C5:C8"
.SetData myc.chDimSeriesNames, 0, "D4:F4"
.SeriesCollection(0).SetData myc.chDimValues, 0, "D5:D8"
.SeriesCollection(1).SetData myc.chDimValues, 0, "E5:E8"
.SeriesCollection(2).SetData myc.chDimValues, 0, "F5:F8"
'Работа с серией данных. Определение тренда
Set Ser = .SeriesCollection(1)
Ser.TrendLines.Add
Ser.TrendLines(0).Type = myc.chTrendLineTypeExponential
Ser.TrendLines(0).Order = 2
Ser.TrendLines(0).IsDisplayingEquation = True
End With
End With
End Sub
Хотя процедура снабжена комментариями, но целесообразно дать дополнительные пояснения:
cht, Ax, Ser и другие. Хотя VBScript и бестиповый язык, но объявлять переменные все равно целесообразно - это правильный стиль программирования.ChartSpace. Заметьте, имя MyChartSpace, которым я пользуюсь, - это ID объекта, заданное при определении соответствующего тега object, приведенного выше. Я использую свойства width и height, чтобы задать подходящую область пространства диаграмм. При первоначальном определении объекта в теге его размеры задавались минимальными, теперь область расширяется до подходящих размеров.SpreadSheet , расположенный на этой же Web-странице. Заметьте, я выполняю проверку того, не установлена ли уже связь с этим источником. Дело в том, что командная кнопка может нажиматься многократно и, следовательно, процедура может работать многократно, а попытка связи с уже присоединенным источником приводит к ошибке. Так что, когда связь уже установлена, то вызывается только метод Refresh для обновления данных источника.cht класса WCChart я не использую метод Add для добавления нового элемента в коллекцию, поскольку один элемент этой коллекции создается автоматически. Конечно, если бы я хотел одновременно показать несколько диаграмм, без использования этого метода не обойтись.cht, - задаются параметры, определяющие его элементы.SelType - задается его ID, определенным при размещении элемента на Web-странице. Конечно, я без труда мог бы дать пользователю больший набор возможных типов, что лишь слегка бы увеличило размер нашей процедуры.Title, Legend, Axes, Axis и другими.SeriesCollection. Поскольку источником данных является электронная таблица - объект SpreadSheet , то мне достаточно указать диапазон ячеек, где находятся данные серии.Полагаю, что данный пример позволил продемонстрировать способы программной работы с компонентом Chart. В заключение взгляните, как выглядит этот же интерактивный документ, когда пользователь выберет из списка значение "график" и нажмет кнопку построения диаграммы:
(рис 10.10) Программное построение диаграммы другого типа
В предыдущей главе, посвященной анализу офисной деятельности, подробно рассматривались сводные таблицы - один из самых мощных инструментов, позволяющий эффективно анализировать большие объемы данных, хранящихся в различных источниках. Сводные таблицы позволяют анализировать информацию под разными углами зрения, получать различные срезы, сортировать, фильтровать, группировать данные нужным образом. Сводные диаграммы, тесно связанные со сводными таблицами, позволяют тут же отобразить в графической форме полученную информацию.
Конечно же, иметь подобный инструмент при работе с документами в интрасетях чрезвычайно важно. И такой инструмент был создан - среди компонентов OWC имеется компонент PivotTable, позволяющий создать интерактивный Web-документ, содержащий сводную таблицу, с которой можно практически работать также, как в обычном Excel.
Самый простой способ создать интерактивную Web-страницу, содержащую сводную таблицу, - использовать для этой цели Excel. Здесь давно существовала возможность создать сводную таблицу по данным реляционной базы данных, например, Microsoft Access или Microsoft SQL Server. В Excel 2000 в процессе создания сводной таблицы можно параллельно создать и OLAP - куб, который и будет служить источником данных для этой таблицы. После того, как сводная таблица в Excel получена, ее можно сохранить в виде интерактивной Web-страницы, на которой будет помещен компонент PivotTable. При публикации можно присоединить и сводную диаграмму. Замечу, что фактически на Web-странице Excel разместит два компонента - PivotTable и Data Source. Источником данных для компонента Data Source может служить, например, OLAP-куб, а уж затем данные будут переданы компоненту PivotTable. Взгляните, как выглядит подобная Web-страница со сводной таблицей, открытая в Internet Explorer:
Sґ
(рис 10.11) Интерактивная Web-страница со сводной таблицей
Одним из главных вопросов, требующих решения при работе со сводными таблицами, является организация связи с источником данных. Как я уже говорил, при создании в Excel такого инструмента анализа данных, как сводная таблица, с самого начала предполагалось, что основным источником данных для них будут внешние источники - базы данных. Естественно, что возможность использования в качестве источника данных таблиц самого Excel подразумевалась сама собой, и была гарантирована в первую очередь. Три основных типа внешних источников данных могут быть использованы сводными таблицами Excel:
Компонент сохранил все эти возможные источники данных. Более того, еще одним источником данных может быть DataSource - четвертый компонент, входящий в состав OWC. Для связи с базами данных используется интерфейс OLE DB - стандарт, разработанный Microsoft. Для связи с OLAP источниками данных Microsoft разработала модификацию этого стандарта - OLE DB for OLAP, которая позволяет взаимодействовать с многомерными хранилищами данных аналогично тому, как это взаимодействие происходит при работе с табличными базами данных. Этот стандарт поддерживается как базами данных от Microsoft, так и многими другими многомерными хранилищами данных.
Взаимодействие компонента с источником данных начинается с того, что указанный при соединении провайдер источника данных определяет механизм этого взаимодействия. Для OLE DB for OLAP провайдера используется интерфейс TCP/IP. После того как соединение установлено, в список полей компонента - , который будет более подробно рассматриваться ниже - передается структура OLAP-куба, его поля, измерения, а также иерархии, связанные с измерениями. Когда пользователь начинает в интерактивном режиме оперировать со сводной таблицей или когда это делается программным путем, компонент генерирует соответствующий MDX-запрос (
В качестве источника данных для компонента можно указать адрес в Internet - URL, который возвращает XML-поток данных. Конечно, данные этого потока должны удовлетворять определенным требованиям. Microsoft разработала стандарт, которому должен удовлетворять XML-поток данных, и провайдера - OLE DB persistence provider, который способен принимать данные в этом формате. В главе, посвященной ADO, упоминался среди прочих и этот провайдер данных.
Давайте поговорим теперь о том, что может делать пользователь, работая с компонентом в интерактивном режиме. Вот основные действия, доступные пользователю:
Pivot Table содержит набор командных кнопок, запускающих выполнение определенных команд.Инструментальная панель расположена в верхней части компонента и содержит 19 командных кнопок, часть из которых уже знакома нам по интерфейсу компонента , часть - по работе с инструментальной панелью сводной таблицы в Excel. Вот краткое описание этих кнопок:
- кнопка с логотипом Office отображает информацию о компоненте, задавая номер инсталлированной версии. Имеет ссылку, позволяющую перейти на узел технической поддержки пользователей программных продуктов Microsoft.
- позволяет скопировать выделенную часть сводной таблицы в буфер, а затем содержимое буфера перенести в то или иное приложение. Таким образом, можно осуществлять передачу данных от компонента Pivot Table в приложения, допускающие работу с буфером. Заметьте, что в отличие от компонента SpreadSheet , здесь нет кнопки Paste, так что обратная передача данных не допускается. Очевидно, что наличие этой возможности противоречило бы самой сути сводных таблиц, поскольку проводимый анализ не связан с изменением данных в процессе анализа. Данные можно изменять только в самом источнике.
- знакомые нам кнопки позволяют проводить сортировку выделенных данных сводной таблицы в порядке возрастания или убывания. Последняя из этой группы кнопок включает или выключает фильтр, заданный полями фильтра сводной таблицы.
- кнопка автосуммирования позволяет произвести вычисление итогов для выбранного поля, применяя одну из возможных функций. Серый цвет кнопки означает, что тип поля не позволяет подводить итоги или провайдер не обеспечивает выполнения такой функции. Замечу, что OLAP-провайдер не допускает автосуммирования, поскольку подобные вычисления проводятся на стороне сервера, а не на клиентской машине. Таким образом, при работе с кубами OLAP эта кнопка всегда будет оставаться серой.
- позволяет включать или выключать промежуточные итоги для выбранного поля. Эта кнопка работает и для OLAP-провайдера.
- эта группа кнопок позволяет перемещать поля между измерениями, перенося поле соответственно на ось строк, столбцов, фильтра или в область данных.
- эта пара кнопок также позволяетперемещать поля, но внутри одного измерения, меняя их порядок следования.
- включает или выключает иерархию, допустимую для данного измерения.
- обновляет список полей сводной таблицы, с учетом всех изменений, которые могли произойти в источнике данных.
- создает новую рабочую книгу Excel и копирует туда сводную таблицу с сохранением ее интерактивности. Это позволяет сохранить в Excel структуру сводной таблицы, выбранную пользователем. Замечу, что данные не передаются в Excel, а поступают туда из источника данных. Возможность экспорта сводной таблицы в Excel, конечно же, увеличивает мощь компонента Pivot Table .
- открывает инструментальную панель свойств, набор кнопок которой зависит от контекста, - какой из элементов сводной таблицы является выделенным.
- открывает окно, содержащее список полей, доступных для конструирования сводной таблицы в интерактивном режиме.
- открывает справочную систему по компоненту Pivot Table .Панель свойств задает дополнительный набор команд, которые можно выполнять над тем или иным элементом. Вот какой вид имеет эта панель при выборе поля строки:
(рис 10.12) Панель свойств элемента "поле строки"Как видно на рисунке, свойства на этой панели сгруппированы по разделам. Для всех элементов сводной таблицы присутствует раздел "Общее", где отображается выбранный элемент сводной таблицы и есть кнопка, позволяющая перейти в справочную систему. Для всех элементов сводной таблицы доступен также раздел "Формат" с различными возможностями, зависящими от типа элементов. Форматирование позволяет менять используемый шрифт, цвета, размеры поля. Для числовых полей и полей дат разрешается применять различные форматы записи. Раздел "Отображение" позволяет изменять внешний вид сводной таблицы, включая или отключая те или иные элементы, например, индикаторы развертывания или главную инструментальную панель. Я не буду в деталях описывать все возможные команды, доступные на этой панели.
Окно со списком полей играет важную роль в работе пользователя, предоставляя ему широкие возможности по конструированию сводной таблицы. Список полей создается, как я уже говорил, в тот момент, когда устанавливается связь с источником данных сводной таблицы. Он отображает все поля, доступные для формирования сводной таблицы. Например, для OLAP-куба это все его измерения и все иерархии. Пользователь может включать в сводную таблицу лишь часть из этих полей. Но в любой момент, открыв этот список, он может перестроить таблицу, добавив туда нужные ему поля. При удалении из сводной таблицы поле по-прежнему остается в списке полей.
В предыдущей главе, учитывая важность этого вопроса, я много внимания уделил сводным таблицам в Excel. В частности, там подробно анализировалась объектная модель этого компонента, рассматривались вопросы программного создания сводных таблиц. Переходя к обзору объектной модели компонента PivotTable, замечу сразу, что его объектная модель имеет существенные отличия от своего аналога в Excel, по крайней мере, эти отличия сказываются на верхнем уровне модели.
Напомню, в Excel два класса объектов и их коллекции определяют работу со сводными таблицами. Объекты PivotCache и коллекция PivotCaches отвечают за связь с источником данных и хранение в оперативной памяти данных, необходимых для сводной таблицы. Именно эти объекты имеют такие свойства, как SourceType, SourceData, Connection, CommandText, которые обеспечивают связь с источником данных. Объект PivotTable в этой модели отвечает за структуру сводной таблицы, работу с ней.
В объектной модели компонента PivotTable объект Pivot Cache и его коллекция исчезли, - их функции перешли к самому объекту PivotTable. Теперь у него есть свойства: DataSource, ConnectionString, CommandText, ProviderType, XMLData, DataMember, позволяющие связаться с различными источниками данных. Ту роль, которую играл объект PivotTable в модели Excel, теперь играет новый объект PivotView, встроенный в объект PivotTable. Этот объект возвращается при вызове свойства ActiveView, и он отвечает за конфигурацию сводной таблицы.
В объектной модели PivotView также много новых объектов, если не по сути, то по названию. Конфигурация сводной таблицы задается в первую очередь ее измерениями - в данной объектной модели они называются осями и представляются объектами Axis. Соответствующие свойства объекта PivotView возвращают объекты:
RowAxis, ColumnAxis возвращают объект PivotGroupAxis - определяющий измерения (оси) по строкам и столбцам сводной таблицы.DataAxis - возвращает объект PivotDataAxis, задающий ось данных.FilterAxis - возвращает объект PivotFilterAxis, задающий ось фильтров.Все Axis-объекты и сам объект PivotView имеют свойство FieldSets, возвращающее соответствующую коллекцию PivotFieldSets, которая задает множество полей, расположенных на той или иной оси. Методы и свойства объекта PivotField, задающего отдельное поле позволяют выполнять операции над этим полем - сортировку, фильтрацию.
Я ограничусь этим кратким обзором, и не буду углубляться в детали объектной модели. В следующей главе будет дан пример построения интерактивного Web-документа, содержащего сводную таблицу. Там мы на практике познакомимся со многими упомянутыми здесь объектами.
Компонент Data Source (, оставаясь невидимым, выполняет большую работу по связыванию с различными внешними источниками данных, построению и выполнению команд по их доставке. В свою очередь он служит, как правило, источником данных для других компонент OWC - . Этот компонент несет основную нагрузку по доставке данных и при работе со страницами доступа данных в Access (Access 2000 Data Access Pages).
Так как реализует стандартный интерфейс источников данных - IDataSource Interface, - определенный и поддерживаемый Internet Explorer (начиная с версии 5) и Visual Basic (начиная с версии 6), то эти контейнеры воспринимают его как правильный источник данных. Это означает, что при размещении компонента
Замечу, что не только , но и другие компоненты OWC могут служить источниками данных и удовлетворяют интерфейсу IDataSource. Так, компонент может поставлять данные компонентам Chart и , а последний, в свою очередь, может поставлять данные для компонента Chart.
Источники данных имеют достаточно сложную структуру и состоят из наборов данных, называемых элементами (членами) источника - . Каждый такой элемент задает некоторый набор данных - Recordset, который может использоваться при связывании источника данных с тем или иным элементом, расположенным на Web-странице. Для компонента в качестве элемента источника - - может использоваться любой диапазон его ячеек. Для компонента RecordsetDefs.
В детали объектной модели этого компонента я углубляться не буду. Вместо этого я приведу пример, в котором на Web-странице строится круговая диаграмма по данным внешнего источника - базы данных Access. Посредником в связывании данных будет выступать компонент Data Source. На этом примере я постараюсь прояснить и роль , и роль RecordsetDefs.
Прежде чем перейти к примеру, хочу отметить следующее. Надеюсь, понятно, что поскольку элемент является невидимым, то никакого интерфейса у него нет, так что общение с ним возможно только на программном уровне. Поэтому в данном разделе я приведу достаточно большой кусок программного кода. Следует заметить также, что элемент действительно невидим в момент выполнения, например при просмотре Web-страницы в Internet Explorer. Однако в режиме проектирования, например, при открытии страницы в приложении FrontPage, местоположение элемента отмечается небольшим значком с изображением ключа -
.
В наших примерах неоднократно появлялась база данных "Офис РР". В главе 18 она использовалась при построении OLAP-куба и сводной таблицы. Теперь я воспользуюсь ею и построенным OLAP-кубом, чтобы создать Web-страницу, на которой будет строиться круговая диаграмма, отражающая вклад каждого из сотрудников в общее дело добывания заказов. На страницу будут помещены два компонента OWC - Chart и Data Source. Компонент будет посредником в передаче данных от базы данных к диаграмме.
Наша страница не будет интерактивной, так как сам элемент Chart, как вы помните, не имеет собственной инструментальной панели. И я не буду выносить сами данные на страницу, передавая их, например, в элемент . Не буду я и программно добавлять интерфейс элементу Chart. Тем не менее, этот пример кажется мне достаточно интересным, так как позволяет продемонстрировать, как самому создать страницу с расположенными на ней элементами OWC. А главное, он показывает роль как посредника при передаче данных. Вот полный HTML-текст Web-страницы, созданной в редакторе FrontPage:
<html>
<head>
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>MDB-база данных -> Data Source -> Chart</title>
<link rel="STYLESHEET" href="file:///Styles.css" type="text/css">
</head>
<body>
<h1>Связывание: MDB-база данных -> Data Source -> Chart </h1>
<!-- Chart Control -->
<object classid="clsid:0002E500-0000-0000-C000-000000000046" id="ChartSpace1"
style="HEIGHT:80%; WIDTH:100%" width="576" height="384">
</object>
<p> </p>
<!-- Data Source Control -->
<object classid="clsid:0002E530-0000-0000-C000-000000000046" id="DSC" width="16"
height="15">
<param name="XMLData" value="<xml xmlns="urn:schemas-microsoft-com:office:access">
<DataSourceControl>
<OWCVersion <9.0.0.2710> </OWCVersion>
<MaxRecords> 0 </MaxRecords>
<GridX> 10 </GridX>
<GridY> 10 </GridY>
<Datamodel version="0816"> </Datamodel>
</DataSourceControl>
</xml>">
</object>
<!-- Script for loading the chart -->
<script language=VBScript>
'--------------------------------------------------------------------------
Sub Window_onLoad()
' Код выполняется при загрузке страницы в браузер.
' Устанавливается соединение компонента DSC с базой данных Access.
' Формируется RecordsetDef как источник данных для построения диаграммы.
' Установка строки соединения элемента DSC
Dim sDBPath 'Путь к базе данных
sDBPath = "c:\!o2000\DsCd\Ch19\dbPP2000.mdb"
DSC.ConnectionString = _
"provider=microsoft.jet.oledb.4.0;data source=" sDBPath
' Добавляется RecordsetDef с именем ChartData,
' который будет источником данных для компонента Chart
' Формируется запрос к базе данных Access
Dim myQ 'Запрос к базе данных
myQ = "SELECT Заказы.Сотрудник, Sum(Заказы.Стоимость) AS [Sum-Стоимость]" _
"FROM Заказы " _
"WHERE (((Заказы.ДатаЗаказа)>=#9/1/1997# And" _
"(Заказы.ДатаЗаказа)<=#11/9/2001#))" _
"GROUP BY Заказы.Сотрудник"
'Определение Recordset, который будет элементом,
'определяющим данные - Data Member для компонента Chart
DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"
'Вызов процедуры, осуществляющей связывание DSC с компонентом Chart.
BindChartToDSC ChartSpace1, DSC, "ChartData", "Сотрудник", "SUM-Стоимость"
End Sub 'Window_onLoad()
'--------------------------------------------------------------------------
Sub BindChartToDSC(cspace, dsc, sRSName, sCategories, sValues)
' Связывает Chart с набором данных - Recordset компонента Data Source.
' Создает круговую диаграмму - Pie chart.
' Параметры процедуры:
' cspace ссылка на ChartSpace object
' dsc ссылка на Data Source control
' sRSName имя набора Recordset в Data Source
' sCategories имя столбца в наборе, содержащего имена сотрудников
' sValues имя столбца в наборе, содержащего суммарную стоимость заказов
Dim cht ' Chart object который будет создан в пространстве диаграммы
Dim ser ' серия данных
Dim dls 'метки круговой диаграммы
' Определение объекта Constants, позволяющего использовать
' именованные константы в script-коде.
set c = cspace.Constants
' Чистим Chart space
cspace.Clear
' Устанавливаем DSC как источник данных для Chart
set cspace.DataSource = dsc
' Устанавливаем набор данных внутри Data Source, используемый Chart.
cspace.DataMember = sRSName
' Создаем круговую диаграмму Pie chart в пространстве диаграмм.
set cht = cspace.Charts.Add()
cht.HasLegend = True
cht.HasTitle = True
cht.Title.Caption = "Распределение заказов в стоимостном исчислении"
cht.Title.Font.Bold = True
cht.Type = c.chChartTypePie
' Определяем единственную серию в диаграмме - объект ser
' и вызываем ее метод SetData для связывания с данными серии.
' Значение 0 второго параметра указывает, что используется первый набор
' данных источника Data Source.
set ser = cht.SeriesCollection.Add()
ser.SetData c.chDimCategories, 0, sCategories 'Ось категорий
ser.SetData c.chDimValues, 0, sValues 'Ось значений
' задаем метки круговой диаграммы - Pie chart.
set dls = ser.DataLabelsCollection.Add()
dls.HasPercentage = True
dls.HasValue = False
End Sub 'BindChartToDSC()
</script>
</body>
</html>
А вот как выглядит эта страница, открытая в Internet Explorer:
(рис 10.13) Web-страница с компонентами Data Source и ChartГлавное в этом коде - сценарий, написанный мной на VBScript. Почти половину программного текста составляют комментарии, поясняющие все этапы работы. Тем не менее, я добавлю еще несколько общих замечаний:
Chart и Data Source - и, естественно, script кода.Window_onLoad. В ней и выполняется нужная нам работа по связыванию базы данных и компонентов.DSC связывается с базой данных и получает от нее данные. На втором шаге - вызывается процедура BindChartToDsc, строящая диаграмму, источником данных для которой уже служит сам DSC .Говоря о работе , можно отметить:
ConnectionString - устанавливается связь с базой данных.DSC.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source=" sDBPathСоответствующая строка, как обычно, состоит из двух частей и задает провайдера базы данных и путь к самой базе. В данном случае используется провайдер Jet для связи с базой данных Access.
RecordsetDefs, определяющий набор данных - Data Member источника данных.DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"Этот набор получает имя
ChartData. Команда, определяющая действия по доставке данных, в данном случае задается текстом SQL-запроса к базе данных. Сам текст запроса записан в строку, заданную переменной myQ. В процессе выполнения запроса данные группируются, происходит суммирование стоимости всех заказов, выполненных тем или иным сотрудником.BindChartToDsc, строящая диаграмму, которой передается информация о DSC и его наборе данных - ChartData. Замечу еще, что для тех, кто привык работать с ADO, нет ничего нового в синтаксисе и семантике работы с DSC .Несколько слов о работе процедуры BindChartToDsc. Отмечу главное:
set cspace.DataSource = dsc cspace.DataMember = sRSName
так устанавливается связь объекта cspace, - основного объекта, задающего пространство диаграммы, - с источником данных и набором данных внутри этого источника. Остальные операторы внутри процедуры выполняют рутинную работу по формированию различных областей диаграммы.
Надеюсь, этот пример позволяет ощутить возможности компонента и его роль в получении данных от различных источников с последующей их передачей другим компонентам OWC.
Одно из достоинств компонентов OWC заключается в том, что они могут работать на стороне сервера. Причины, по которым целесообразно перенести их работу на сервер, могут быть самыми разными. Вот три основные:
Обычно Com-объекты работают либо как видимые объекты, либо как невидимые объекты (in memory). Компоненты OWC спроектированы так, что для них возможны оба способа работы. На стороне сервера они работают, конечно же, как невидимые объекты, поскольку там нет клиента, который мог бы с ними работать в интерактивном режиме. Они создаются программно, с использованием метода CreateObject, вызываемого объектом Server. Вот как может выглядеть код, создающий на стороне сервера компонент Chart, или, более точно, основной его объект cspase:
Set m_cspace = Server.CreateObject("OWC.Chart")
После того как объект получен, остальная часть работы с этим объектом на сервере ведется так же, как и на стороне клиента. Завершающим аккордом на стороне сервера является преобразование построенной диаграммы или сводной таблицы в графический образ, который и пересылается клиенту. Для этой цели используется метод ExportPicture, которым обладают компоненты OWC.
Подводя итоги, отмечу, что включенные в состав Office 2000 компоненты OWC выполняют важную работу, позволяя проводить полноценный анализ данных, возможный ранее только в Excel, как при работе в интрасетях, так и при построении собственных решений на базе различных контейнеров, допускающих работу с COM-объектами.
Как и всегда при работе в мощной среде Office 2000, многие задачи, требующие использования этих компонентов, могут решаться "руками" - по существу, несколькими нажатиями кнопки мыши. Однако, возможно, самое главное достоинство этой среды, в том числе и компонентов OWC, заключается в том, что можно произвести тонкую настройку решения, учитывающую специфику задачи. Когда стандартных решений становится недостаточно, за дело берется программист, который, работая с имеющимися в его распоряжении объектами среды, может создать собственное решение, существенно расширяющее стандартные возможности среды.
Объектная модель компонент OWC весьма разнообразна и предоставляет программисту широкие возможности. Программная работа по созданию решений, использующих компоненты OWC, по существу, является важной частью офисного программирования.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.