| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > WordApplication, ExcelApplication |
| Автор: Albinos_x 20.2.2006, 19:16 | ||||||||||||||||||
| У многих людей приходящих сюда часто возникают вопросы по работе с этой компанентой, да и вообще с сервером 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 20.2.2006, 20:17 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Перейдём к практике На основе коротких кодов покажу работу с компанентой на практике. Примеры буду приводить к 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 |
| Автор: YurikGL 20.2.2006, 20:34 | ||||||||||||||||||
| Добавлю немного.... Есть два замечательных способа добывать информацию об интерфейсе 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 с которым в это время манипулирует пользователь. Подключились, сделали свое дело, и отключились... |
| Автор: Albinos_x 20.2.2006, 20:38 | ||||||||
| Корректно закрыть программу работающую с документом Проблема в том, что если пользователь закроет созданный Вами документ. А Вы хотите сохранить документ (типа автосохранение перед закрытием программы), то программа будет выдавать кучу ошибок, виснуть и т.д. Простая проверка на то, запущен ли ворд или нет здесь не прокатит, т.к. пользователь в это время может ещё работать с одним документом. Вот и я однажды столкнулся с данной проблемой. Мурыжили мы этот вопрос несколько дней на форуме. И вот конечный результат к которому я пришёл:
Можно ещё сделать запрос на сохранение документа. PS: Прошу сразу прощения, что примеры не сгруппированы... Добавлено @ 20:48 Также стоит отметить, что все массивы и таблицы имеют отчисление в Word-е не от 0, а от 1... Материал, является обобщением не одного дня моих мучений и экспериментов, все приведённые примеры испытаны и проверены, касательно данного компанента. Примеры, так же Вы можете найти http://www.zoforum.zeroes-and-ones.com.ru/index.php?showtopic=174&st=0. (Простите модераторы за ссылку на свой форум, просто тема изначально была рождена там. Оставляю за Вами право её удалить) Если работать через :
то некоторые варианты для него не проходят, к примеру: Перейти на нужную страницу
в данном случае это нужно делать через второй способ:
Продолжение следует.... ------------------------------------------------------------ YurikGL, Некоторые вопросы повторил, но всё равно СПАСИБО!!! СУВ. Albinos_x |
| Автор: Albinos_x 20.2.2006, 20:59 | ||||
| Теперь простенький полноценный пример К примеру прочитаем из таблицы в вордовском документе и занесём в StringGrid... кидаем на форму StringGrid, Edit, Label над Edit-ом, OpenDialog, WordApplication, SpeedButton. В инспекторе объектов OpenDialog виставляем фильтр *.doc В Label - пишем: наберите номера столбцов через запятую, из которых хотите прочитать данные В Edit очищяем свойство Text В свойство Caption SpeedButton-а пишем : Прочитать подготовительные операции выполнены. Теперь нужно чтобы пользователь ничего лишнего в Edit, кроме цифр и запятых не мог занести. Пишем обработчик нажатия на клавишу:
Не стал наворачивать этот код т.к. это всего лишь пример, поэтому ограничемся простым вариантом. Для кого интересно как полноценно сделать ограничение ввода, загляните в Общие вопросы, там обсуждался этот вопрос и не один раз. теперь пишем обработчик нажатия на кнопку:
как видите, всё просто. Думаю Вопросов не возникнет, тем более, что почти каждая строчка закомментирована. Прикрепляю архив с примером http://www.albinos.nightmail.ru/test.zip Удачи!!! СУВ. Albinos_x |
| Автор: Albinos_x 21.2.2006, 16:22 | ||||||||||||||||||||||||
| Точно также как и с http://forum.vingrad.ru/index.php?showtopic=84634, решил я разобраться с компанентой 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 21.2.2006, 17:11 | ||||||||||||||||||||||||
| Работа с группами ячеек и организация адресации по столбцам Наверно всем известно, что "координатная сетка" 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 |
| Автор: Foley 22.2.2006, 13:50 | ||
Статья очень полезная и интересная, но вот что у меня получилось (посмотрите код):
и выдает ошибку про variant, точно не помню (тут у меня нету проекта), дело в том что при объявлении v: OleVariant, и использовании его вместо ExcelApplication все работало нормально, но были проблемы с сохранением, щас вроде все нормально, но может такая ошибка быть из-за того что у меня офис 2003, а в дельфе используется ХР? если да, то где можно взять компоненты для 2003? |
| Автор: Albinos_x 22.2.2006, 14:08 | ||||
нет... Просто когда работаешь с через OleVariant, то тут есть некоторые отличия от работы через ExcelApplication, я отмечал это по работе с WordApplication (4 сообщение в этом топике), то же и для ExcelApplication
Поэтому скорее ошибка где-то была в коде.... |
| Автор: Foley 22.2.2006, 22:32 |
| Тада не могешь подсказать как сохранить книгу через ОлеВариант? как я только не пробовал, не работают: Save, SaveAs, SaveToFile, SaveToDocument, Save... и все время Method ... Not Supported Automatically Object. |
| Автор: Albinos_x 22.2.2006, 23:57 | ||||||||
я понял в чём у тебя была ошибка... ты сохранял скорее всего через:
Поэтому у тебя и вылезает эта ошибка... метод Save и SaveAs существует для WorkBook... т.е тебе нужно было:
тоже и с методом SaveAs
Но с этим методом не всё ладно... не хочет он принимать путь содержащий русские буквы.... пока ещё экспериментирую... попробую всё таки от него этого добиться.... |
| Автор: Foley 23.2.2006, 22:05 |
| Точно, именно так, и че я сам не догадался? Спасибо большое за статью и за помощь!!!! |
| Автор: Albinos_x 23.2.2006, 22:15 |
| Рад был помочь! Заглядывайте ещё... |
| Автор: Albinos_x 26.3.2006, 00:22 |
| отредактировал пост по практике с вордом, добавил еще : Ещё вариант по работе с таблицей Поиск и замена в документе |
| Автор: Beltar 22.5.2006, 18:39 | ||||
А у меня почему-то
Не сработало. Range я получаю так:
И нормально заношу в него данные. В чем м/б хитрость? |
| Автор: Albinos_x 22.5.2006, 19:13 |
| "не сработало" в каком смысле? не запустилось, выдало ошибку, просто ничего не произошло? |
| Автор: Beltar 22.5.2006, 21:39 |
| Сетка остается такой, как была, хотя данные в Range записываются. |
| Автор: Albinos_x 22.5.2006, 21:53 | ||
попробуй так:
|
| Автор: Albinos_x 24.5.2006, 21:22 | ||
обнаружено различие между Excel2000 и ExcelXP в методе сохранения. В первых постах внесено изменение. Приведу код, как сделать, чтоб приложение работало и в 2000 и в ХР:
|
| Автор: welt 31.5.2006, 23:49 | ||||||
| Albinos_x, помоги.. я закинул на форму ExcelApplication1, ExcelWorksheet1 и ExcelWorkbook1. Соединяюсь так (взял из какого-то твоего примера, с форума) :
у меня ошибка вылетает "interface not supported" и встает на строчке
(функции function TExcelQueryTable.GetDefaultInterface) в модуле ExcelXP.pas Да. Система такая: win2000, excel2000, в делфи 7 стоит компонент excellXP. По идее должно работать, но вылетает вышеуказанная ошибка... говорю "должно", т.к проходила все работало при таких параметрах: windowsXP, excel2003, делфи7 с компонентом ExcelXP
|
| Автор: Albinos_x 1.6.2006, 00:31 | ||
мда... в Excel 2000 нет OpenXML, там только Open:
Добавлено @ 00:33 PS: и в привёдённом тобой коде пятая строка не обязательна... |
| Автор: welt 3.6.2006, 19:51 |
| Albinos_x, да..это понятно, что нет OpenXML. Я и делал только с Open. мне больше хотелось услышать мнение на счет ошибки interface not supported может быть вы сталкивались... |
| Автор: Albinos_x 3.6.2006, 22:39 | ||
| ты бы написал на какой строчке вылетает ошибка.... то что встаёт на строчке Assert не значит, что ошибка возникает в этом месте... тем более, что функция из System, и при чём
я так и не понял... а ошибка видимо, из-за того что в какой-то фунции есть расхождение ХР и 2000 Excel... возможна передача большего числа параметров, чем нужно или наоборот недостаточно... |
| Автор: Albinos_x 13.6.2006, 22:13 | ||
часто задают вопрос как отключить сообщения выскакивающие в Excel:
|
| Автор: Albinos_x 16.6.2006, 19:33 | ||||||
| один из часто задаваемых вопросов: если хотите проверить на запущенность Ворда, то можно использовать отдельные функции... к примеру:
или
или
|
| Автор: TYRARGO 24.6.2006, 04:10 |
| Уважаемый администратор, назовите, пожалуйсто причину, по которой был удален мой пост? Что в нем было не так? |
| Автор: Girder 24.6.2006, 22:39 | ||
1. см. просьбу модератора... в ентом посте http://forum.vingrad.ru/index.php?showtopic=84634&view=findpost&p=749528 2. вот твой пост(тема): http://forum.vingrad.ru/index.php?showtopic=101581 |
| Автор: Albinos_x 22.8.2006, 21:22 | ||
Обнаружил у MSWord ещё один интересный метод, с помощью которого можно получить доступ ко всему содержанию документа:
в часности это метод Content, свойства _Document Text - принимает значение WideString; Сам Content имеет тип Range и все действия для него адекватны и для Content. |
| Автор: markivanov 8.5.2007, 16:33 |
| Подскажите, как можно в TWordApplication добавить из TStream. До этого в TStream я сохранял документ Word ??? |
| Автор: Albinos_x 9.5.2007, 09:38 |
| WordApplication не предоставляет такой возможности, делай через буфер, или добавить файл... можешь поэкспериментировать и попробовать грузить всё в OleVariat и оттуда уже вставлять... |
| Автор: Albinos_x 11.5.2007, 19:46 |
| markivanov, по поводу работы через OleVariant в модуле ActiveX есть функции OleLoadFromStream() и OleSaveToStream() поэкспериментируй с ними... |
| Автор: Albinos_x 24.9.2007, 08:59 |
| последнюю версию статьи можно прочитать здесь: http://zando.org.ru/content/view/27/31/ http://zando.org.ru/content/view/28/31/ http://zando.org.ru/content/view/29/31/ http://zando.org.ru/content/view/16/31/ http://zando.org.ru/content/view/19/31/ http://zando.org.ru/content/view/20/31/ http://zando.org.ru/content/view/21/31/ Добавлено через 3 минуты и 5 секунд Пример по Excel можно скачать http://www.albinos.nightmail.ru/Excel.zip |
| Автор: Hoor 28.9.2007, 23:51 |
| Вопросик такой: возникла необходимость вставки рисунка в Ворд из делфи я вызываю там вордовский документ (он у меня W.ActiveDocument) и т.д создаю image1 и загоняю его в файл, чтобы не морочиться с перерисовкой в Ворде image1.Picture.SaveToFile('имя'); Затем открываю его в Ворде: name:=W.ActiveDocument.Shapes.AddPicture('имя').Name; Даю настройки верхнего левого угла. W.ActiveDocument.Shapes.Item (name).Left:=Left; W.ActiveDocument.Shapes.Item(name).Top:=Height; Так вот Вопрос - как этот рисунок расположить в документе в тексте ? Спасибо. |
| Автор: Albinos_x 29.9.2007, 16:32 |
| она по умолчанию вставляется как в тексте... |
| Автор: Albinos_x 29.9.2007, 17:05 |
| просто выбери место через selection куда тебе нужно вставить, а потом уже вставляй, без указания координат... |
| Автор: Hoor 29.9.2007, 20:52 |
| Сорри, я кажется не совсем понял. Если задать "...просто выбери место через selection ..." Так может быть? W.Selection.End:=W.ActiveDocument.Range.End; W.Selection.Start:=W.ActiveDocument.Range.End; Если я даю name:=W.ActiveDocument.Shapes.AddPicture('имя').Name; то Ворд автоматом думает что координаты (0;0) и вставляет рисунок пперед текстом в начале первой страницы Добавлено через 10 минут и 12 секунд попробовал не через свойство name, а просто W.Selection.InlineShapes.AddPicture... Заработало Огромное спасибооо |
| Автор: Albinos_x 30.9.2007, 10:52 | ||||||
Ну зачум... просто доходишь до нужного места и вставляешь рисунок
или так:
координаты указывать не надо, т.к. когда ты их указываешь формат из "в тексте" меняется на "перед текстом". а так он вставит по положению курсора... к тому же если ты сам указываешь имя рисунка, то повторно получать его не обязательно, т.к. ты его и так знаешь... |
| Автор: B2_Russia 13.11.2007, 23:03 |
| А как бы еще отобразить документ на своей форме? |
| Автор: Albinos_x 15.11.2007, 03:48 |
| OleConteiner |
| Автор: SmarTik 27.12.2007, 16:07 |
| Доброго времени суток ! Может я немного не потеме, но такой вопрос: как получить index активного документа ? Спасибо. |
| Автор: Peha 11.1.2008, 22:34 | ||||
| Очень интересная статья!!! Мне она сэкономила кучу времени, т.к. начальнику захотелось сделать прогу для генерации кой-каких отчетов, но именно в Ворде... И вот я столкнулся с небольшой проблемой (точнее пока нет времени на эксперименты), нужно создать табличку вида:
Точнее, меня интересует, как можно обьединить несколько ячеек в созданной таблице в MS Word (у меня 2003) Если кто сталкивался, помогите плиз... Свое решение выложу, как-только сам разберусь... --------- все, нашел. Если кому интересно, код обьединяет ячейки в предпоследней строке с первой по пятую:
|
| Автор: mikolka 15.1.2008, 17:25 |
| Доброго времени суток. как можно узнать страницу на которой, сейчас находится курсор в ворде? |
| Автор: Jsn 5.2.2008, 14:53 | ||||
Помогите, плз, решить проблему: создаю TWordApplication, в фоне(!) открываю файл (документ) и выдаю его на печать. Все работает. Но при ошибках выскакивают интерактивные окна Word (например: "Во время последнего открытия документа произошла серьезная ошибка - восстановить?", "Размеры раздела выходят за границы печати" и т.п.), а мне надо, чтобы всё происходило именно в фоне! Пусть вызывает ошибку, но молчит! Перепробовал кажется всё, начиная от DisplayAlerts... Вот кусок кода: Application1 := TWordApplication.Create(nil); with Application1 do begin try fn := aFileName; Visible := False; fn1 := False; fn2 := True; DisplayAlerts := wdAlertsNone; Documents.Open(fn, fn1, fn2, fn1, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); // здесь бывают ошибки открытия fn := 1; Documents.Item(fn).Activate; PrintOut(fn1); // здесь ошибки печати Result := True; except on E: Exception do LogError('Error printing: ' + FormatDateTime(DateTimeString, Now) + ' ' + aFileName + ' - ' + E.Message); end; end; Delphi 5 и 7, Word 97-2000-XP - результат один; кроме TWordApplication пробовал и Word.Basic и OleObject - нет изменеий |
| Автор: Albinos_x 13.2.2008, 01:19 | ||||
| извините что дого не отвечал, был в состоянии переезда и имелись проблемы со связью... SmarTik, не уверен, но попробуй так:
если не поможет, то пробуй перебором... ============= mikolka, не могу пока сказать как, т.к сам ещё не нашёл... справка по VBA говорит, что есть объект Pages предствляющий собой массив страниц, доступ к ним должен выглидить где-то так: Wapp.ActivWindows.Panes.Item(1).Pages.Item(1) но с этим у меня ничего не получилось..( ============ Jsn, 1. используйте теги code 2. хм... странно... попробуйте так:
|
| Автор: Albinos_x 13.2.2008, 15:38 | ||
mikolka, попровляюсь, тут мне XperT подсказал
функция возвращает OleVariant |
| Автор: Jsn 14.2.2008, 17:31 | ||||
Albinos_x Application1.Connect; - не помогает |
| Автор: Albinos_x 16.2.2008, 22:49 | ||
| хм..... Jsn, если я правильно понял, то этот код Вы используюте, только для того чтоб печатать документы. Если я правильно понял, то этот код можно реализовать гораздо проще вот код:
если показывать окно ворда не надо, то передайте вместо SW_SHOW значение SW_HIDE |
| Автор: Albinos_x 6.3.2008, 01:54 |
| Пример смарт-тега здесь: http://forum.vingrad.ru/forum/topic-197657/anchor-entry1434286/0.html |
| Автор: Чердак 3.5.2008, 16:25 |
| А где можно найти Help по функциям сервера MSOffice? |
| Автор: Albinos_x 4.5.2008, 19:59 |
| в справке по VB |
| Автор: Чердак 5.5.2008, 18:57 | ||
| Спасибо, а как можно установить отдельно эту справку? и можно ли где скачать? Время доброе
что не так делаю? |
| Автор: Чердак 5.5.2008, 21:26 | ||
Получилось...
|
| Автор: Albinos_x 5.5.2008, 22:49 | ||
когда устанавливаете оффис, поставить галку выбрать конфигурацию в ручную... ну и там соответственно "Установить" |
| Автор: Albinos_x 5.5.2008, 23:08 | ||
хм... ну во первых... то что в первом варианте Вы не подсоединили EWsh1 к листу
|
| Автор: zhefran 19.5.2008, 12:37 |
| На tablet Pc в Word есть такая комманда как InsertInkAnnoptations - это рукописные примечания. У меня вопрос: Как можно добраться до пунктов его CommandBar-а? Там в нем есть изменение цвета примечания; изменения типа пера - ручка, фломастер, выделение; изменение толщины линии. Пробовал выполнять запись макроса, потом эти команды. В макросе ничего не написано. Потом все это надо будет сделать с помощью Delphi. Я думаю буду просто выполнять макрос, но я не знаю как добраться до тех команд. |
| Автор: Albinos_x 27.5.2008, 21:41 | ||||
если не написано, значит через макрос по лубому не получится... а эти команды скорее нужно выполнять в отдельном интерфейсе... |
| Автор: NightKeeper 29.5.2008, 07:14 |
| Доброго времени суток! Помогите решить следующую проблему: Есть файл Excel, в котором присутствуют объекты типа Image и CheckBox, необходимо передавать в них значения из программы на Дельфи. Формат файла разработан не мной и редактировать его структуру категорически запрещено. Каким образом я могу получить доступ к этим объектам если известны только их имена? |
| Автор: NightKeeper 29.5.2008, 11:03 |
| Все. Всем спасибо! Сам разобрался |
| Автор: Beltar 3.6.2008, 10:17 | ||
Кстати, а кто-нибудь писал здесь о таких неприятных вещах, как отключение от Office версий ниже 2003-ей? Сервер остается в памяти, но к нему не подключишься и его оттуда только через 3 веселых клавиши. 2003-ий же если он уже загружен только пускаться быстрее будет. В свое время статья помогла мне найти решение. Запомнить при коннекте версию, и делать так:
Хотя под Win2000 все равно подглючивает сообщением об ошибке, которое можно просто закрыть. Еще один "прикол" с версиями Excel младше 2003. Если Range получился пустой, то при попытке оформить границы ячеек происходит сбой. Или например Range включает одну строку и при попытке обратится к границе xlInsideHorizontal также происходит сбой. В 2003 же все работает отлично. |
| Автор: nuzzle 16.6.2008, 19:29 |
| Здравствуйте. При обработке информации в таблицах документа MS Word я пытаюсь использовать две переменные типа OleVariant, которые ссылаются на IDispatch таблиц, в которых были найдены определенные значения. Как узнать, ссылаются переменные на одну и ту же таблицу или нет. Благодарю Вас. |
| Автор: TVV777 15.7.2008, 14:30 |
| При работе с Word-ом ни где не упоминается как объединить или разбить ячейки таблицы . Может кто подскажет? Я пробую так ... tab1:=WA1.ActiveDocument.Tables.Item(1); ... tab1.Cell(3,1).Split(1,3); // третью строку разбить на три столбца ... Но выдаётся ошибка: [Error] Print_Bilet.pas(73): Types of actual and formal var parameters must be identical Подскажите как правильно? |
| Автор: Albinos_x 15.7.2008, 22:38 |
| TVV777, значения 1 и 3 попробуйте передать как olevariant, я вам уже ответил по мылу Добавлено через 3 минуты и 13 секунд nuzzle, хм... наверно если только проверять содержание таблиц... точного ответа на этот вопрос пока не могу стказать |
| Автор: TVV777 16.7.2008, 10:27 |
| Большое спасибо за предыдущую подсказку!!! У меня к Вам есть ещё вопрос. Допустим у меня есть заполненная таблица. и мне нужно выделить в одной из ячеек одно слово (чтобы отформатировать его). Слово может находится в любом месте строки. Слово этоя я знаю, и знаю что оно там точно есть. Подскажите как это сделать пожалуйста!!! Местоположение слова с точностью до символа и его длину я тоже знаю. И ещё: каким способом можно перемешать курсор по ячейкам (к примеру нужно поставить курсор в 5,1 яейку)? Топик просто великолепен!!! |
| Автор: Albinos_x 16.7.2008, 17:29 | ||
попробуйте так:
Добавлено через 1 минуту и 29 секунд это по поводу выделения ячейки Добавлено через 2 минуты и 56 секунд если знаете расположение слова с такой точностью, то устанавливайте Range и потом запускайте процедуру Select |
| Автор: Beltar 17.2.2009, 10:46 | ||||||
| Можно вопрос по TExcelChart? У меня есть рабочая книга на первом листе таблица, на втором диаграмма. Используя TExcelChart я попробовал присоедениться так:
Никаких сообщений об ошибках не выдается, это радует. Записал для выяснения свойств макрос:
Однако при попытках в Delphi написать:
только получаю сообщения, что [Pascal Error] FormReport.pas(345): E2029 '[' expected but '.' found да [Pascal Error] FormReport.pas(346): E2003 Undeclared identifier: 'XValues' Как правильно? |
| Автор: Albinos_x 1.3.2009, 23:22 | ||
|
| Автор: Ymnuk 4.3.2009, 19:53 | ||
| Доброго времени суток. Подскажите пожалута как в Excel узнать количество заполненных строк. В Delphi пишу:
В итоге количество строк показывает 65536, хотя я точно знаю, что их там не более 35000. |
| Автор: Albinos_x 5.3.2009, 17:18 |
| на первой странице этой темы написано... http://forum.vingrad.ru/forum/topic-84634/0.html# |
| Автор: Akella 26.3.2009, 00:45 | ||
Объединить ячейки Excel
Добавлено через 2 минуты и 15 секунд Относительно LOCALE_USER_DEFAULT Относительно открытия существующих рабочих книг Закрытие книги Способы обращения к ячейкам Копирование данных в буфер обмена http://forum.vingrad.ru/index.php?showtopic=34912&view=findpost&p=306276 Это по идее должно было попасть в DRKB |
| Автор: Beltar 21.4.2009, 09:48 | ||
Опять вопрос относительно диаграммы. На этот раз диаграмма на том же листе, что и данные. Пробую работать без TExcelChart. Хочу просто поменять у диаграммы название.
HasTitle[lcid]:=true проходит. Однако потом вываливается ошибка OLE и AV С адресом в ноль. |
| Автор: Yudya 29.4.2009, 16:26 |
| Привет всем. Подскажите как мне программным путем при создании документа Excel или Word дать название создаваемого документа (т.е. название документу Excel или Word)??? |
| Автор: Данкинг 29.4.2009, 17:29 |
| Yudya, ...saveas('имя_файла.xls'); |
| Автор: Albinos_x 8.6.2009, 01:43 | ||
| // HasTitle[lcid]:=true проходит. Однако потом вываливается ошибка OLE и AV С адресом в ноль. Beltar, попробуй закомментировать строки:
сталкивался иногда с тем, что именно эти строки могут вызывать ошибки, а обращение к нужному обёкту у вас всё равно будет происходить.... |
| Автор: Akella 2.9.2009, 11:40 |
| http://citforum.univ.kiev.ua/programming/delphi/excel/ |
| Автор: TSIBA 6.9.2009, 15:24 |
| Может поможет: Название: Советы по Delphi 1.4.6 Автор: В. Озеров Описание: коллекция ответов на нетрадиционные вопросы программирования на Delphi, нестандартных решений, хитростей и интересных идей. Для практической пользы дела приведены конкретные примеры кода, позволяющие донести идею или полностью ответить на заданный вопрос. Размер: 1,38 Mb Формат: chm Ссылки: http://depositfiles.com/files/ho3cqvt36 Название: Советы по Delphi 1.4.2001 Автор: В. Озеров Описание: коллекция ответов на нетрадиционные вопросы программирования на Delphi, нестандартных решений, хитростей и интересных идей. Для практической пользы дела приведены конкретные примеры кода, позволяющие донести идею или полностью ответить на заданный вопрос. Размер: 1,97 Mb Формат: chm Ссылки: http://depositfiles.com/files/jutszmneq Название: Отчетность в Exel Автор: М. Фленов Описание: Полностью описана робота с Exel в Delphi. К архиву прилагаються готовие примеры. Размер: 970 кб Формат: pdf Ссылки: http://depositfiles.com/files/va7m3iqix |
| Автор: Natalishka 29.9.2009, 07:45 |
| Подскажите пож-та, мне нужно сделать импорт данных (котрые генерируются ХР)в word. У меня есть шаблон, надо в определённые места вставить данные. В excel я делаю так : with spRead do begin First; while not Eof do begin xl.WorkBooks[1].WorkSheets[1].Cells[Count + 5, 1].Value := FieldByName('FAM').AsString; xl.WorkBooks[1].WorkSheets[1].Cells[Count + 5, 2].Value := FieldByName('NAME').AsString Inc(Count); Next; end; end; Здесь все понятно я указываю ячейки, но для word нет таких ф-ций. А как мне для word показать в какое именно место мне вставить данные ? |
| Автор: Alfredphb 1.10.2009, 04:56 | ||||||
| Вопрос: надо изменить размер рисунка, вставляемого в Word. Я делаю так (на основе кода, найденного где-то в инете):
Проблема в том, что вставленный в документ рисунок изрядно теряет в качестве, "распикселизация". Если вставляю в оригинальном размере:
то качество сохраняется. Я пытался после вставки изменить размер рисунка в вордовском документе:
никаких сообщений не выдаётся, размер не меняется. Что я делаю не так, и как надо правильно? |
| Автор: Alfredphb 8.10.2009, 09:07 | ||
По поводу изменения размеров рисунка получилось вот так, вдруг кому пригодиться:
|
| Автор: TopCore 14.10.2009, 12:52 | ||
Здравствуйте! Я с вопросом "из Excel в Paradox". Делаю по примеру с первой страницы. Но есть проблемы. Подсчёт строк неправильный: вместо 65 подсчитывает 74. И когда доходит код до работы с БД выдаёт сообщение об ошибке:
Как набор данных сделать открытым? |
| Автор: Данкинг 14.10.2009, 14:13 |
| TopCore, создай новый топик. При чём здесь ExcelApplication вообще? |
| Автор: TopCore 14.10.2009, 17:29 | ||
За вопрос о БД прошу прощения. А вот что не так с определением количества строк в таблице?
Эта строка активирует ячейку 'Х74' вместо 'Т62'. |
| Автор: Alexanderneo 17.4.2010, 13:11 | ||
| Подскажите, пожалуйста, как можно подключиться к ворду дважды. Т.е. я изначально подключаюсь к ворду, записываю в него, все, что надо. Если потом открыть созданный документ, а потом закрыть его (процесс WINWORD при этом закрывается естественно) и попытаться создать еще один документ (не закрывая программы), то программа выводит ошибку о недоступности сервера RPC. Подсоединяюсь к ворду так:
В подключении пихаю все уже от безисходности Вопрос заключается в том, что при первом разе ворд автоматом подключается, потом если процесс ворда прервать, то к ворду уже не получается подключиться. Помогите кто может. |
| Автор: Данкинг 17.4.2010, 13:16 | ||
Ничего естественного. Можно закрыть документ, не закрывая самого "ворда". |
| Автор: Albinos_x 19.4.2010, 08:35 | ||
я вроде писал об этом в статье.... в общем: 1. Если Вы показываете документ пользователю и он его может закрыть, то Вам необходимо отлавливать сообщение о закрытии документа или самого сервера Word, для этого у компанента есть необходимые обработчики событий. 2. При программном закрытии таких проблем возникать не должно, но если все-же возникают, то пробуйте при закрытии делатьсь Disconnect с сервером, тогда он будет переинициализировать сервер заново. |
| Автор: scorpion87 3.5.2010, 15:42 |
| Здравствуйте, проблема в следующем: используя фукнцию: Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text:='текст'; я вставляю в нужную ячейку необходимый текст, далее необходимо вставить в этой же ячейке таблицы другую строку, я програмно жму клавишу "Enter" используя функцию WordApp.Selection.TypeParagraph; Как вставить текст? вызвав функцию Word.selection.TypeText('sdf2'); текст вставляется не в таблицу а в документ, по сути нужно наверное поставить указатель в данную ячейку и потом в нее записывать. Короче говорю мне нужно в одну ячеку вордовской таблицы вставить последовательно несколько строк. |
| Автор: Albinos_x 4.5.2010, 12:59 | ||||||
хм... а что мешает сделать вставку в один присест:
или таким вот подходом:
? |
| Автор: Akella 7.8.2010, 22:16 |
| Excel в Delphi. Работа со свойствами документа. http://www.webdelphi.ru/2010/06/excel-v-delphi-rabota-so-svojstvami-dokumenta/ |
| Автор: klyaksa 25.8.2010, 14:48 |
| Подскажите возможно ли экспортировать в excel не плоский текст, а форматированный rtf? Если да, то как? Т.е. у меня в строковой переменной s есть rtf-текст, при присваивании Excel.ActiveWorkBook.WorkSheets[1].Range['A1'].Value:=s в ячейке плоских текст и видны все теги rtf, а не форматированный текст :( |
| Автор: Данкинг 25.8.2010, 15:08 | ||
Возможно, через буфер обмена. Только создай новую тему для этого вопроса. |
| Автор: klyaksa 25.8.2010, 20:05 | ||||
Пробывал, копируя тут вручную... Из JvRichEdit вставляет голый текст. Если же вставить в ворд и уже оттуда скопировать тогда вставляет... Как переписать с помощью ExcelApplication, ExcelWorkbook, ExcelWorksheet? Что постоянно ошибки выскакивают...
|
| Автор: Albinos_x 26.8.2010, 21:32 | ||||
смотря что ты хочешь получить.... текст с потерей форматирования *.rtf?... да можно... только сначала нужно обработать текст от лишних тегов... если хочешь с форматированием... то сложнее... тогда писать свой парсер, который будет разбирать форматирование rtf и переносить его в excel... Добавлено через 31 секунду иначе будет вставлять только полный текст Добавлено через 2 минуты и 48 секунд
что именно переписать? если создание и подключение к серверу с созданием определенного количества страниц, то смотри первые 2 страницы... там про это написано... с примерами... |
| Автор: klyaksa 28.8.2010, 10:26 |
| Как переписать разобрался... Я просто 1 у имен обычно убираю, а после as ... ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets[NSheet] as ExcelWorkSheet); А вот с сохранением документа (созданного с нуля) проблема, на всех примерах ругается... Например, не может там что-то в булеан преобразовать... (ExcelXP) |
| Автор: Данкинг 28.8.2010, 14:32 | ||
Зачем? Чем ole не нравится? Там сохранение (.SaveAs) отлично работает. |
| Автор: Albinos_x 29.8.2010, 20:28 | ||||
вообще, конечно, достаточно указать параметр xlExclusive и он не должен ругаться, но для перестраховки можно и так Добавлено через 31 секунду xlExclusive - это значит он откроет монопольно... Добавлено через 7 минут и 42 секунды для office XP этот параметр тоже подойдет... |
| Автор: klyaksa 30.8.2010, 13:00 |
| Albinos_x, все ОК. Спасибо. Предупреждения которые мешают заметит нужную ошибку. |
| Автор: klyaksa 30.8.2010, 13:59 |
| Albinos_x, при сохранении с именем уже сущ. файла в excel вылазит окно заменить? (да, нет, отмена). Если нет то делфи выдает ошибку "OLE ERROR 800A03EC"... |
| Автор: fishick 31.8.2010, 23:52 | ||||
Здравствуйте. У меня такая же проблема (отформатировать одно из слов в ячейке таблицы). Подскажите что я делаю не так: tbl.cell(3,3).range.setrange(3,6); tbl.cell(3,3).range.select; далее я делаю подчеркивание, но в результате подчеркивается все содержимое ячейки. |
| Автор: Albinos_x 1.9.2010, 15:54 | ||
процетируемой командой Вы выделяете всю ячейку, поэтому и подчеркиваются все слова. вам необходимо выделить именно форматируемое слово Добавлено через 1 минуту и 5 секунд klyaksa, а какие команды ты выполняешь после? приведи кусок кода в котором ты делаешь сохранение. |
| Автор: klyaksa 1.9.2010, 16:25 | ||
Создание нужного документа в excel (получается все как надо) и сохранение как в Дата 29.8.2010, 20:28 и все. |
| Автор: fishick 1.9.2010, 17:45 | ||||
А какой командой можно это сделать? Подскажите, пожалуйста. |
| Автор: Albinos_x 3.9.2010, 11:37 |
| klyaksa, на какой строчке вылетает ошибка? приведи кусок кода. Добавлено через 32 секунды fishick, чуть позже посмотрю, отпишусь |
| Автор: fishick 3.9.2010, 13:45 | ||||
У меня появилось кое-какое решение, но не очень элегантное в виду большого количества обращений к серверу. Решил проблему через Characters.
выделять приходится по одному символу. Как выделить сразу несколько символов пока не разобрался, т.к. конструкция
выдает ошибку. |
| Автор: Albinos_x 3.9.2010, 16:39 | ||
вот так можно решить:
|
| Автор: fishick 3.9.2010, 22:56 |
| Albinos_x, попробую. Спасибо! |
| Автор: klyaksa 5.9.2010, 20:54 | ||
При нажатии Нет выскакивает сообщение внизу.
--------------------------- Debugger Exception Notification --------------------------- Project MyReport.exe raised exception class EOleException with message 'OLE error 800A03EC'. --------------------------- Break Continue Help --------------------------- |
| Автор: Albinos_x 6.9.2010, 15:46 | ||
| ??? а в каком месте здесь он у тебя спрашивает да или нет???? если делаешь SaveAs и все коректно передаешь, то ничего спрашивать не должен, дорлжен в тихую сохранить и все. 1. проверь корректные ли данные передаютя через FileNameOle серверу приложений 2. попробуй закомментить
будет ли появляться данная ошибка? 3. переменная BoolOle задана? |
| Автор: klyaksa 6.9.2010, 17:15 | ||
Если файл с таким именем существует, то из екзеля вываливаюсь в дельфи с сообщением выще на строчке ExcelApplication1.ActiveWorkbook.SaveAs(FileNameOle, Fileformat, EmptyParam, EmptyParam, Но это все из под дельфи, так то все гладко. |
| Автор: Albinos_x 7.9.2010, 14:17 | ||
хм... обычо в таких местах всталяю проверку:
Добавлено через 34 секунды с типом то понятно... с другим не скомпелируется, значение какое? |
| Автор: klyaksa 7.9.2010, 15:05 |
Зачем? |
| Автор: Albinos_x 7.9.2010, 16:08 | ||
как правило, если я даю решать что то пользователю, то я стараюсь разрывать коннект с сервером приложений иначе можно столкнуться со всякими непредвиденными обстоятельствами и ошибками.... но в этом случае предварительно ничего не сохраняю, а предлагаю пользователю это делать самостоятельно. по существу вопроса... у тебя после или ещё где-нибудь есть обращение к серверу приложений? как и где разрываешь связь, и как и где освобождаешь память? пошаговая отладка также показывает ошибку после этой команды? т.е. ошибка появляется тилько в режиме отладки? или все же при обычном запуске тоже пояавляется сообщение? |
| Автор: klyaksa 21.9.2010, 19:46 | ||
да... А как правильно закончить работу с excel и оставить его пользователю? |
| Автор: Albinos_x 21.9.2010, 22:35 |
| используй метод disconnect |
| Автор: klyaksa 22.9.2010, 10:23 |
ExcelApplication1.disconnect закрывает эксел... Или я что-то не так пишу? |
| Автор: Albinos_x 24.9.2010, 10:41 |
| нет. эта команда разрывает связь. Скорее всего у тебя параметр Autoconnect стоит в True, поэтому он и закрывает его. Выставь его в false и будет тебе счастье))) |
| Автор: wood 20.3.2011, 15:02 |
| Подскажите, как в ворде добавить (или вставить) в существующую таблицу строки (документ был создан ранее - форма отчета). К ворду подключаюсь через CreateOleObject( 'Word.Application' ), к таблице Table:= MSWord.ActiveDocument.Tables.Item(4); |
| Автор: wood 21.3.2011, 06:01 |
| Нашел! http://www.delphi.int.ru/articles/11/ - было бы здорово добавить к данной теме |
| Автор: stanlys 28.3.2011, 16:54 | ||
| Возник вопрос, даже после чтения ветки форума. Проблема такая есть шаблон в ворде (на каждом листе: шапка, рамка, условные обозначения, исполнитель), всего 5 листов и есть 5 картинок(одна в формате bmp, остальные emf). Нужно получить лист и в центре картинка. Первая удачно вставляю, а вот дальше не получается, может быть не работает переход, так и не разобрался в чем проблема. Помогите, пожалуста.
Вообщем в результате получается, что у меня все картинки на первой странице. Как решить эту проблему??? |
| Автор: Ptica_Oz 17.11.2011, 17:56 | ||
| Здравствуйте, уважаемые. Строю я диаграмму в Excel: открываю шаблон с лежащей на нём пустой диаграммой, заполняю ячейки значениями, подсовываю получившуюся таблицу диаграмме. Всё работает, всё замечательно. Только вот надо мне после построения пройтись по "столбикам" (Point) и задать им конкретные цвета, те, что на генерировал Excel не устраивают
А вот перевести на свой язык не получается. Вообще-то я пишу на C#, но подобная проблема возникает и на Delphi на сколько я могу судить по http://www.sql.ru/forum/actualthread.aspx?tid=716363 Помогите, пожалуйста, примером на Delphi или C# |
| Автор: Ptica_Oz 18.11.2011, 10:29 | ||
| Разобралась! Простите, код на C#
|
| Автор: findme 18.11.2011, 17:21 |
| Подскажите, как скопировать выделенную область ячеек в другой лист? |
| Автор: cadil 30.1.2012, 12:54 | ||
Есть команда следующего вида -
У меня два вопроса (да простит меня модератор!): 1. Редактор Дельфи worksheets, cells помечает как незадекларированные идентификаторы, хотя команда работает. Как исправить эту ошибку? 2. Как из ячейки cells[j, 2]записать информацию, например, в Edit2? Заранее благодарю! |
| Автор: serafim0 30.1.2012, 18:57 |
| подскажите кто знает, как получить текст выделенного в ячейке текста из excel в переменную или же начало - конец выделения? я так понимаю надо смотреть в сторону XlReferenceStyle? 2-ой день ищу бестолку.. (( пока одна мысль - вызывать метод xlCopy, но это не совсем то что-бы хотелось. |
| Автор: Akella 13.3.2012, 11:22 |
| http://www.webdelphi.ru/2012/01/bystraya-obrabotka-dannyx-excel-v-delphi/ |
| Автор: jDeuterium 27.3.2012, 20:59 | ||
| Подскажите, как вставить данные из базы в Excel? с помощью WordApplication я понял как:
а как сделать с помощью ExcelApplication? и как запустить макрос в excel? |
| Автор: Данкинг 27.3.2012, 21:15 |
| jDeuterium, примеры читал? На форуме искал? И вообще. создай отдельный топик с конректным вопросом. |
| Автор: reikjavik 2.5.2012, 07:54 |
| Подскажите мне. У меня есть вордовский документ который содержит таблицы и их названия отдельно в виде текста... как мне вытащить названия таблиц? Например: Таблица 1: Название потом идет таблица... Пытался через Selection.Find что то не получается... |
| Автор: Albinos_x 27.5.2012, 20:47 |
| reikjavik, приведите пример кода. Так не понятно что у Вас не получается. Там я вроде приводил код которым можно получить весь текст сразу. а дальше можно искать слово "Таблица ".. и тд... |
| Автор: Juju 1.6.2012, 21:13 | ||
| Ребята, не выгружается Excel из памяти. Соответственно документ открыть корректно нельзя. Delphi XE2 U3 После сохранения документа пытаюсь закрыть:
Что не так? |
| Автор: Akella 4.6.2012, 20:26 |
| http://citforum.ru/programming/windows/excel_faq/ |
| Автор: Juju 4.6.2012, 23:00 | ||
Akella, спасибо за ссылку, но там нет ответа на мой вопрос. И более того - там подтверждение что я все делаю правильно:
у меня все один к одному, но Excel не закрывается (процесс висит в памяти!) |
| Автор: Данкинг 4.6.2012, 23:20 | ||
|
| Автор: Beltar 6.6.2012, 14:11 | ||||
Как перевести на нормальный язык (т. е. Паскаль) вот это:
Задача очевидна, задать диаграмме диапазон значений для ряда.
Так не работает. Точнее просто не компилируется, потому что SeriesCollection возвращает IDispatch у которого никаких свойств по умолчанию нету. |
| Автор: Juju 6.6.2012, 14:25 | ||
Данкинг:
|
| Автор: Данкинг 6.6.2012, 14:42 |
Используй OleObject. Я с TExcelApplication никогда не работал, поэтому по нему не подскажу. |
| Автор: Beltar 6.6.2012, 14:51 | ||||
Я где-то раньше для закрытия рекомендовал в TExcelApplication.onWorkbookBeforeClose
По крайней мере у меня с версиями до 11-ой (ака 2003) работает корректно только так. |
| Автор: Albinos_x 14.7.2012, 20:56 | ||
какого типа у тебя XL? |
| Автор: reikjavik 16.11.2012, 14:35 | ||
| Здравствуйте! У меня такой вот вопрос мне нужно разделить таблицы которые переходят на следующую страницу. и после разделения написать между ними текст "продолжение таблицы"! Подключаюсь через CreateOLEObject('Word.Application') Делаю так:
Вот со вставкой текста проблемы подскажите пожалуйста! |
| Автор: AntonBunin 15.5.2013, 21:01 |
| Писал программу с использованием ТWordApplication на одном компьютере, необходимо продолжить работу на другом, в упор не помню как подключал ТWordApplication в проект. Ткните носом где освежить сию процедуру. Спасибо. |
| Автор: AntonBunin 16.5.2013, 19:37 |
| Живых нет!? |
| Автор: gesper 17.6.2013, 20:26 |
| Компонент найти фильтром через инспектор, нет? |
| Автор: Данкинг 18.6.2013, 12:05 |
Вкладка "servers" вроде как. |
| Автор: Albinos_x 23.7.2013, 18:30 |
| AntonBunin, для XE2 : "Project" -> "Options..." -> "Packages" -> поставить галочку напротив Embarcadero delphi Office Xp sercers Package Добавлено через 3 минуты и 17 секунд прошу прощения, соврал, галка на против "microsoft office xp sample automation server wrapper component" |
| Автор: Beltar 24.2.2014, 13:32 | ||
Внезапно встал вопрос. Excel 2003. По коду часто встречаются куски вроде:
Все это прекрасно работало годами, но сейчас вот принесли ТЗ на доработку и выяснилось, что установка выравнивания стала падать. Именно у меня. Кто-нить сталкивался? |
| Автор: mr_tg 3.3.2014, 19:44 | ||
Здравствуйте уважаемые знатоки, извините если я повторяюсь (или невнимательно смотрел, но я не нашёл)
1) Как можно прогроммно создать, автоматом записать на excel потом сохранить в память допустим с именем сегодняшней даты. Без вмешательство юзера. (создать и созранить как то получается вот тепьер хочется записать) 2) Когда ListBox1.Items.Count больше 10000 строк (вобше большие строки) программа долга экспортирует. Нельзя её оптимизировать так что бы экспорт 3) Если можно примерчик покажите ПЛС заране СПС |
| Автор: Данкинг 3.3.2014, 21:14 |
Функция DATE() же есть. |
| Автор: mr_tg 4.3.2014, 07:38 |
| Данкинг спс за внимание! у меня шас так 1) создаю excel ( excel:=CreateOleObject('Excel.Application');.....) 2) записиваю данные (Sheet.Cells[k, j].NumberFormat:=r; ....) 3) отабражаю excel файл (excel.visible:=true;) 4) юзер сам сохраняет через меню excel (я этого не хочу) я хотел сказать "нужно автоматом сохранить excel файл допустим destifile:='d:\1111\'+datetostr(now)" |
| Автор: Beltar 4.3.2014, 15:24 | ||
К моему пред вопросу, если кто еще нарвется. Из-за чего такая хрень не выяснил, но нашел другое решение. Вместо констант clTop, xlLeft и т. д. использовать
|
| Автор: Данкинг 4.3.2014, 21:18 | ||
|
| Автор: mr_tg 11.3.2014, 11:14 | ||
Данкинг СПС за
помогло 2) Когда ListBox1.Items.Count больше 10000 строк 100 столбцов (вобше большие строки) программа долга экспортирует. или вобше зависает. что вы можете по советовать Если можно примерчик покажите ПЛС заране СПС |
| Автор: Данкинг 11.3.2014, 20:03 |
"EMS Advanced Export Component Suite" какой-нибудь. |
| Автор: z12 15.3.2014, 09:28 |
| У меня задача разместить msword в моем приложении. Суть проблемы: - как я понял TOleContainer работает с одним инстенсом ворда. Если возможность указывать что надо создать новый инстенс? - если открыть документ в TOleContainer то Application.ActiveDocument.Name возвращает не имя файла а "Документ в OleContainer". Как узнать с каким докуентом я работаю, и как переключаться между документами по имени файла? - есть альтернатива для TOleContainer ? в частности интересует можно ли объект созданный через CreateOleObject('Word.Application'), разместить на TPanel Перерыл весь интернет но так и ненашол решения загрузки данных в ворд из TSream. Рассматривал примеры загрузки через буфер обмена, но тут формат слитает. TOleContainer.LoadfFomStream вообе неработает =( |
| Автор: nastosnesti 18.3.2014, 01:04 |
| Подскажите пожалуйста, каким свойством можно обратиться к последнему символу в определенном абзаце? Задача состоит в том, чтобы проверить есть ли точка в конце первого абзаца. |
| Автор: Keeper89 24.3.2014, 00:52 | ||
nastosnesti,
и дальше берем любой символ. Добавлено через 13 минут и 56 секунд z12, можно покопать в этом направлении: http://stackoverflow.com/questions/14328411/embedding-multiple-ms-word-instances-in-tolecontainer |
| Автор: Avazart 7.2.2016, 12:22 |
| Народ никто не знает как решить подобную проблему: Но проблема в том что в ячейке таблицы содержится не только текст но и формула, мне нужно изъять только текст или "плоское" представление текста того что в ячейки без непонятных "левых" символов, приблизительно такое которое получает при копировании из буфера обмена в блокнот.Можно ли этого достигнуть? Вот оригинальная тема, с большим описанием и примером файла: http://www.cyberforum.ru/com-ole/thread1638975.html P.S.:Там на C++Builder но данном случаем мне не важно на чем ибо все равно VCL и OLE. |
| Автор: Albinos_x 11.3.2017, 13:54 |
| Avazart, этот вопрос скорее всего не из этой темы... если как копирование в блокнот, то нужно пройтись по тексту и удалить непечатные символы... Добавлено через 3 минуты nastosnesti, в Word есть объект - абзац - в начале этого топика вроде были примеры работы с абзацами, перебирайте их, получайте текст из Range, далее рекомендую удалить\пропустить в конце непечатные символы и пробелы и после посмотреть какой символ в конце стоит.... Добавлено через 7 минут и 35 секунд z12, 1. не тривиальная задача.. попробуйте создать отдельную тему с этим вопросом, т.к. вопрос не совсем относится к указанной теме 2. в контейнере OleObject есть свойство указывающее откуда загружен файл 3. попробуйте покопать в направлении создания дочерних окон. |