![]() |
Модераторы: MetalFan |
![]() ![]() ![]() |
|
Albinos_x |
|
||||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
У многих людей приходящих сюда часто возникают вопросы по работе с этой компанентой, да и вообще с сервером Word. В принципе основы можно посмотреть в DRKB и FAQ, но даже не смотря на это у людей всё равно много вопросов. Поэтому я решил, поподробней рассмотреть этот компанент и поделиться полученным опытом. Итак начнём....
Немного теории: Работа с компанентой WordApplication, производится как с любым объектом делфи. Кидаем его на форму... В инспекторе объектов ма наблюдаем свойства: ConnectKind - определяет как осуществляется соединение с сервером и может принимать следующие значения: - ckNewInstance - всегда создавать новый экземпляр сервера - ckRunningOrNew - присоединиться к выполняемому серверу или создать новый экземпляр - ckRunningInstance - Только присоединиться к выполняющемуся серверу - ckRemote - Присоединиться к удалённому серверу Сочетается со свойством RemoteMachineName - ckAttachToInterface - не присоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo AutoConnect - определяет, должен ли запускаться сервер при запуске приложения AutoQuit - обеспечивает автоматическое закрытие Word-а при завершении приложения RemoteMachineName - Удалённый компьютер, накотором выполняется сервер и к которому необходимо присоединиться Среди множества свойств стоит обратить внимание на свойство ActiveDocument - активный документ. Это объект Document. Также к документу можно обращаться через свойство Documents, представляющий из себя массив открытых на данный момент документов (Document). Соответственно у этого свойства есть свойство Count показывающая общее количество открытых документов. Своиство только для чтения и используется для проверки, есть ли хоть один открытый документ. Создание нового документа осуществляется методом Add:
Param1 - указывает шаблон, который оспользуется при создании документа, если параметр по умолчанию (EmptyParam), то используется Обычный(Normal) Param2 - определяет, открывается документ как шаблон или как обычный документ, и имеет булевый тип. При значении (по умолчанию) False открывается как обычный документ . Param3 - тип документа, и может принимать следующие значения: wdNewBlankDocument - новый пустой документ, wdNewEMailMessage - Новое электронное сообщение, wdNewFrameset - новый фрейм, wdNewWebPage - Новая Веб страница. По умолчанию (EmptyParam) используется wdNewBlankDocument. Param4 - определяет открывается ли документ в видимом окне или нет. По умолчанию равен True - в видимом. Сделать видимым или невидимым документ, можно в любом месте программы с помощью свойства WordApplication - Visible:
Причём, четыре параметра имеются в Word от версии 2000, версии ниже имеют только первых два параметра, т.е. для Word97 нам надо писать:
для того, чтоб сделать приложение работающее под любую версию Word-а, необходимо учитывать такие отличия, и соответственно в программе проверять версию установленного Word-а. Это можно сделать с помощью свойства Version и будет выглядить приблизительно так:
чучуть поясню... свойство Version имеет строковый тип, и к примеру для Word97 вернёт "8.0", 2000 - "9.0", 2002 - "10.0"... Также важным свойством WordApplication является свойство Selection - указывающий на позицию курсора или выделенный фрагмент текста в активном документе. Для вставки текста имеются методы InsertAfter и InsertBefore. Первый вставляет текст после объекта Selection, второй - перед ним.
символ #13 переведёт курсор на новую строку и означает конец абзаца. Стоит отметить, что данные функции имеют ограничение на размер передаваемой строки, которая не должна превышать 255 символов. Выделенный текст мы можем отформатировать. Для этого у Selection есть ряд свойств. К примеру Font и ParagraphFormat. В Delphi, для удобства работы предусмотрены на той же вкладке (Servers) компаненты WordParagraphFormat и WordFont1. Для подключения этих объектов к соотвествующему объекту будем использовать метод ConnectTo:
Примеры работы с этими объектами размещу ниже... Для вставки текста имеется ещё один очень интересный метод TypeText. Но его работа немного отличается от ранее описанного. И зависит от свейства ReplaceSelection, принадлежащее свойству Options. Если RepleceSelection:= true, то выделение заменяется на указанный текст, если false, то новый текст вставляется перед выделением:
в результате выполнения кода выделенный текст заменится на слово "ОТЧЁТ". для вставки из буффера обмена у Selection есть метод Paste, который так же зависит от ReplaceSelection. Хочу отметить ещё одно важный метод Selection - Collapse - данный метод свертывает выделение, передаваемый в него аргумент определяет позицию курсора после свёртывания. Аргумент может принимать значения wdCollapseEnd и wdCollapseStart, помещение курсора в конец или в начало выделения соответственно. По умолчанию (EmptyParam) равен wdCollapseStart. Как и в сервере Excel здесь мы можем встретить объекты Range - соответствует какому-то непрерывному участку текста.
после выполнения этого кода объект Rang будет соответствовать первым 15 символам текста. По свойствам данные объекты схожи со свойствами Selection. Нашёл в одной книжке описание ещё одного свойства сервера Word - это Dialogs. Сам его ещё не опробовал, но всё же опишу. Итак, Dialogs - массив (собрание) объектов Dialog, которые соответствуют встроенным диалогам Word. Доступ к ним осуществляется так:
константа wordDialog может принимать следующие ванианты: wdDialogEditFind - найти фрагмент текста wdDialogEditPasteSpecial - Специальная вставка из буфера обмена wdDialogEditReplace - Заменить фрагмент текста wdDialogFileFind - Найти файл wdDialogFileNew - Новый файл wdDialogFileOpen - открыть файл wdDialogFilePageSetup - Параметры страницы wdDialogFilePrint - Печать файла wdDialogFilePrintSetup - Установить принтер wdDialogFileSaveAs - Сохранить файл как wdDialogFileSummaryInfo - Свойства документа (Статистика) wdDialogFormatFont - Шрифт wdDialogFormatParagraph - Абзац wdDialogInsertDatabase - Вставить БД wdDialogInsertFile - Вставить файл wdDialogInsertPageNumbers - Вставить номера страниц у Dialog есть метод Show, открывающий пользователю диалог. В метод передается не обязательный аргумент TimeOut - время в миллисекундах, после которого диалог автоматически закроется, если передать значение по умолчанию (EmptyParam), то диалог будет закрываться только пользователем. Причём перед показом диалога желательно, чтоб сервер был видимым(если ещё невидимый), иначе он станет видимым автоматически, но появится без главного меню и инструментальных панелёй. Что не есть хорошо. Кроме того метод Show возвращает целое число, определяющее какой кнопкой закрыт диалог. Но здесь есть подводный камень, можно сказать один из недостатков этого метода, - Возращаемые числа для разных диалогов не одинаковы. К примеру если один возвращает: -2 : Кнопка закрыть -1 : Кнопка Ок 0 : Кнопка Отмена или Esc >0 : Командные кнопки , то диалог открытия файла: 0 : Кнопки закрыть, отмена, Esc -1 : Кнопка Открыть -------------------- Продолжение следует.... СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 22.2.2006, 21:51 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||||
|
|||||||||||||||||||
Albinos_x |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Перейдём к практике
На основе коротких кодов покажу работу с компанентой на практике. Примеры буду приводить к Word2000 и выше: Соединиться с Сервером Word Тут можно использовать два способа: 1.
2.
с данной компанентой оба работают на ура. Открыть документ
Установка параметров страницы (листа)
Установка Абзац - интервал
Форматирование текста в документе
Вставить текст после таблицы Этот участок кода размещаю, т.к. если мы вставим таблицу, то курсор будет находиться в ней. И обычные попытки вставить текст приведут к тому, что он будет вставляться в первую ячейку таблицы. Здесь тоже существует множество вариантов, приведу один из них. Остальные буду размещать отдельно с припиской, что можно использовать для этого же.
где Con : OleVariant; - количество строк в таблице +1; Добавляем новый параграф
Этот же код можно применять для вставки текса после таблицы. Работа с Колонтитулом
Колонтитулы бывают верхний/нижний, а также если вставляется новый раздел на новой странице, то можно установить верхний N раздел/нижний N раздел, дополнительная опция - "как в предыдущем разделе". Её можно отключать. Как вставить новую станицу смотрите ниже. Нарисовать квадрат
где 788.00 и 3.3 координаты верхнего левого угла; 600.00 и 42.00 ширина и высота соответственно координаты и остальные параметры не в миллиметрах. Метод для использования сантиметровых параметров приведу ниже. Форматирование нарисованного квадрата
Вставить файл
Написать текст по вертикали текст по вертикали можно сделать только в таблице, ну и т.п. (по крайней мере у меня ворд по другому не поддерживает...) итак, делаем таблицу, вставляем текст, прежде чем снять выделение - пишем:
или
Вставить новую страницу
Вставить рисунок
2,3,4 - параметры отвечают за координаты и размер рисунка Вставка и Форматирование созданной таблицы
по аналогии и со строчками Выделить всю строку в документе
Скопировать выделенное и вставить Скопировать
вставить
можно ставить EmptyParam Переместиться в конец текста
Этот же код можно применять для вставки текса после таблицы. Выделить строку в таблице
можно для выделения в таблице пользоваться командой
но, она будет выделять по ячейке, следовательно надо будет её применять столько раз сколько у вас столбцов, что не есть хорошо. Параметры выставлять в сантиметрах
команда выставит левое поле 1,5 см Межстрочный интервал Устанавливается:
Узнать межстрочный интервал:
Рисование линии в документе Линию можно нарисовать:
где первые два параметра X,Y - начала линии, вторые два пораметра X,Y - конца линии, последний так и ставьте, обозначает тип линии (пунктир и т.д.) пример нарисует линию поперёк,
этот вертикальную
этот горизонтальную
и этот тоже, но будет шире. Также можно устанавливать длину линии. делается это так:
следующая команда определит смещение по оси Y конца линии:
напоминаю, что отсчёт идет от верхнего левого угла Установить толщину линии можно командой:
Перейти на нужную страницу
сразу попадаем на страницу '2'... ещё вариант перехода между страницами
Количество абзацев в выделенном фрагменте
Количество строк в выделенном фрагменте
Повторять первую строку таблицы на каждой странице как заголовок
Стиль границ таблицы В Word 2003 создаваемые таблицы по умолчанию имеют прозрачные границы ячеек. Следовательно если нам нужна не прозрачная, необходимо установить нужный нам стиль. Итак устанавливаем стиль границ таблицы:
Автонумерация строк
можно сразу устанавливать отступ слева для данной функции:
Доступ к таблице в Ворде Присоединиться к таблице в ворде (если мы не создавали её, но знаем, что она есть):
теперь спокойно работаем с таблицей через переменную tbl Считать из ячейки таблицы текст:
S:String или WideString. По аналогии происходит и занесение текста. Количество таблиц в документе и количество сток и слобцов Количество таблиц в документе:
Количество строк и столбцов в таблице:
Ещё вариант по работе с таблицей Мы можем столкнуться с небольшой проблемой, допутим мы хотим записать таблицу в большое количество строк и соответственно работать такое будет долго, как же можно ускорить этот процесс? Во первых заметное в данном случае ускорение мы получим если:
мы поставим в конце кода, а не в начале. Во-вторых ускорение будет если за разовое обращение мы будем заносить максимально возможное количество текста:
но с таблицей на первый взгляд такой вариант не подойдёт, но это только на первый взгляд, т.к. занёсённый текст межно преобразовать в таблицу, к примеру:
при больших таблицах разница должна быть ощутимая... Работа с Абзацем (Параграфом)
т.е. количество параграфов будет:
Получить доступ к тексту параграфа:
стоит также отметить, что у : WordApplication1.ActiveDocument.Paragraphs. есть полезные методы First, Last - первый и последний абзац соответственно:
теперь немного пояснений: в строке имеются непечатные символы обозначающие конец абзаца , поэтому когда документ пуст в нем как минимум есть один пустой абзац... 2 (#13#7) символа в таблице, 1 - в обычном тексте (#13), рисунок если вставлен в контейнер "создайте рисунок" идёт как 2 символа (#1#21) и опять же конец абзаца #13, т.е. в абзац можно разместить несколько рисунков или рисунок и текст, тогда полученная строка будет равна : "#1#21ТЕКСТ#13" таблица представляется в виде нескольких абзацев... приблизительно так: таблица 2х3 |__абзац__|__абзац__|__абзац__|абзац |__абзац__|__абзац__|__абзац__|абзац т.е. последовательность символов #13#7 обозначают конец ячейки, 2 подряд последовательности обозначают конец строки приблизительно, т.к. в одно ячейке может быть несколько абзацев.... сам ворд если не ошибаюсь абзацы не содержащие текст за обзац не принимает, поэтому если посмотреть статистику, цифры будут отличаться от полученных командой WordApplication1.ActiveDocument.Paragraphs.Count; колонтитулы за обзац не принимаются. Рисунок не вставленный в контейнер "создайте рисунок" как абзац не идет... Печать документа
Сохранить как с помощь встроенного в Word диалога Всё таки я Вас немного обманул... С диалогами я тоже попробовал поработать. Просто это было давно и я забыл. Но вот вдруг код нашёл:
Отключить проверку синтаксиса и грамматики
Поиск и замена в документе Можно пользоваться поиском и заменой имеющимися в Ворде, можно воспользоваться и имеющимися стандартными диалогами, описанными выше, рассмотрим первый вариант:
соответственно если курсор находится после заменяемого текста, то его желательно переместить в начало... т.е. допустим у Вас в документе:
и Вам необходимо сделать несколько замен последовательно, то это должно выглядить так:
Продолжение следует.... СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 26.3.2006, 00:16 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
YurikGL |
|
||||||||||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: 2 Всего: 2 |
Добавлю немного....
Есть два замечательных способа добывать информацию об интерфейсе Word. 1) Для того чтобы узнать, как что-то сделать из Delphi в Word-e надо в Word-е зайти в меню Сервис/Макрос/Начать запись... Потом сделать в Word-e то, что надо сделать из Delphi и закончить запись макроса. И наконец Сервис/Макрос/Макросы...выбираем записанный...Изменить и смотрим, как он устроен. После этого первод синтаксиса VBA в синтаксис Delphi осуществляется просто и непринужденно. 2) Еще одним хорошим инструментом получения знаний являются компоненты типа TWordApplication. Кидаем его на форму, в любом операторе набираем WordApplication1., нажимаем ctrl+пробел и внимательно читаем. Смысл доступных функций и свойств обычно понятен интуитивно. Есть, еще один, как мне сказали, наиболее логичный способ – справка VBA, но что-то не довелось мне ею пользоваться… .... У документа есть свои коллекции: 1) буквы (characters)
Теперь можно получить доступ к
2)таблицы
вот так
можно выбрать вторую колонку последней таблицы. 3) абзацы
4) фигуры
ну и т.д. Еще есть полезные объекты selection – выбранная область и range – диапазон (selection, кстати, типа range со всеми вытекающими полезностями), а так-же функция select – выбрать. Выбрать можно таблицу, колонку (как пример
букву, диапазон, абзац и т.д… Кстати, очень часто приходится работать с объектом range. Так, например, чтобы вытащить текст из документа, можно написать
У объекта range есть свойства Start - номер начального символа и End_ - номер конечного символа. Эти свойства используются для определения границ различных объектов. Существует два основных способа формирования документа: 1) Без использования шаблона. Создается новый документ, где создаются колонтитулы надписи и т.д. Этот путь использовать не стоит т.к. на разных компьютерах могут изначально стоять разные настройки страницы, шрифтов, абзацев и красиво сформированный документ у Вас на компьютере может ужасно выглядеть на другом. Можно, конечно, программно выставлять все необходимые настройки, но, во-первых, всего не учтешь, во-вторых это – большие тормоза и много кода. 2)С использованием шаблона. Суть состоит в том, что заранее создается вордовский документ, который используется как шаблон. В нем в нужных местах стоят объекты типа "надпись" с заранее известными именами, закладки и прочие элементы, которые будут точками отсчета для вставляемого текста. Очень удобным, при создании шаблона, является использование закладок. В качестве примера - выберем текст между концом первой и концом второй закладок.
Замечу, что W1.ActiveDocument.Bookmarks.Item(vr1) является объектом range и свойство End_ является номером конечного символа закладки. И еще небольшой совет: Если вы подсоединились к Word-у, - вовремя отсоединитесь. Т.е. крайне не желательно оставлять подсоединенный word с которым в это время манипулирует пользователь. Подключились, сделали свое дело, и отключились... Это сообщение отредактировал(а) YurikGL - 20.2.2006, 20:42 --------------------
|
||||||||||||||||||
|
|||||||||||||||||||
Albinos_x |
|
||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Корректно закрыть программу работающую с документом
Проблема в том, что если пользователь закроет созданный Вами документ. А Вы хотите сохранить документ (типа автосохранение перед закрытием программы), то программа будет выдавать кучу ошибок, виснуть и т.д. Простая проверка на то, запущен ли ворд или нет здесь не прокатит, т.к. пользователь в это время может ещё работать с одним документом. Вот и я однажды столкнулся с данной проблемой. Мурыжили мы этот вопрос несколько дней на форуме. И вот конечный результат к которому я пришёл:
Можно ещё сделать запрос на сохранение документа. PS: Прошу сразу прощения, что примеры не сгруппированы... Добавлено @ 20:48 Также стоит отметить, что все массивы и таблицы имеют отчисление в Word-е не от 0, а от 1... Материал, является обобщением не одного дня моих мучений и экспериментов, все приведённые примеры испытаны и проверены, касательно данного компанента. Примеры, так же Вы можете найти здесь. (Простите модераторы за ссылку на свой форум, просто тема изначально была рождена там. Оставляю за Вами право её удалить) Если работать через :
то некоторые варианты для него не проходят, к примеру: Перейти на нужную страницу
в данном случае это нужно делать через второй способ:
Продолжение следует.... ------------------------------------------------------------ YurikGL, Некоторые вопросы повторил, но всё равно СПАСИБО!!! ![]() СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 20.2.2006, 21:47 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||
|
|||||||||
Albinos_x |
|
||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Теперь простенький полноценный пример
К примеру прочитаем из таблицы в вордовском документе и занесём в StringGrid... кидаем на форму StringGrid, Edit, Label над Edit-ом, OpenDialog, WordApplication, SpeedButton. В инспекторе объектов OpenDialog виставляем фильтр *.doc В Label - пишем: наберите номера столбцов через запятую, из которых хотите прочитать данные В Edit очищяем свойство Text В свойство Caption SpeedButton-а пишем : Прочитать подготовительные операции выполнены. Теперь нужно чтобы пользователь ничего лишнего в Edit, кроме цифр и запятых не мог занести. Пишем обработчик нажатия на клавишу:
Не стал наворачивать этот код т.к. это всего лишь пример, поэтому ограничемся простым вариантом. Для кого интересно как полноценно сделать ограничение ввода, загляните в Общие вопросы, там обсуждался этот вопрос и не один раз. теперь пишем обработчик нажатия на кнопку:
как видите, всё просто. Думаю Вопросов не возникнет, тем более, что почти каждая строчка закомментирована. Прикрепляю архив с примером test.zip [268 Kb] Удачи!!! СУВ. Albinos_x Это сообщение отредактировал(а) Girder - 20.2.2006, 22:04 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||
|
|||||
Albinos_x |
|
||||||||||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Точно также как и с WordApplication, решил я разобраться с компанентой ExcelApplication... Ну что ж приступим:
Немного теории Работа с этой компанентой похожа на работу с компанентой WordApplication (см. ссылку вверху), хотя есть некоторые отличия. Компанент имеет те же самые свойства: ConnectKind - определяет как осуществляется соединение с сервером и может принимать следующие щначения: - ckNewInstance - всегда создавать новый экземпляр сервера - ckRunningOrNew - присоединиться к выполняемому серверу или создать новый экземпляр - ckRunningInstance - Только присоединиться к выполняющемуся серверу - ckRemote - Присоединиться к удалённому серверу Сочетается со свойством RemoteMachineName - ckAttachToInterface - не присоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo AutoConnect - определяет, должен ли запускаться сервер при запуске приложения AutoQuit - обеспечивает автоматическое закрытие Excel при завершении приложения RemoteMachineName - Удалённый компьютер, накотором выполняется сервер и к которому необходимо присоединиться Для добавления книги существует метод Add
В первый параметр этого метода можно передать строку, содержащую имя файла книги. lcid - идентификатор локализации, в основном равен 0, но целесообразней передавать значения предназначенных для этого констант: LOCALE_USER_DEFAULT и LOCALE_SYSTEM_DEFAULT - идентификаторы текущего пользователя и системы соответственно. Это же касается и свойства Visible, который тоже требует этот идентификатор:
Книга создаётся с числом листов установленных по умолчанию, но эту переменную мы можем поменять, для этого есть свойство SheetsInNewWorkbook :
Добавить новый лист в существующую книгу можно методом Add объекта Workbook:
Before,after - объекты листа после которого и перед которым осуществляется вставка, обычно достаточно задать один параметр. count - определяет количество вставляемых листов type_ - тип вставки, при EmptyParam пустой, новый лист Удаляет лист метод Delete
для доступа к нескольким открытым книгам есть Workbooks, представляющая из себя массив открытых книг(Workbook). Следовательно мы можем активировать или обратиться к нужной нам книге
Для определения количества открытых книг, у Workbooks существует свойство только для чтения Count Для доступа к активной книге есть ActiveWorkbook. Для сохранения книги существует несколько методов - это Save и SaveAs:
метод же SaveAs, имеет гораздо больше возможностей. для 2000 procedure SaveAs(FileName:OleVariant; FileFormat:OleVariant; Password:OleVariant ;WriteResPassword:OleVariant; ReadOnlyRecomended:OleVariant; CreateBackUp:OleVariant; AccesMode:XLSaveAsAccessMode; ConflictResolution:OleVariant; AddtoMru:OleVariant;TextCodePage:OleVariant;TextVisualLayout:OleVariant;lcid:Integer) для ХР procedure SaveAs(FileName:OleVariant; FileFormat:OleVariant; Password:OleVariant ;WriteResPassword:OleVariant; ReadOnlyRecomended:OleVariant; CreateBackUp:OleVariant; AccesMode:XLSaveAsAccessMode; ConflictResolution:OleVariant; AddtoMru:OleVariant;TextCodePage:OleVariant;TextVisualLayout:OleVariant;Local:OleVariant;lcid:Integer) FileName - Имя файла в котором сохраняется книга, если имя и путь не указан, то книга сохранятся в текущем каталоге. (String) FileFormat - формат файла (Integer) Password - Пароль для открытия файла (String) WriteResPassword - Пароль для изменения файла (String) ReadOnlyRecomended - рекомендовать доступ только для чтения. (Boolean) CreateBackUp - всегда создать резервный копию (Boolean) ConflictResolution - способ разрешения конфликтов между пользователями AddtoMRU - Boolean - добавить файл в список недавно использованых (Boolean) AccesMode - режим доступа к файлу и может принимать значения: - xlNoChange - не изменять ранее установленный режим - xlExclusive - исключительный доступ пользователя к файлу. При этом если файл был в это время открыт другим пользователем, то ему будет предложено сохраниться под другим именем. - xlShared - свободный доступ Для закрытия книг(и) метод Close: Всех:
для закрытия конкретной книги:
первый параметр определяет сохранять ли изменения, если True - значит сохранять, во втором параметре указывается имя файла в который необходимо сохранять изменения, если SaveChanges:=True и второй не указан, то появится диалог сохранения файла. Если вместо SaveChanges поставить EmptyParam, то пользователя спросят, нужно ли сохранить изменения. Хотя я слышал, что бывает, что срабатывает SaveChanges:=EmptyParam и SaveChanges:=false одинаково, и оба спрашивают, нужно ли сохранять изменения. Третий параметр используется, когда книга предназначена для пересылки какому-то адресату. Контроль версий можно производить так же как и с Вордом:
Работа с ячейками происходит через объект Range. При чём этому объекту можно насначить не только одну ячейку но и несколько. Что очень удобно когда нужно занести множество значений и не в одну ячейку. К тому же это произойдёт быстрее, т.к. соответственно обращений к серверу будет всего одно вместо несколький. Так же и через этот объект можно форматировать содержащийся в ячейках текст с помощью свойства Font. Как и Word мы здесь можем встретить Dialogs через который мы можем вызвать встроенный диалог в Excel:
перезаваемые значения могут быть: xlDialogPageSetup - Параметры страницы xlDialogPrint - Печать текущей страницы xlDialogFont - выбор шрифта для всей страницы xlDialogSaveAs - Сохранить файл как и т.д.... Вообще, пытался выяснить весь список диалогов, но после того как выяснилось, что их около 234, то я от этой идеи отказался. Печать осуществляется с помощью метода PrintOut procedure PrintOut(From:OleVariant;To_ :OleVariant; Copies:OleVariant;Preview:OleVariant;ActivePrinter:OleVariant;PrintToFileOleVariant;Collate:OleVariant;PrToFileName:OleVariant;lcid:Integer) From - номер страницы с которой нужно начинать печать To_ - номер последней печатаемой страницы, если стоит EmptyParam, то последняя Copies - определяет количество копий Preview - указывает, должно ли открываться окно предпросмотра(false и EmptyParam - не должно) ActivePrinter - можно указать имя принтера, по умолчанию текущий PrintToFileOleVariant - указывает, должно ли печататься в файл (false и EmptyParam - не должно) PrToFileName - указывает имя файла при PrintToFileOleVariant:=true, если при этом условии параметр равен EmptyParam, то пользователя спрашивается имя файла (в Excel97 этот параметр отсутствует) Collate - указывает, нужно ли разбирать по копиям (false и EmptyParam - не должно) lcid - обычно задается равным LOCALE_USER_DEFAULT
Продолжение следует... СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 24.5.2006, 21:11 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
Albinos_x |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Перейдём к практике
К моему расстройству, по сравнению с WordApplication, полноценно работать через ExcelApplication нельзя, тут нужно применять и ExcelWorksheet и ExcelWorkbook. На основе коротких кодов покажу работу с компанентой на практике. Примеры буду приводить к Excel2000 и выше: Открыть Excel и присоединиться к нему
Открыть для редактирования документ Excel Существует множество способов: 1.
2.
3. С помощью функции описанной Akella, 4.
Форматируем ячейки и текст в них
Объединить ячейки
Занести текст в ячейку
Выставить ширину столбца и высоту строки Выставляем ширину столбцов:
ширина выставится для первых пяти столбцов Выставляем высоту строчек:
первые 5 строчек будут шириной 24 Копировать лист копировать лист в туже книгу:
в новую книгу:
Вставить картинку
здесь: 10 - отступ слева 40 - отступ сверху 30 - ширина 50 - высота Количество строк и столбцов Тут тоже существует несколько вариантов: 1.
2.
Со строками по аналогии Работа с сеткой таблицы
Отобразится толстая нижняя граница ячеек . PS: если мы ограничимся только первой и второй строчкой, то все границы отобразятся толстой линией Выставить Ориентацию листа
данный вариант установит ориентацию - Альбомная Задать имя листа
Имя листа будет не как по умолчанию, допустим - Лист1, а Отчёт Установить формат ячейки
точно также можно и прочитать формат ячейки Работа с коллекцией в Excel Добавить элемент коллекции просто, принцип такой же как в ворде. покажу несколько примеров: нарисовать линию:
первые два параметра X,Y начала линии вторые два - конца. нарисовать прямоугольник:
второй и третий параметры - X,Y левого верхнего угла прямоугольника, следом два - правого нижнего. первый параметр тип элемента коллекции: 1 - прямоугольник 2 - парралелограм 3 - трапеция 4 - ромб 5 - скруглённый прямоугольник 6 - восьмиугольник и т.д.... можно посмотреть порядок открыв Excel - автофигуры - основные фигуры все эти функции возращают элемент типа Shape, т.е. можно сделать так:
тоже можно проделать и с OleVariant:
Принцип же работы с элементами коллекции, также такой же как ворде (ещё немного похож на работу с таблицами в ворде).... т.е. сначало узнаём общее количество элементов коллекции на листе:
далее если они имеются, т.е. col<>0 выполняем нужные операции:
линия возращает name = Line через пробел идёт номер по порядку создания элементов коллекции, т.е. если первый прямоугольник, то у него будет имя = Rectangle 1, имя линии идущей следом будет = Line 2. Это если имена по умолчанию, т.к. имя можно и задать:
если хотим параметры выставлять в сантименрах, то это делается по аналогии с вордом:
Продолжение следует... СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 1.6.2006, 00:41 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Albinos_x |
|
||||||||||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Работа с группами ячеек и организация адресации по столбцам
Наверно всем известно, что "координатная сетка" Excel состоит из букв (столбцы) и цифр(строки):
Итак, как я в теории писал, можно обращаться к группе ячеек:
Но что если, нам надо обращаться к столбцам по номерам и предыдущий вариант нам в силу некоторых обстаятельствм не подходит. Возникает вопрос... а как же нам организовать адресацию по буквам... в принципе понятно :
где num - номер столбца от 0.... но... есть одно НО... это будет работать пока Num не будет больше 25, т.е. в сумме получится 'Z'... это значит, что это работает при первых 26 столбцах... можно конечно сделать простейший обработчик ещё на 26 столбцов:
но... опять это НО... это работает, но только на первых 52... хорошо, если мы знаем, что больше у нас и не будет... а если мы знаем, что может получиться и больше столбцов?... как же нам сделать, чтобы адресация была как в екселе, т.е. сначала 'A', потом 'AA', потом 'BA' и т.д.... выявим последовательность... первый набор букв будет равен
второй
третий
и т.д. но если мы будем получать буквы в данной последовательности, то мы получим строку наоборот... но это уже не проблема.... Итак, функция:
или так:
Num как входной параметр является номером столбца от 0. помните что в ширину Excel позволяет разместить только 255 столбцов Продолжение следует.... СУВ. Albinos_x Добавлено @ 17:26 покажу пример как считать из Excel и занести в таблицу: следующий код считывает из ячейки А1 и записывает в ячейку [1,1] Table: TStringGrid:
теперь если надо записывать в БД :
если количество сток не известно, то :
последний код прочитает и занесёт в БД из первого столбца Excel Удачи!!! СУВ. Albinos_x Это сообщение отредактировал(а) Albinos_x - 5.3.2006, 05:59 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
Foley |
|
|||
![]() Фсемба Яцца ![]() Профиль Группа: Участник Сообщений: 235 Регистрация: 31.1.2006 Где: Россия, Арх.обл Репутация: нет Всего: 7 |
Статья очень полезная и интересная, но вот что у меня получилось (посмотрите код):
и выдает ошибку про variant, точно не помню (тут у меня нету проекта), дело в том что при объявлении v: OleVariant, и использовании его вместо ExcelApplication все работало нормально, но были проблемы с сохранением, щас вроде все нормально, но может такая ошибка быть из-за того что у меня офис 2003, а в дельфе используется ХР? если да, то где можно взять компоненты для 2003? |
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
нет... Просто когда работаешь с через OleVariant, то тут есть некоторые отличия от работы через ExcelApplication, я отмечал это по работе с WordApplication (4 сообщение в этом топике), то же и для ExcelApplication Поэтому скорее ошибка где-то была в коде.... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
Foley |
|
|||
![]() Фсемба Яцца ![]() Профиль Группа: Участник Сообщений: 235 Регистрация: 31.1.2006 Где: Россия, Арх.обл Репутация: нет Всего: 7 |
Тада не могешь подсказать как сохранить книгу через ОлеВариант? как я только не пробовал, не работают: Save, SaveAs, SaveToFile, SaveToDocument, Save... и все время Method ... Not Supported Automatically Object.
|
|||
|
||||
Albinos_x |
|
||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
я понял в чём у тебя была ошибка... ты сохранял скорее всего через:
Поэтому у тебя и вылезает эта ошибка... метод Save и SaveAs существует для WorkBook... т.е тебе нужно было:
тоже и с методом SaveAs
Но с этим методом не всё ладно... не хочет он принимать путь содержащий русские буквы.... пока ещё экспериментирую... попробую всё таки от него этого добиться.... Это сообщение отредактировал(а) Albinos_x - 23.2.2006, 00:03 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||
|
|||||||
Foley |
|
|||
![]() Фсемба Яцца ![]() Профиль Группа: Участник Сообщений: 235 Регистрация: 31.1.2006 Где: Россия, Арх.обл Репутация: нет Всего: 7 |
Точно, именно так, и че я сам не догадался? Спасибо большое за статью и за помощь!!!!
|
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
Рад был помочь!
Заглядывайте ещё... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
отредактировал пост по практике с вордом, добавил еще :
Ещё вариант по работе с таблицей Поиск и замена в документе -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |