Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WordApplication, ExcelApplication, Работа с Word и Excel 
:(
    Опции темы
Albinos_x
Дата 20.2.2006, 19:16 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 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:
Код

WordApplication1.Documents.Add(Param1,Param2,Param3,Param4);

Param1 - указывает шаблон, который оспользуется при создании документа, если параметр по умолчанию (EmptyParam), то используется Обычный(Normal)
Param2 - определяет, открывается документ как шаблон или как обычный документ, и имеет булевый тип. При значении (по умолчанию) False открывается как обычный документ .
Param3 - тип документа, и может принимать следующие значения: wdNewBlankDocument - новый пустой документ, wdNewEMailMessage - Новое электронное сообщение, wdNewFrameset - новый фрейм, wdNewWebPage - Новая Веб страница. По умолчанию (EmptyParam) используется wdNewBlankDocument.
Param4 - определяет открывается ли документ в видимом окне или нет. По умолчанию равен True - в видимом. Сделать видимым или невидимым документ, можно в любом месте программы с помощью свойства WordApplication - Visible:
Код

WordApplication1.Visible:=True;  // сделать видимым, false соответствеено невидимым


Причём, четыре параметра имеются в Word от версии 2000, версии ниже имеют только первых два параметра, т.е. для Word97 нам надо писать:
Код

WordApplication1.Documents.Add(EmptyParam,EmptyParam);


для того, чтоб сделать приложение работающее под любую версию Word-а, необходимо учитывать такие отличия, и соответственно в программе проверять версию установленного Word-а. Это можно сделать с помощью свойства Version и будет выглядить приблизительно так:
Код
...
uses 
    ... , Word97, WordXP
...
if (StrToInt(Copy(WordApplication1.Version,1,pos('.',WordApplication1.Version)-1)))<9 then
   WordApplication1.Documents.Add(EmptyParam,EmptyParam)
   else
   WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...

чучуть поясню... свойство Version имеет строковый тип, и к примеру для Word97 вернёт "8.0", 2000 - "9.0", 2002 - "10.0"...

Также важным свойством WordApplication является свойство Selection - указывающий на позицию курсора или выделенный фрагмент текста в активном документе. Для вставки текста имеются методы InsertAfter и InsertBefore. Первый вставляет текст после объекта Selection, второй - перед ним.
Код
...
WordApplication1.Selection.InsertAfter('ОТЧЁТ ' +Edit1.Text+#13);
...

символ #13 переведёт курсор на новую строку и означает конец абзаца.
Стоит отметить, что данные функции имеют ограничение на размер передаваемой строки, которая не должна превышать 255 символов.
Выделенный текст мы можем отформатировать. Для этого у Selection есть ряд свойств. К примеру Font и ParagraphFormat. В Delphi, для удобства работы предусмотрены на той же вкладке (Servers) компаненты WordParagraphFormat и WordFont1. Для подключения этих объектов к соотвествующему объекту будем использовать метод ConnectTo:
Код

WordFont1.ConnectTo(WordApplication1.Selection.Font);
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);

Примеры работы с этими объектами размещу ниже...

Для вставки текста имеется ещё один очень интересный метод TypeText. Но его работа немного отличается от ранее описанного. И зависит от свейства ReplaceSelection, принадлежащее свойству Options. Если RepleceSelection:= true, то выделение заменяется на указанный текст, если false, то новый текст вставляется перед выделением:
Код
...
WordApplication1.Options.RepleceSelection:=true;
WordApplication1.Selection.TypeText('ОТЧЁТ');
...

в результате выполнения кода выделенный текст заменится на слово "ОТЧЁТ".

для вставки из буффера обмена у Selection есть метод Paste, который так же зависит от ReplaceSelection.

Хочу отметить ещё одно важный метод Selection - Collapse - данный метод свертывает выделение, передаваемый в него аргумент определяет позицию курсора после свёртывания. Аргумент может принимать значения wdCollapseEnd и wdCollapseStart, помещение курсора в конец или в начало выделения соответственно. По умолчанию (EmptyParam) равен wdCollapseStart.

Как и в сервере Excel здесь мы можем встретить объекты Range - соответствует какому-то непрерывному участку текста.
Код
...
var Rang,Start,End:OleVariant;
...
Start:=1; Endr:=15;
Rang:=WordDocument1.Range(Start,Endr);
...

после выполнения этого кода объект Rang будет соответствовать первым 15 символам текста. По свойствам данные объекты схожи со свойствами Selection.

Нашёл в одной книжке описание ещё одного свойства сервера Word - это Dialogs. Сам его ещё не опробовал, но всё же опишу.
Итак, Dialogs - массив (собрание) объектов Dialog, которые соответствуют встроенным диалогам Word. Доступ к ним осуществляется так:
Код
...
WordApplication1.Dialogs.Item(wordDialog);
...

константа 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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 20.2.2006, 20:17 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Перейдём к практике

На основе коротких кодов покажу работу с компанентой на практике. Примеры буду приводить к Word2000 и выше:

Соединиться с Сервером Word

Тут можно использовать два способа:
1.
Код
...
procedure TForm1.Button1Click(Sender: TObject);
...
WordApplication1.ConnectKind := ckNewInstance;
WordApplication1.Connect;
WordApplication1.AutoQuit := true;
...

2.
Код
...
procedure TForm1.Button1Click(Sender: TObject);
...
WordApplication1.ConnectKind := ckNewInstance;
WordApplication1.AutoConnect:=true;
WordApplication1.AutoQuit := true;
...


с данной компанентой оба работают на ура.

Открыть документ

Код
...
var
 fil:OleVariant;
...
fil:='C:\мои документы\тест.doc';
  WordApplication1.Documents.OpenOld(fil,EmptyParam,EmptyParam,EmptyParam,
                                     EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                     EmptyParam,EmptyParam);
...


Установка параметров страницы (листа)

Код

...
// книжная ориентация
WordApplication1.ActiveDocument.PageSetup.Orientation:=wdOrientPortrait;
// поля
WordApplication1.Selection.PageSetup.LeftMargin:=72.0; //~2.5 см
...


Установка Абзац - интервал

Код

...
D:=wdCollapseEnd;// для перемешения курсора в конец при снятии выделения
// вставляем текст
WordApplication1.Selection.InsertAfter('текст'+#13);
// соединяемся с сервером формата
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
// интервал перед абзацем
WordParagraphFormat1.SpaceBefore:=40;
// интервал после абзаца
WordParagraphFormat1.LineSpacing:=40;
// снимаем выделение
WordApplication1.Selection.Collapse(D);
...


Форматирование текста в документе

Код

...
D:=wdCollapseEnd;// для перемешения курсора в конец при снятии выделения
// вставляем текст
WordApplication1.Selection.InsertAfter('текст'+#13);
// соединяемся с сервером шрифта
WordFont1.ConnectTo(WordApplication1.Selection.Font);
// устанавливаем размер шрифра
WordFont1.Size:=14;
// жирный
WordFont1.Bold:=1;
// курсив
WordFont1.Italic := 1;
// соединяемся с сервером формата
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
//отступ первый (абзац)
WordParagraphFormat1.FirstLineIndent:=35;
// текст по ширине    
WordParagraphFormat1.Alignment := wdAlignParagraphJustify;
// снимаем выделение
WordApplication1.Selection.Collapse(D);
...


Вставить текст после таблицы

Этот участок кода размещаю, т.к. если мы вставим таблицу, то курсор будет находиться в ней. И обычные попытки вставить текст приведут к тому, что он будет вставляться в первую ячейку таблицы.

Здесь тоже существует множество вариантов, приведу один из них. Остальные буду размещать отдельно с припиской, что можно использовать для этого же.

Код

...
Con:=7;
// Перемещяем курсор из таблицы 
WordApplication1.Selection.MoveDown(EmptyParam,Con,EmptyParam);
// вставляем текст
WordApplication1.Selection.InsertAfter('текст '+#13);
// снимаем выделение
WordApplication1.Selection.Collapse(D);
...


где Con : OleVariant; - количество строк в таблице +1;

Добавляем новый параграф

Код

...
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
...


Этот же код можно применять для вставки текса после таблицы.

Работа с Колонтитулом

Код

...
// переходим на нижний колонтитул
WordApplication1.ActiveWindow.ActivePane.View.SeekView:=wdSeekCurrentPageFooter;
// вставляем текст
WordApplication1.Selection.InsertAfter('Текст');
// снимаем выделение
WordApplication1.Selection.Collapse(D);
// переходим с колонтитула на документ
WordApplication1.ActiveWindow.ActivePane.View.SeekView:=wdSeekMainDocument;
...


Колонтитулы бывают верхний/нижний, а также если вставляется новый раздел на новой странице, то можно установить верхний N раздел/нижний N раздел, дополнительная опция - "как в предыдущем разделе". Её можно отключать. Как вставить новую станицу смотрите ниже.

Нарисовать квадрат

Код

...
WordApplication1.ActiveDocument.Shapes.AddShape(1 ,3.3, 788.00, 600.00, 42.10, EmptyParam).Select(EmptyParam);
...


где 788.00 и 3.3 координаты верхнего левого угла;
600.00 и 42.00 ширина и высота соответственно

координаты и остальные параметры не в миллиметрах. Метод для использования сантиметровых параметров приведу ниже.

Форматирование нарисованного квадрата

Код

...
// цвет заливки белый 
WordApplication1.Selection.ShapeRange.Fill.ForeColor.RGB:=$FFFFFF;
// цвет линий белый
WordApplication1.Selection.ShapeRange.Line.ForeColor.RGB:=$FFFFFF;
...


Вставить файл

Код

...
WordApplication1.Selection.InsertFile(Filename,emptyparam,emptyparam,emptyparam, emptyparam);
...


Написать текст по вертикали

текст по вертикали можно сделать только в таблице, ну и т.п.
(по крайней мере у меня ворд по другому не поддерживает...)

итак, делаем таблицу, вставляем текст, прежде чем снять выделение - пишем:

Код

...
// текст по вертикали - снизу вверх
WordApplication1.Selection.Orientation:=wdTextOrientationUpward;
...

или
Код

...
// текст по вертикали - сверху вниз
WordApplication1.Selection.Orientation:=wdTextOrientationDownward;
...


Вставить новую страницу

Код

...
// вставить новую страницу
WordApplication1.Selection.InsertBreak(EmptyParam);
...


Вставить рисунок

Код

...
WordApplication1.Selection.InlineShapes.AddPicture('C:\Documents and Settings\зима.jpg',EmptyParam,EmptyParam,EmptyParam);
...


2,3,4 - параметры отвечают за координаты и размер рисунка

Вставка и Форматирование созданной таблицы

Код

...
// вставляем таблицу
R1:=WordApplication1.Selection.Range;
Tbl :=R1.Tables.Add(R1,6,5,EmptyParam,EmptyParam);
// форматируем таблицу
// первый столбец
Tbl.Columns.Item(1).SetWidth(72,wdAdjustNone);
// второй и т.д.
Tbl.Columns.Item(2).SetWidth(99,wdAdjustNone);
Tbl.Columns.Item(3).SetWidth(112,wdAdjustNone);
Tbl.Columns.Item(4).SetWidth(112,wdAdjustNone);
Tbl.Columns.Item(5).SetWidth(112,wdAdjustNone);
...


по аналогии и со строчками

Выделить всю строку в документе

Код

...
var L, E: OleVariant;
begin
L:=wdLine;
E:=wdExtend;
// в конец строки
WordApplication1.Selection.EndKey(L,E);
// в начало строки
WordApplication1.Selection.HomeKey(L,E);
...



Скопировать выделенное и вставить

Скопировать

Код

...
WordApplication1.Selection.Copy;
...


вставить

Код

...
WordApplication1.Selection.PasteAndFormat(wdPasteDefault);
...


можно ставить EmptyParam

Переместиться в конец текста

Код

...
var L: OleVariant;
begin
L:=wdStory;
// в конец текста
WordApplication1.Selection.EndKey(L,EmptyParam);
...


Этот же код можно применять для вставки текса после таблицы.

Выделить строку в таблице

Код

...
WordApplication1.Selection.SelectRow;
...


можно для выделения в таблице пользоваться командой

Код

...
WordApplication1.Selection.EndKey(L,E);
...


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

Параметры выставлять в сантиметрах

Код

...
WordApplication1.Selection.PageSetup.LeftMargin:=WordApplication1.CentimetersToPoints(1.5);
...


команда выставит левое поле 1,5 см

Межстрочный интервал

Устанавливается:
Код

...
WordParagraphFormat1.LineSpacing:=20.00;
...


Узнать межстрочный интервал:
Код

...
Label1.Caption:=FloatToStrF(WordParagraphFormat1.LineSpacing,ffNumber,5,2);
...


Рисование линии в документе

Линию можно нарисовать:
Код

...
WordApplication1.ActiveDocument.Shapes.AddLine(300.0,300.0,500.0,500.0,EmptyParam);
...

где первые два параметра X,Y - начала линии, вторые два пораметра X,Y - конца линии, последний так и ставьте, обозначает тип линии (пунктир и т.д.)
пример нарисует линию поперёк,
Код

...
WordApplication1.ActiveDocument.Shapes.AddLine(300.0,300.0,300.0,700.0,EmptyParam);
...

этот вертикальную
Код

...
WordApplication1.ActiveDocument.Shapes.AddLine(300.0,300.0,500.0,300.0,EmptyParam);
...

этот горизонтальную
Код

...
WordApplication1.ActiveDocument.Shapes.AddLine(30.0,300.0,580.0,300.0,EmptyParam);
...

и этот тоже, но будет шире.
Также можно устанавливать длину линии. делается это так:
Код

...
var lint:Shape;
.....
lint:=WordApplication1.ActiveDocument.Shapes.AddLine(30.0,300.0,580.0,300.0,EmptyParam);
lint.Width:=500.0;
....

следующая команда определит смещение по оси Y конца линии:
Код

...
var lint:Shape;
.....
lint:=WordApplication1.ActiveDocument.Shapes.AddLine(30.0,300.0,580.0,300.0,EmptyParam);
lint.Height:=10.0;
....

напоминаю, что отсчёт идет от верхнего левого угла

Установить толщину линии можно командой:
Код

...
var lint:Shape;
.....
lint:=WordApplication1.ActiveDocument.Shapes.AddLine(30.0,300.0,580.0,300.0,EmptyParam);
lint.Line.Weight:=5.0;
....


Перейти на нужную страницу

Код

....
var What, Which, Name : OleVariant;
....
What:=wdGoToPage;
Which:=wdGoToNext;
Name:='2';
WordApplication1.Selection.GoTo_(What, Which, EmptyParam, Name);
....

сразу попадаем на страницу '2'...

ещё вариант перехода между страницами
Код

...
WordApplication1.Browser.Next;
...


Количество абзацев в выделенном фрагменте

Код

...
col:=WordApplication1.Selection.Sentences.Count;
...


Количество строк в выделенном фрагменте

Код

... 
StartLine:=WS.Information[wdFirstCharacterLineNumber];
 WS.EndKey(wdStory);
 EndLine:=WS.Information[wdFirstCharacterLineNumber];
 CountLine:=EndLine-StartLine;
...


Повторять первую строку таблицы на каждой странице как заголовок

Код

...
R1:=WordApplication1.Selection.Range;
d:=wdAutoFitContent;
Tbl :=R1.Tables.Add(R1,6,9,EmptyParam,d);
// ответ на вопрос
Тbl.Rows.Item(1).HeadingFormat:=-1;
...


Стиль границ таблицы

В Word 2003 создаваемые таблицы по умолчанию имеют прозрачные границы ячеек. Следовательно если нам нужна не прозрачная, необходимо установить нужный нам стиль. Итак устанавливаем стиль границ таблицы:
Код

...
R1:=WordApplication1.Selection.Range;
Tbl :=R1.Tables.Add(R1,7,9,EmptyParam,d);
// устанавливаем стиль внутренних границ
Tbl.Borders.InsideLineStyle:=wdLineStyleSingle;
// устанавливаем стиль внешних границ
Tbl.Borders.OutsideLineStyle:=wdLineStyleSingle;
...


Автонумерация строк

Код

...
WordApplication1.Selection.Range.ListFormat.ApplyNumberDefault(SaveChanges);
...

можно сразу устанавливать отступ слева для данной функции:
Код

...
WordApplication1.Selection.Range.ListFormat.ListTemplate.ListLevels.Item(1).NumberPosition:=WordApplication1.CentimetersToPoints(0.2);
...


Доступ к таблице в Ворде

Присоединиться к таблице в ворде (если мы не создавали её, но знаем, что она есть):
Код

...
var 
    Tbl: Table;
...
...
tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
...


теперь спокойно работаем с таблицей через переменную tbl

Считать из ячейки таблицы текст:

Код

...
S:=Tbl.Cell(1, 1).Range.Text;
...

S:String или WideString.
По аналогии происходит и занесение текста.

Количество таблиц в документе и количество сток и слобцов

Количество таблиц в документе:
Код

...
col:=WordApplication1.ActiveDocument.Tables.Count;
...

Количество строк и столбцов в таблице:
Код

...
var
  Tbl: Table;
  c,r:integer;
...
Tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
...
// количество строк
r:=tbl.Rows.Count;
// количество солбцов
c:=tbl.Columns.Count;
...


Ещё вариант по работе с таблицей

Мы можем столкнуться с небольшой проблемой, допутим мы хотим записать таблицу в большое количество строк и соответственно работать такое будет долго, как же можно ускорить этот процесс? Во первых заметное в данном случае ускорение мы получим если:
Код
...
WordApplication1.Visible:=true;
...

мы поставим в конце кода, а не в начале.
Во-вторых ускорение будет если за разовое обращение мы будем заносить максимально возможное количество текста:
Код
...
WordApplication1.Selection.InsertAfter(Memo1.Text+#13);
...

но с таблицей на первый взгляд такой вариант не подойдёт, но это только на первый взгляд, т.к. занёсённый текст межно преобразовать в таблицу, к примеру:
Код
...
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    s:WideString;
    separat:String;   // используемый сепаратор как разделитель в тексте по столбцам
    d, separatOV, Column:OleVariant;
begin
// инициализируем нужные переменные
D:=wdCollapseEnd;
Separat:='@'; // нинициализируем сепаратор, допустим символ '@'
separatOV:=separat;
Column:=3;         // инициализируем количество столбцов
s:='';    // обнуляем текстовую переменную

// запускаем ворд
WordApplication1.AutoQuit:=true;
WordApplication1.ConnectKind:=ckNewInstance;
WordApplication1.AutoConnect:=true;
WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);

// теперь записываем в переменную текст
for i:=1 to 20 do
   begin
   // для примера обычный текст, но можно и из БД и других таблиц
   s:=s+'Familia'+separat+'Name'+separat+'Adress'+#13;
   end;
// вставляем текст
WordApplication1.Selection.InsertAfter(s);
// преобразуем в таблицу
WordApplication1.Selection.ConvertToTableOld(separatOV,EmptyParam,Column,EmptyParam,EmptyParam,
                                             EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                             EmptyParam,EmptyParam,EmptyParam,EmptyParam);
// снимаем выделение
WordApplication1.Selection.Collapse(D);
// делаем видимым документ
WordApplication1.Visible:=true;
end;
...


при больших таблицах разница должна быть ощутимая...


Работа с Абзацем (Параграфом)

Код

..
WordApplication1.ActiveDocument.Paragraphs....
...

т.е. количество параграфов будет:
Код

...
col:=WordApplication1.ActiveDocument.Paragraphs.Count;
...

Получить доступ к тексту параграфа:
Код

...
L:=TStringList.Create; 
i:=10;
col:=WordApplication1.ActiveDocument.Paragraphs.Count; 
if i<=col then 
begin 
L.Text:=WordApplication1.ActiveDocument.Paragraphs.Item(i).Range.Text;
...

стоит также отметить, что у :
WordApplication1.ActiveDocument.Paragraphs.
есть полезные методы First, Last - первый и последний абзац соответственно:
Код
...
WordApplication1.ActiveDocument.Paragraphs.First;
...
WordApplication1.ActiveDocument.Paragraphs.Last;
...

теперь немного пояснений:

в строке имеются непечатные символы обозначающие конец абзаца , поэтому когда документ пуст в нем как минимум есть один пустой абзац...
2 (#13#7) символа в таблице, 1 - в обычном тексте (#13), рисунок если вставлен в контейнер "создайте рисунок" идёт как 2 символа (#1#21) и опять же конец абзаца #13, т.е. в абзац можно разместить несколько рисунков или рисунок и текст, тогда полученная строка будет равна : "#1#21ТЕКСТ#13"
таблица представляется в виде нескольких абзацев... приблизительно так:
таблица 2х3

|__абзац__|__абзац__|__абзац__|абзац
|__абзац__|__абзац__|__абзац__|абзац

т.е. последовательность символов #13#7 обозначают конец ячейки, 2 подряд последовательности обозначают конец строки
приблизительно, т.к. в одно ячейке может быть несколько абзацев....

сам ворд если не ошибаюсь абзацы не содержащие текст за обзац не принимает, поэтому если посмотреть статистику, цифры будут отличаться от полученных командой
WordApplication1.ActiveDocument.Paragraphs.Count;

колонтитулы за обзац не принимаются.
Рисунок не вставленный в контейнер "создайте рисунок" как абзац не идет...

Печать документа

Код
...
var
Dok: OleVariant;
...
Dok:=WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...
Dok.PrintOut;
...


Сохранить как с помощь встроенного в Word диалога

Всё таки я Вас немного обманул... С диалогами я тоже попробовал поработать. Просто это было давно и я забыл. Но вот вдруг код нашёл:
Код
...
var dial : OleVariant;
...
dial:= wdDialogFileSaveAs;
WordApplication1.Dialogs.Item(dial).Show(EmptyParam);
...


Отключить проверку синтаксиса и грамматики

Код
...
// Синтаксис
WordApplication1.Options.CheckSpellingAsYuoType:=False;
// Грамматика
WordApplication1.Options.CheckGrammarAsYuoType:=False;
...


Поиск и замена в документе

Можно пользоваться поиском и заменой имеющимися в Ворде, можно воспользоваться и имеющимися стандартными диалогами, описанными выше, рассмотрим первый вариант:
Код
...
var Templ,d,dd,ddd:OleVariant;
     Famil:string;
...
Templ:='<ФИО>'; // текст который меняем
D:=wdFindStop ;  // найти один раз
DD:=wdReplaceOne ;   // замена один раз
DDD:=Famil;    // фамилия
WordApplication1.Selection.Find.Execute(Templ,EmptyParam,EmptyParam,EmptyParam,
                                        EmptyParam,EmptyParam,EmptyParam,D,EmptyParam,
                                        DDD,DD,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...

соответственно если курсор находится после заменяемого текста, то его желательно переместить в начало... т.е. допустим у Вас в документе:
Цитата

Эксперт: <ФИО>
Контракт: <Номер>

Эксперт: <ФИО>
Контракт: <Номер>

Эксперт: <ФИО>
Контракт: <Номер>

Эксперт: <ФИО>
Контракт: <Номер>

Эксперт: <ФИО>
Контракт: <Номер>

и Вам необходимо сделать несколько замен последовательно, то это должно выглядить так:
Код
...
var Templ,d,dd,ddd:OleVariant;
     Famil:string;
...
// переходим в начало документа
D:=wdStory;
WordApplication1.Selection.HomeKey(D,EmptyParam);
//теперь делаем замены, допустим так:
Templ:='<ФИО>'; // текст который меняем
D:=wdFindStop ;  // найти один раз
DD:=wdReplaceOne ;   // замена один раз
DDD:=Famil;    // фамилия
WordApplication1.Selection.Find.Execute(Templ,EmptyParam,EmptyParam,EmptyParam,
                                        EmptyParam,EmptyParam,EmptyParam,D,EmptyParam,
                                        DDD,DD,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...
DDD:=Famil;    // фамилия
WordApplication1.Selection.Find.Execute(Templ,EmptyParam,EmptyParam,EmptyParam,
                                        EmptyParam,EmptyParam,EmptyParam,D,EmptyParam,
                                        DDD,DD,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...
...


Продолжение следует....
СУВ. Albinos_x

Это сообщение отредактировал(а) Albinos_x - 26.3.2006, 00:16


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
YurikGL
Дата 20.2.2006, 20:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: 2
Всего: 2



Добавлю немного....


Есть два замечательных способа добывать информацию об интерфейсе Word.

1) Для того чтобы узнать, как что-то сделать из Delphi в Word-e надо в Word-е зайти в меню Сервис/Макрос/Начать запись... Потом сделать в Word-e то, что надо сделать из Delphi и закончить запись макроса. И наконец Сервис/Макрос/Макросы...выбираем записанный...Изменить и смотрим, как он устроен. После этого первод синтаксиса VBA в синтаксис Delphi осуществляется просто и непринужденно.

2) Еще одним хорошим инструментом получения знаний являются компоненты типа TWordApplication. Кидаем его на форму, в любом операторе набираем WordApplication1., нажимаем ctrl+пробел и внимательно читаем. Смысл доступных функций и свойств обычно понятен интуитивно.

Есть, еще один, как мне сказали, наиболее логичный способ – справка VBA, но что-то не довелось мне ею пользоваться…

....
У документа есть свои коллекции:
1) буквы (characters)
Код
w1.ActiveDocument.Characters// так можно получить доступ к коллекции букв активного документа 

Теперь можно получить доступ к
Код
w1.ActiveDocument.Characters.items(vr)…- конкретной букве//vr:olevariant
w1.ActiveDocument.Characters.count… - количеству букв

2)таблицы
Код
W1.activedocument.tables

вот так
Код
W1.ActiveDocument.Tables.Item(W1.ActiveDocument.Tables.Count).Columns.Item(2).Select;

можно выбрать вторую колонку последней таблицы.

3) абзацы
Код
w1.ActiveDocument.Paragraphs

4) фигуры
Код
W1.ActiveDocument.Shapes


ну и т.д.

Еще есть полезные объекты selection – выбранная область и range – диапазон (selection, кстати, типа range со всеми вытекающими полезностями), а так-же функция select – выбрать. Выбрать можно таблицу, колонку (как пример
Код
W1.ActiveDocument.Tables.Item(W1.ActiveDocument.Tables.Count).Columns.Item(2).Select 
)
букву, диапазон, абзац и т.д…


Кстати, очень часто приходится работать с объектом range. Так, например, чтобы вытащить текст из документа, можно написать
Код
st:=w1.ActiveDocument.Range(1,5).Text; // Это будет текст с 1-го по 5-й символ.
st:=W1.ActiveDocument.Paragraphs.Item(1).Range.Text;// это будет текст первого абзаца текущего документа.

У объекта range есть свойства Start - номер начального символа и End_ - номер конечного символа. Эти свойства используются для определения границ различных объектов.

Существует два основных способа формирования документа:
1) Без использования шаблона.
Создается новый документ, где создаются колонтитулы надписи и т.д.
Этот путь использовать не стоит т.к. на разных компьютерах могут изначально стоять разные настройки страницы, шрифтов, абзацев и красиво сформированный документ у Вас на компьютере может ужасно выглядеть на другом. Можно, конечно, программно выставлять все необходимые настройки, но, во-первых, всего не учтешь, во-вторых это – большие тормоза и много кода.

2)С использованием шаблона.
Суть состоит в том, что заранее создается вордовский документ, который используется как шаблон. В нем в нужных местах стоят объекты типа "надпись" с заранее известными именами, закладки и прочие элементы, которые будут точками отсчета для вставляемого текста.

Очень удобным, при создании шаблона, является использование закладок.
В качестве примера - выберем текст между концом первой и концом второй закладок.
Код
vr1,vr2,vr3,vr4:OleVariant;
vr1:=1;
vr2:=2;
vr3:=W1.ActiveDocument.Bookmarks.Item(vr1).End_;
vr4:=W1.ActiveDocument.Bookmarks.Item(vr2).End_;
W1.ActiveDocument.Range(vr3,vr4).Select;


Замечу, что W1.ActiveDocument.Bookmarks.Item(vr1) является объектом range и свойство End_ является номером конечного символа закладки.

И еще небольшой совет: Если вы подсоединились к Word-у, - вовремя отсоединитесь. Т.е. крайне не желательно оставлять подсоединенный word с которым в это время манипулирует пользователь. Подключились, сделали свое дело, и отключились...

Это сообщение отредактировал(а) YurikGL - 20.2.2006, 20:42
--------------------
 
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 20.2.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Корректно закрыть программу работающую с документом

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

Вот и я однажды столкнулся с данной проблемой. Мурыжили мы этот вопрос несколько дней на форуме. И вот конечный результат к которому я пришёл:

Код

...
var
 Form1: TForm1;
 OpenDoc:boolean = false;
...
// при создании (соединении с) документа(том)
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
OpenDoc:=true;
...
// у компонента WordDocument1 есть событие отвечающее за отлов закрытия документа
procedure TForm1.WordDocument1Close(Sender: TObject);
begin
OpenDoc:=false;
WordDocument1.Disconnect;
WordApplication1.Disconnect;
end;

// При закрытии программы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var s :string;
SaveChanges, templ : olevariant;
begin
if OpenDoc then
begin
s:=ExtractFilePath(Application.ExeName)+'Temp\Отчёт  '+ DateToStr(DateTimePicker1.Date);
while (FileExists(s+'.doc')) do
begin
Application.ProcessMessages;
s:=s+' Copy';
end;
Templ:=s+'.doc';
// если не сохранен, то
if WordApplication1.ActiveDocument.Saved=false then
// сохраняем
begin
WordApplication1.ActiveDocument.SaveAs(Templ, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam);
end;
SaveChanges:=false;
WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
end;
end;
...


Можно ещё сделать запрос на сохранение документа.

PS: Прошу сразу прощения, что примеры не сгруппированы...

Добавлено @ 20:48
Также стоит отметить, что все массивы и таблицы имеют отчисление в Word-е не от 0, а от 1...

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

Если работать через :
Код
...
CreateOleObject( 'Word.Application' ) ;
...


то некоторые варианты для него не проходят, к примеру:
Перейти на нужную страницу
Код

....
var What, Which, Name : OleVariant;
....
What:=wdGoToPage;
Which:=wdGoToNext;
Name:='2';
WordApplication1.Selection.GoTo_(What, Which, EmptyParam, Name);
....

в данном случае это нужно делать через второй способ:
Код

...
WordApplication1.Browser.Next;
...


Продолжение следует....

------------------------------------------------------------
YurikGL,
Некоторые вопросы повторил, но всё равно СПАСИБО!!! smile


СУВ. Albinos_x

Это сообщение отредактировал(а) Albinos_x - 20.2.2006, 21:47


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 20.2.2006, 20:59 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 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, кроме цифр и запятых не мог занести. Пишем обработчик нажатия на клавишу:
Код

...
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',',',#8]) then  // #8 - символ клавиши BackSpace (<-)
  key:=#0;
end;
...

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

теперь пишем обработчик нажатия на кнопку:
Код

...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  Tbl: Table;
  fil:OleVariant;
  List:TStringList;
  col:integer; // количество считываемых столбцов
  c,r:integer; // количество столбцов и сток в таблице
  i,j,n : word;
  s:string;
begin
if OpenDialog1.Execute then
  begin
  // открываем документ
  fil:=OpenDialog1.FileName;
  WordApplication1.Documents.OpenOld(fil,EmptyParam,EmptyParam,EmptyParam,
                                     EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                     EmptyParam,EmptyParam);
  // чтобы не мешался делаем его невидимым
  WordApplication1.Visible:=false;
  // если есть таблицы
  if WordApplication1.ActiveDocument.Tables.Count>0 then
     begin
     if Edit1.Text='' then
        begin
        MessageDlg('Не введены столбцы',mtError,[mbOk],0);
        WordApplication1.Quit;
        Exit;
        end;
     // создаём список столбцов
     List:=TStringList.Create;
     List.Delimiter:=',';
     List.DelimitedText:=Edit1.Text;
     col:=List.Count;
     // для примера берём только первую таблицу
     Tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
     r:=tbl.Rows.Count;
     c:=tbl.Columns.Count;
     // выставляем количество столцов и сток
     StringGrid1.RowCount:=r+1;
     StringGrid1.ColCount:=col+1;
     // открываем цыкл по количеству читаемых столбцов
     for i:=0 to (col-1) do
        begin
        // если пользователь поставил две и больше запятые
        // то строки будут пустыми и возникнет ошибка
        // обходим это
        if (List.Strings[i]='') then continue;
        // получаем номер столбца
        n:=strtoint(List.Strings[i]);
        // в ворде отчёт от 1 поэтому проверяем
        // и если номер введённого столбца больше чем в таблице
        if (n=0) or (n>c) then continue;
        // цыкл по количеству строк
        for j:=1 to r do
           begin
           // читаем в строку
           s:=Tbl.Cell(j,n).Range.Text;
           // удаляем лишние символы
           // т.к. в полученной строке Ворд передал не печатные символы типа #13
           // Но при таком удалении если в ячейке несколько строк,
           // то мы получим только первую
           // но для примера подойдёт и такой вариант
           Delete(s,pos(#13,s),Length(s));
           // заносим в столбец StringGrid1
           StringGrid1.Cells[i+1,j]:=s;
           // если документ большой
           // то делаем чтоб приложение не "повисало"
           Application.ProcessMessages;
           end;
        end;
     // закрываем документ   //
     WordApplication1.Quit;
     // освобождаем память
     List.Free;
     end
     else
     MessageDlg('В этом документе таблиц нет',mtError,[mbOK],0);
  end;
end;
...

как видите, всё просто.
Думаю Вопросов не возникнет, тем более, что почти каждая строчка закомментирована.
Прикрепляю архив с примером
test.zip [268 Kb]


Удачи!!!
СУВ. Albinos_x

Это сообщение отредактировал(а) Girder - 20.2.2006, 22:04


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 21.2.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 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
Код
...
ExcelApplication1.Workbooks.Add(EmptyParam,lcid);
...

В первый параметр этого метода можно передать строку, содержащую имя файла книги.
lcid - идентификатор локализации, в основном равен 0, но целесообразней передавать значения предназначенных для этого констант:
LOCALE_USER_DEFAULT и LOCALE_SYSTEM_DEFAULT - идентификаторы текущего пользователя и системы соответственно. Это же касается и свойства Visible, который тоже требует этот идентификатор:
Код
...
ExcelApplication1.Visible[lcid]:=true; 
...

Книга создаётся с числом листов установленных по умолчанию, но эту переменную мы можем поменять, для этого есть свойство 
SheetsInNewWorkbook :
Код
...
ExcelApplication1.SheetsInNewWorkbook[lcid]:=1;
...


Добавить новый лист в существующую книгу можно методом Add объекта Workbook:
Код
...
ExcelApplication1.Worksheets.Add(Before,after,count,type_,lcid);
...

Before,after - объекты листа после которого и перед которым осуществляется вставка, обычно достаточно задать один параметр.
count - определяет количество вставляемых листов
type_ - тип вставки, при EmptyParam пустой, новый лист

Удаляет лист метод Delete

Код
...
ExcelWorksheet1.Delete(lcid);
...


для доступа к нескольким открытым книгам есть Workbooks, представляющая из себя массив открытых книг(Workbook). Следовательно мы можем активировать или обратиться к нужной нам книге 
Код
...
i:=5;
ExcelWorkbook1:=ExcelApplication1.Workbooks[i];
ExcelWorkbook1.Activate(lcid);
...


Для определения количества открытых книг, у Workbooks существует свойство только для чтения Count
Для доступа к активной книге есть ActiveWorkbook.

Для сохранения книги существует несколько методов - это Save и SaveAs:
Код
...
i:=5;
ExcelApplication1.Workbooks[i].Save(lcid);
...

метод же 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:
Всех:
Код
...
ExcelApplication1.Workbooks.Close(lsid);
...

для закрытия конкретной книги:
Код
...
ExcelApplication1.Workbooks[i].Close(SaveChanges,EmptyParam,EmptyParam,lcid);  
...

первый параметр определяет сохранять ли изменения, если True - значит сохранять, во втором параметре указывается имя файла в который необходимо сохранять изменения, если SaveChanges:=True и второй не указан, то появится диалог сохранения файла. Если вместо SaveChanges поставить EmptyParam, то пользователя спросят, нужно ли сохранить изменения. Хотя я слышал, что бывает, что срабатывает SaveChanges:=EmptyParam и SaveChanges:=false одинаково, и оба спрашивают, нужно ли сохранять изменения. Третий параметр используется, когда книга предназначена для пересылки какому-то адресату.

Контроль версий можно производить так же как и с Вордом:
Код
...
if (StrToInt(Copy(ExcelApplication1.Version,1,pos('.',ExcelApplication1.Version)-1)))<9 then
...


Работа с ячейками происходит через объект Range. При чём этому объекту можно насначить не только одну ячейку но и несколько. Что очень удобно когда нужно занести множество значений и не в одну ячейку. К тому же это произойдёт быстрее, т.к. соответственно обращений к серверу будет всего одно вместо несколький. Так же и через этот объект можно форматировать содержащийся в ячейках текст с помощью свойства  Font.

Как и Word мы здесь можем встретить Dialogs через который мы можем вызвать встроенный диалог в Excel:
Код

...    
ExcelApplication1.Dialogs[xlDialogOpen];    
...

перезаваемые значения могут быть:
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

Код
...
ExcelApplication1.ActiveWorkBook.PrintOut(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,LOCALE_USER_DEFAULT)
...



Продолжение следует...
СУВ. Albinos_x   

Это сообщение отредактировал(а) Albinos_x - 24.5.2006, 21:11


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 21.2.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



 Перейдём к практике

К моему расстройству, по сравнению с WordApplication, полноценно работать через ExcelApplication нельзя, тут нужно применять и ExcelWorksheet и ExcelWorkbook.

На основе коротких кодов покажу работу с компанентой на практике. Примеры буду приводить к Excel2000 и выше:

Открыть Excel и присоединиться к нему

Код

 ...
icid:=LOCALE_SYSTEM_DEFAULT;
ExcelApplication1.ConnectKind:=ckNewInstance;
ExcelApplication1.AutoQuit:=true;
// делаем видимым Excel
ExcelApplication1.Visible[icid]:=true;
ExcelApplication1.AutoConnect:=true;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,icid));
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.ActiveSheet as ExcelWorkSheet);
...


Открыть для редактирования документ Excel

Существует множество способов:
1.
Код
...
ExcelApplication1.ConnectKind:=ckNewInstance;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.AutoConnect:=true;
ExcelApplication1.AutoQuit:=true;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Open(getcurrentdir+'\Report.xls'));
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkBook.ActiveSheet as ExcelWorksheet);
ExcelApplication1.ActiveWorkbook.ActiveSheet;
...

2.
Код

...
// запускаем Excel    
ExcelApplication1.AutoConnect:=true;    
// открываем книгу    
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam));    
// соединяемся с книгой    
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);    
// делаем видимым Excel    
ExcelApplication1.Visible[0]:=true;
...

3. С помощью функции описанной Akella
Цитата(Akella @  11.5.2005,  09:05 Найти цитируемый пост)
Open(Filename,UpdateLinks,ReadOnly,Format,Password,WriteResPassword,IgnoreReadOnlyRecomended,Origin,Delimiter,Editable,Notify,Converter,AddToMRU);

Filename - String - Имя файла
UpdateLinks - Integer - Режим обновления ссылок в рабочей книге
ReadOnly - Boolean - открыть только для чтения
Format - Integer - формат открытия текстовых файлов
Password - String - Пароль
WriteResPassword - String - Пароль для сохранения изменений
IgnoreReadOnlyRecomended -Boolean- отключение сообщения только для чтения
Origin - Ineger - кодировка для открываемого текстового файла
Delimiter - Integer - код симбола-разделителя колонок для открываемого текстового файла
Editable - Boolean - доп. режим при открытии Excel-файлов более ранных версий, чем версия 5.0
Notify - Boolean - Если была попытка открыть файл в режиме чтение/запись, но в этот момент это было невозможно, то при значении True этого аргумента приложение получит уведомление когда файл станен доступен. Если False или значение опущено, и файл занят, то попытки открыть его для чтения/обречены на неудачу.
Converter - Integer - индекс конвертора, используемого при открытии файла
AddToMRU Boolean - добавить имя файла в список недавно открытых в меню "Файл"


4. 
Код
...
Fil:='C:\Report.xls';    
ExcelApplication1.Workbooks.Add(fil,lcid);    
...


Форматируем ячейки и текст в них

Код

...
// Горизонтальное выравнивание по центру
ExcelApplication1.Range['A1','D1'].HorizontalAlignment := xlCenter;
// Вертикальное выравнивание по центру
ExcelApplication1.Range['A1','D1'].VerticalAlignment:=xlCenter;
// сетка таблицы
ExcelApplication1.Range['A1','D1'].Borders.LineStyle:=xlContinuous;
// перенос текста в ячейках по словам
ExcelApplication1.Range['A1','D1'].WrapText:=true;
// стиль шрифта в ячейке жирный
ExcelApplication1.Range['A1','D1'].Font.Bold:=true;
// заливка ячеек жёлтым цветом
ExcelApplication1.Range['A1','D1'].Interior.ColorIndex:=36;
...


Объединить ячейки

Код

...
ExcelApplication1.Range['A1','A3'].MergeCells:=True;
...


Занести текст в ячейку

Код

...
ExcelApplication1.Range['C1',EmptyParam].Value2:='Hello!';
...


Выставить ширину столбца и высоту строки

Выставляем ширину столбцов:
Код

...
ExcelApplication1.Range['A1',E1'].Columns.ColumnWidth:=12;
...

ширина выставится для первых пяти столбцов

Выставляем высоту строчек:
Код

...
ExcelApplication1.Range['A1','A5'].Rows.RowHeight:=24;
...

первые 5 строчек будут шириной 24

Копировать лист

копировать лист в туже книгу:
Код

...
var ran : OleVariant;
...
ran:=ExcelWorkbook1.ActiveSheet;
ExcelApplication1.Sheets.Copy(ran,EmptyParam,0);
...

в новую книгу:
Код

...
ExcelApplication1.Sheets.Copy(EmptyParam,EmptyParam,0);
...


Вставить картинку

Код

...
ExcelWorksheet1.Shapes.AddPicture('C:\Documents and Settings\1.bmp',1,1,10,40,30,50);
...


здесь:
10 - отступ слева
40 - отступ сверху
30 - ширина
50 - высота

Количество строк и столбцов

Тут тоже существует несколько вариантов:

1.
Код

...
ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// количество строк и столбцов
Caption:='Строк: '+inttostr(ExcelApplication1.ActiveCell.Row)+' Столбцов: '+ inttostr(ExcelApplication1.ActiveCell.Column);
...

2. 
Код

...
// Количество столбцов
caption:=inttostr(ExcelWorksheet1.UsedRange[0].Columns.Count );
...

Со строками по аналогии

Работа с сеткой таблицы

Код

...
ExcelApplication1.Range['A1','H11'].Borders.Weight:=xlMedium;
ExcelApplication1.Range['A1','H11'].Borders.Item[xlEdgeBottom].LineStyle:=xlContinuous;
ExcelApplication1.Range['A1','H11'].Borders.Item[xlEdgeLeft].LineStyle:=xlNone;
ExcelApplication1.Range['A1','H11'].Borders.Item[xlEdgeTop].LineStyle:=xlNone;
ExcelApplication1.Range['A1','H11'].Borders.Item[xlEdgeRight].LineStyle:=xlNone;
...

Отобразится толстая нижняя граница ячеек . 

PS: если мы ограничимся только первой и второй строчкой, то все границы отобразятся толстой линией

Выставить Ориентацию листа

Код

...
ExcelWorksheet1.PageSetup.Orientation:=xlLandscape;
...

данный вариант установит ориентацию - Альбомная

Задать имя листа

Код

...
ExcelWorksheet1.Name:='Отчёт';
...

Имя листа будет не как по умолчанию, допустим  - Лист1, а Отчёт

 Установить формат ячейки

Код

...
// Формат ячейки текстовый
ExcelApplication1.Range['A1',EmptyParam].NumberFormat:='@';
...
// формат ячейки время в формате HH:mm
ExcelApplication1.Range['A5',EmptyParam].NumberFormat:='h:mm;@';
...


точно также можно и прочитать формат ячейки

Работа с коллекцией в Excel

Добавить элемент коллекции просто, принцип такой же как в ворде. покажу несколько примеров:
нарисовать линию:
Код
...
ExcelWorksheet1.Shapes.AddLine(70,150,120,160);
...

первые два параметра X,Y начала линии вторые два - конца.
нарисовать прямоугольник:
Код
...
ExcelWorksheet1.Shapes.AddShape(1,100,150,200,350);
...

второй и третий параметры - X,Y левого верхнего угла прямоугольника, следом два - правого нижнего.
первый параметр тип элемента коллекции:
1 - прямоугольник
2 -  парралелограм
3 -  трапеция
4 - ромб
5 - скруглённый прямоугольник
6 - восьмиугольник
и т.д.... можно посмотреть порядок открыв Excel - автофигуры - основные фигуры

все эти функции возращают элемент типа Shape, т.е. можно сделать так:
Код
...
var Sh:Shape;
begin
Sh:=ExcelWorksheet1.Shapes.AddLine(70,150,120,160);
// далее работаем с Sh
// допустим
Sh.Name:='MyLine'
...

тоже можно проделать и с OleVariant:
Код
...
var Sh:OleVariant;
begin
Sh:=ExcelWorksheet1.Shapes.AddLine(70,150,120,160);
// далее работаем с Sh
// допустим
Sh.Name:='MyLine'
...



Принцип же работы с элементами коллекции, также такой же как ворде (ещё немного похож на работу с таблицами в ворде).... т.е. сначало узнаём общее количество элементов коллекции на листе:
 
Код

var col:integer;
...
begin
col:=ExcelWorksheet1.Shapes.Count;

далее если они имеются, т.е. col<>0 выполняем нужные операции:
Код

var col:integer;
     i:integer
...
...
col:=ExcelWorksheet1.Shapes.Count;
if col<>0 then
   begin
   // перебираем коллекцию
   for i:=1 to col do
      begin
      // проверяем наша линия ли и вообще линия ли
      if ExcelWorksheet1.Shapes.Item(i).Name='Line 2' then
          begin
          // выполняем необходимые операции
          // выставляем позицию слева
          ExcelWorksheet1.Shapes.Item(i).Left:=158.25;  // по аналогии и с другими параметрами
          end;      
      end;
   end;
...

линия возращает name = Line через пробел идёт номер по порядку создания элементов коллекции, т.е. если первый прямоугольник, то у него будет имя = Rectangle 1, имя линии идущей следом будет = Line 2. Это если имена по умолчанию, т.к. имя можно и задать:
Код
...
ExcelWorksheet1.Shapes.Item(1).Name:='55555' ;
...

если хотим параметры выставлять в сантименрах, то это делается по аналогии с вордом:
Код
...
// позиция слева 2,5 см
ExcelWorksheet1.Shapes.Item(1).Left:=ExcelApplication1.CentimetersToPoints(2.5);
...


Продолжение следует...
СУВ. Albinos_x   

Это сообщение отредактировал(а) Albinos_x - 1.6.2006, 00:41


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 21.2.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Работа с группами ячеек и организация адресации по столбцам

Наверно всем известно, что "координатная сетка" Excel состоит из букв (столбцы) и цифр(строки):

Код

...
ExcelWorksheet1.Range['A1',EmptyParam];
...


Итак, как я в теории писал, можно обращаться к группе ячеек:

Код

...
var MyRange,V:OleVariant;
...
MyRange:=ExcelWorksheet1.Range['A2','C4'];
V:=VarArrayCreate([0,2,0,2], varVariant);
V[0,0]:=4;
V[0,1]:=6;
V[0,2]:=1;
V[1,0]:=8;
V[1,1]:=9;
V[1,2]:=0;
V[2,0]:=5;
V[2,1]:=7;
V[2,2]:=3;
MyRange.Value:=V;
...


Но что если, нам надо обращаться к столбцам по номерам и предыдущий вариант нам в силу некоторых обстаятельствм не подходит. Возникает вопрос... а как же нам организовать адресацию по буквам... в принципе понятно :
Код

...
s:=char(ord('A')+num);
...

где num - номер столбца от 0....
но... есть одно НО... это будет работать пока Num не будет больше 25, т.е. в сумме получится 'Z'... это значит, что это работает при первых 26 столбцах... можно конечно сделать простейший обработчик ещё на 26 столбцов:
Код

...
s:=char(ord('A')+num);
If ord(s[1])>ord('Z') then
s:='A'+char(ord('A')+(num mod 26)-1);
...

но... опять это НО... это работает, но только на первых 52... хорошо, если мы знаем, что больше у нас и не будет... а если мы знаем, что может получиться и больше столбцов?... как же нам сделать, чтобы адресация была как в екселе, т.е. сначала 'A', потом 'AA', потом 'BA' и т.д.... выявим последовательность...
первый набор букв будет равен

Код

num mod 26


второй

Код

(num div 26) mod 26


третий

Код

((num div 26) div 26) mod 26


и т.д.
но если мы будем получать буквы в данной последовательности, то мы получим строку наоборот... но это уже не проблема....
Итак, функция:

Код

...
// организую адресацию по столбцам в Excel
function AddresColExcel(const Num:word):string;
var len, N:word;
ch:string;
begin
N:=Num;
ch:=char(ord('A')+(Num mod 26));
N:=N div 26;
while N<>0 do
begin
len:=Length(ch)+1;
SetLength(ch,Len);
ch[len]:=char(ord('A')+(N mod 26)-1);
N:=N div 26;
end;
len:=Length(ch);
SetLength(Result,len);
for n:=1 to len do
Result[n]:=ch[len+1-n];
end;
...


или так:

Код

...
// организую адресацию по столбцам в Excel
function AddresColExcel(const Num:word):string;
var N:word;
ch:string;
begin
N:=Num;
ch:=char(ord('A')+(Num mod 26));
N:=N div 26;
while N<>0 do
begin
ch:=char(ord('A')+(N mod 26)-1)+ch;
N:=N div 26;
end;
Result:=ch;
end;
...


Num как входной параметр является номером столбца от 0.

помните что в ширину Excel позволяет разместить только 255 столбцов

Продолжение следует....
СУВ. Albinos_x



Добавлено @ 17:26

покажу пример как считать из Excel и занести в таблицу:

следующий код считывает из ячейки А1 и записывает в ячейку [1,1] Table: TStringGrid:

Код

... 
uses 
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
 Dialogs, StdCtrls, ExcelXP, OleServer, Grids; 
type 
 TForm1 = class(TForm) 
   ExcelApplication1: TExcelApplication; 
   ExcelWorksheet1: TExcelWorksheet; 
   ExcelWorkbook1: TExcelWorkbook; 
   OpenDialog1: TOpenDialog; 
   Button1: TButton; 
   Table: TStringGrid; 
   procedure Button1Click(Sender: TObject); 
 private 
   { Private declarations } 
 public 
   { Public declarations } 
 end; 
var 
 Form1: TForm1; 
implementation 
{$R *.dfm} 
procedure TForm1.Button1Click(Sender: TObject); 
var V:OleVariant; 
begin 
if OpenDialog1.Execute then 
  begin 
  // запускаем Excel 
  ExcelApplication1.AutoConnect:=true; 
  // открываем книгу 
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam)); 
  // соединяемся с книгой 
  ExcelApplication1.ConnectTo(ExcelWorkbook1.Application); 
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet); 
  // делаем видимым Excel 
  ExcelApplication1.Visible[0]:=true; 
  // считываем ячейку 
  v:=ExcelWorksheet1.Range['A1',EmptyParam]; 
  // записываем в таблицу 
  Table.Cells[1,1]:=V; 
  // выходим из Excel 
  ExcelApplication1.Quit; 
  end; 
end; 
...


теперь если надо записывать в БД :
Код

...
procedure TForm1.Button1Click(Sender: TObject); 
var V:OleVariant; 
begin 
if OpenDialog1.Execute then 
  begin 
  // запускаем Excel 
  ExcelApplication1.AutoConnect:=true; 
  // открываем книгу 
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam)); 
  // соединяемся с книгой 
  ExcelApplication1.ConnectTo(ExcelWorkbook1.Application); 
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet); 
  // делаем видимым Excel 
  ExcelApplication1.Visible[0]:=true; 
  // считываем ячейку 
  v:=ExcelWorksheet1.Range['A1',EmptyParam]; 
  // записываем в таблицу 
  Table1.Append;                                       //здесь наши изменения. первая команда добавляет запись в БД 
  Table1.FieldByName('Pole1').AsString:=v; //  вторая записывает данные 
  Table1.Post;                                            //    третьей сохраняем изменения 
  // выходим из Excel 
  ExcelApplication1.Quit; 
  end; 
end; 
...


если количество сток не известно, то :
Код

... 
procedure TForm1.Button1Click(Sender: TObject); 
var V:OleVariant; 
    row, i:integer: 
begin 
if OpenDialog1.Execute then 
  begin 
  // запускаем Excel 
  ExcelApplication1.AutoConnect:=true; 
  // открываем книгу 
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam)); 
  // соединяемся с книгой 
  ExcelApplication1.ConnectTo(ExcelWorkbook1.Application); 
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet); 
  // делаем видимым Excel 
  ExcelApplication1.Visible[0]:=true; 
  ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 
  row:=ExcelApplication1.ActiveCell.Row; 
 // от 2 т.к. предпологаю, что первая является заголовком 
  for i:=2 to row do 
     begin 
     // считываем ячейку 
     v:=ExcelWorksheet1.Range['A'+inttostr(i),EmptyParam]; 
     // записываем в таблицу 
     Table1.Append;                                               //    добавляеь запись в БД 
     Table1.FieldByName('Pole1').AsString:=v;           //     записываем данные 
     Table1.Post;                                                     //    сохраняем изменения 
     // чтоб приложение не "повисало" 
     Application.ProgresMessages; 
     end; 
  // выходим из Excel 
  ExcelApplication1.Quit; 
  end; 
end; 
...


последний код прочитает и занесёт в БД из первого столбца Excel


Удачи!!!
СУВ. Albinos_x

Это сообщение отредактировал(а) Albinos_x - 5.3.2006, 05:59


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Foley
Дата 22.2.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



Статья очень полезная и интересная, но вот что у меня получилось (посмотрите код):
Код

var LoadFileS, IntVal: string;
begin
IntVal:=ExtractFilePatch(ParamSrtr(0));
LoadFileS:=IntVal+'\recept.xls';
dm.T_receptDATAVIPISKI.Value:=DateToStr(DateTimePicker1.Date);
ExcelApplication1.ConnectKind:=ckRunningOrNew;
ExcelApplication1.AutoConnect:=true;
ExcelApplication1.AutoQuit:=true;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(LoadFileS,0));
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkBook.ActiveSheet as ExcelWorksheet);
ExcelApplication1.ActiveWorkbook.ActiveSheet;
ExcelApplication1.application.Range['E15',EmptyParam].Value2:=dm.T_receptKODMKB10.AsString;
ExcelApplication1.application.Range['G19',EmptyParam].Value2:=dm.T_receptDATAVIPISKI.AsString;
ExcelApplication1.application.Range['H21',EmptyParam].Value2:=dm.T_receptFAM.AsString+'   '+dm.T_receptIMA.AsString+'   '+dm.T_receptOTCH.AsString;
ExcelApplication1.application.Range['AB21',EmptyParam].Value2:=dm.T_receptDR.AsString;
ExcelApplication1.application.Range['F23',EmptyParam].Value2:=dm.T_receptPOLISOMS.AsString;
ExcelApplication1.application.Range['G25',EmptyParam].Value2:=dm.T_receptVRACH.AsString;
ExcelApplication1.application.Range['H28',EmptyParam].Value2:=dm.T_receptNAIMSR.AsString;
ExcelApplication1.application.Range['U28',EmptyParam].Value2:=dm.T_receptDOZA.AsString;
ExcelApplication1.application.Range['AA28',EmptyParam].Value2:=dm.T_receptVIPKOLVOED.AsString;
ExcelApplication1.application.Range['H30',EmptyParam].Value2:=dm.T_receptSPPRIM.AsString;
ExcelApplication1.application.Range['A31',EmptyParam].Value2:=dm.T_receptKODVRACH.AsString;
if dm.T_receptTIP.Value='Детский' then ExcelApplication1.Application.Range['K15','K15'].Font.bold:=true;
if dm.T_receptTIP.Value='Детский' then ExcelApplication1.Application.Range['K15','K15'].Font.underline:=true;

if dm.T_receptTIP.Value='Взрослый' then ExcelApplication1.Application.Range['K16','K16'].Font.bold:=true;
if dm.T_receptTIP.Value='Взрослый' then ExcelApplication1.Application.Range['K16','K16'].Font.underline:=true;

if dm.T_receptSROKDEISTV.Value=true then ExcelApplication1.Application.Range['H35',EmptyParam].Value2:='Действительно в течение 10 дней';
if dm.T_receptSROKDEISTV.Value=false then v.Application.Range['H35',EmptyParam].Value2:='Действительно в течение 2 месяцев';

и выдает ошибку про variant, точно не помню (тут у меня нету проекта), дело в том что при объявлении v: OleVariant, и использовании его вместо ExcelApplication все работало нормально, но были проблемы с сохранением, щас вроде все нормально, но может такая ошибка быть из-за того что у меня офис 2003, а в дельфе используется ХР? если да, то где можно взять компоненты для 2003?
PM MAIL ICQ   Вверх
Albinos_x
Дата 22.2.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Foley @ 22.2.2006, 13:50 Найти цитируемый пост)
но может такая ошибка быть из-за того что у меня офис 2003, а в дельфе используется ХР

нет...
Просто когда работаешь с через OleVariant, то тут есть некоторые отличия от работы через ExcelApplication, я отмечал это по работе с WordApplication (4 сообщение в этом топике), то же и для ExcelApplication
Цитата(Albinos_x @ 20.2.2006, 20:38 Найти цитируемый пост)
Если работать через :
Код
...
CreateOleObject( 'Word.Application' ) ;
...
то некоторые варианты для него не проходят, к примеру:
Перейти на нужную страницу
Код
....
var What, Which, Name : OleVariant;
....
What:=wdGoToPage;
Which:=wdGoToNext;
Name:='2';
WordApplication1.Selection.GoTo_(What, Which, EmptyParam, Name);
....
в данном случае это нужно делать через второй способ:
Код
...
WordApplication1.Browser.Next;
...


Поэтому скорее ошибка где-то была в коде....



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Foley
Дата 22.2.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



Тада не могешь подсказать как сохранить книгу через ОлеВариант? как я только не пробовал, не работают: Save, SaveAs, SaveToFile, SaveToDocument, Save... и все время Method ... Not Supported Automatically Object.
PM MAIL ICQ   Вверх
Albinos_x
Дата 22.2.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Foley @ 22.2.2006, 22:32 Найти цитируемый пост)
Тада не могешь подсказать как сохранить книгу через ОлеВариант? как я только не пробовал, не работают: Save, SaveAs, SaveToFile, SaveToDocument, Save... и все время Method ... Not Supported Automatically Object.

я понял в чём у тебя была ошибка... ты сохранял скорее всего через:
Код
...
Excel:=CreateOleObject('Excel.Application');
...
Excel.Save;

Поэтому у тебя и вылезает эта ошибка... метод Save и SaveAs существует для WorkBook... т.е тебе нужно было:
Код
...
   Excel:=CreateOleObject('Excel.Application');
   Excel.WorkBooks.Open(ExtractFilePath(Application.ExeName)+'\report.xls');
   WB:=Excel.WorkBooks[1];
   Excel.Visible:=False;
   Ws := Wb.WorkSheets[1];
...
   Wb.Save;
...


тоже и с методом SaveAs
Код
...
   Excel:=CreateOleObject('Excel.Application');
   Excel.WorkBooks.Open(ExtractFilePath(Application.ExeName)+'\report.xls');
   WB:=Excel.WorkBooks[1];
   Excel.Visible:=False;
   Ws := Wb.WorkSheets[1];
...
   Wb.SaveAs((ExtractFilePath(Application.ExeName)+'\report1.xls'),EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
...

Но с этим методом не всё ладно... не хочет он принимать путь содержащий русские буквы.... пока ещё экспериментирую... попробую всё таки от него этого добиться....

Это сообщение отредактировал(а) Albinos_x - 23.2.2006, 00:03


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Foley
Дата 23.2.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



Точно, именно так, и че я сам не догадался? Спасибо большое за статью и за помощь!!!!
PM MAIL ICQ   Вверх
Albinos_x
Дата 23.2.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Рад был помочь!
Заглядывайте ещё...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 26.3.2006, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



отредактировал пост по практике с вордом, добавил еще :
Ещё вариант по работе с таблицей
Поиск и замена в документе



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Beltar
Дата 22.5.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 1
Всего: 7



А у меня почему-то

Код

Range.Borders.Item[xlEdgeLeft].Weight:=xlMedium;
Range.Borders.Item[xlEdgeLeft].LineStyle:=xlContinuous;


Не сработало.

Range я получаю так:

Код

Range:=EWSheet.Range['A'+IntToStr(Row),Char(ord('A')+DefLen+2)+IntToStr(Row)];


И нормально заношу в него данные. В чем м/б хитрость? 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Albinos_x
Дата 22.5.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



"не сработало" в каком смысле? не запустилось, выдало ошибку, просто ничего не произошло? 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Beltar
Дата 22.5.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 1
Всего: 7



Сетка остается такой, как была, хотя данные в Range записываются. 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Albinos_x
Дата 22.5.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



попробуй так:
Код
...
ExcelApplication1.Range['A3','H3'].Borders.Weight:=xlMedium;
ExcelApplication1.Range['A3','H3'].Borders.Item[xlEdgeBottom].LineStyle:=xlContinuous;
ExcelApplication1.Range['A3','H3'].Borders.Item[xlEdgeLeft].LineStyle:=xlContinuous;
ExcelApplication1.Range['A3','H3'].Borders.Item[xlEdgeTop].LineStyle:=xlContinuous;
ExcelApplication1.Range['A3','H3'].Borders.Item[xlEdgeRight].LineStyle:=xlContinuous;
...
 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 24.5.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



обнаружено различие между Excel2000 и ExcelXP в методе сохранения. В первых постах внесено изменение. Приведу код, как сделать, чтоб приложение работало и в 2000 и в ХР:
Код
...
uses ..., ExcelXP, Excel2000;
...
...    
if (StrToInt(Copy(ExcelApplication1.Version[icid],1,pos('.',ExcelApplication1.Version[icid])-1)))=9 then    
    (ExcelWorkbook1 as Excel2000.TExcelWorkbook).SaveAs(s, EmptyParam, EmptyParam, EmptyParam,    
                                                      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,    
                                                      EmptyParam, EmptyParam,0)    
    else    
    (ExcelWorkbook1 as ExcelXP.TExcelWorkbook).SaveAs(s, EmptyParam, EmptyParam, EmptyParam,    
                                                    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,    
                                                    EmptyParam,EmptyParam, EmptyParam,0);    
...
...
 

Это сообщение отредактировал(а) Albinos_x - 5.12.2006, 02:14


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
welt
Дата 31.5.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Albinos_x, помоги..
я закинул на форму
ExcelApplication1,   ExcelWorksheet1 и  ExcelWorkbook1.
Соединяюсь так (взял из какого-то твоего примера, с форума) :
Код

ExcelApplication1.AutoConnect:=true; 
  // открываем книгу 
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam)); 
  // соединяемся с книгой 
  ExcelApplication1.ConnectTo(ExcelWorkbook1.Application); 
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet); 
................


у меня ошибка вылетает "interface not supported"

и встает на строчке 
Код

 Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); 


(функции  function TExcelQueryTable.GetDefaultInterface)
в модуле ExcelXP.pas

Да. Система такая: win2000, excel2000, в делфи 7 стоит компонент excellXP.
По идее должно работать, но вылетает вышеуказанная ошибка...
говорю "должно", т.к проходила все работало при таких параметрах:
 windowsXP, excel2003, делфи7 с компонентом ExcelXP 


M
Girder
Welt, большая просьба создавать темы по своим проблемам и не засорять ими... данную тему.
  
PM MAIL   Вверх
Albinos_x
Дата 1.6.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



мда... в Excel 2000 нет OpenXML, там только Open:
Код
...
(ExcelApplication1 as Excel2000.TExcelApplication).Workbooks.Open(OpenDialog1.FileName,EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam,EmptyParam,EmptyParam, 0)
...


Добавлено @ 00:33 
PS: и в привёдённом тобой коде пятая строка не обязательна... 

Это сообщение отредактировал(а) Albinos_x - 5.12.2006, 02:22


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
welt
Дата 3.6.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Albinos_x
да..это понятно, что нет OpenXML.
Я и делал только с Open.
мне больше хотелось услышать мнение на счет ошибки
interface not supported
может быть вы сталкивались... 
PM MAIL   Вверх
Albinos_x
Дата 3.6.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



ты бы написал на какой строчке вылетает ошибка.... то что встаёт на строчке

Assert

не значит, что ошибка возникает в этом месте... тем более, что функция из System, и при чём 
Цитата

(функции  function TExcelQueryTable.GetDefaultInterface)

я так и не понял...

а ошибка видимо,  из-за того что в какой-то фунции есть расхождение ХР и 2000 Excel... возможна передача большего числа параметров, чем нужно или наоборот недостаточно... 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 13.6.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



часто задают вопрос как отключить сообщения выскакивающие в Excel:
Код
...
ExcelApplication1.DisplayAlerts[icid]:=false;
...
 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 16.6.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



один из часто задаваемых вопросов:
если хотите проверить на запущенность Ворда, то можно использовать отдельные функции... к примеру:
Код

function WordRunning:Boolean;    
var    
 temp: Variant;    
begin    
  try    
    temp := GetActiveOleObject('Word.Application');    
    Result := true;    
    temp:=unassigned; 
  except    
   Result := false;
 end;    
end;

или
Код

procedure TForm1.Button1Click(Sender: TObject);    
var    
  Unknown: IUnknown;    
  Result: HResult;    
begin    
  Result := GetActiveObject(ProgIDToClassID('Word.Application'), nil, Unknown);    
  if Result = MK_E_UNAVAILABLE then    
    ShowMessage('Закрыт')    
  else    
    ShowMessage('Открыт')    
end;

или
Код
...
if FindWindow('MsoStdCompMgr',nil)<>0 then caption:='On' else caption:='Off';
...


  

Это сообщение отредактировал(а) Albinos_x - 27.6.2006, 16:47


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
TYRARGO
Дата 24.6.2006, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 23.6.2006

Репутация: нет
Всего: нет



Уважаемый администратор, назовите, пожалуйсто причину, по которой был удален мой пост? Что в нем было не так? smile  
PM MAIL   Вверх
Girder
Дата 24.6.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
Group Icon


Профиль
Группа: Админ
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 6
Всего: 155



Цитата(TYRARGO @  24.6.2006,  05:10 Найти цитируемый пост)
Уважаемый администратор, назовите, пожалуйсто причину, по которой был удален мой пост? Что в нем было не так?

1. см. просьбу модератора... в ентом посте 
http://forum.vingrad.ru/index.php?showtopi...st&p=749528
2. вот твой пост(тема): http://forum.vingrad.ru/index.php?showtopic=101581
     


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Albinos_x
Дата 22.8.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Обнаружил у MSWord ещё один интересный метод, с помощью которого можно получить доступ ко всему содержанию документа:
Код
...
Memo1.Text:=WordDocument1.Content.Text;
...


в часности это метод Content, свойства _Document

Text - принимает значение WideString;
Сам Content имеет тип Range и все действия для него адекватны и для Content.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
markivanov
Дата 8.5.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Подскажите, как можно в TWordApplication добавить из TStream. До этого в TStream я сохранял документ Word ???
PM MAIL   Вверх
Albinos_x
Дата 9.5.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



WordApplication не предоставляет такой возможности, делай через буфер, или добавить файл... можешь поэкспериментировать и попробовать грузить всё в OleVariat и оттуда уже вставлять...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 11.5.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



markivanov, по поводу работы через OleVariant в модуле ActiveX есть функции OleLoadFromStream() и OleSaveToStream() поэкспериментируй с ними...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 24.9.2007, 08:59 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108





--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Hoor
Дата 28.9.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.2.2007

Репутация: нет
Всего: нет



Вопросик такой: возникла необходимость вставки рисунка в Ворд из делфи

я вызываю там вордовский документ (он у меня 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;

Так вот Вопрос - как этот рисунок расположить в документе  в тексте ? Спасибо.
PM MAIL   Вверх
Albinos_x
Дата 29.9.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



она по умолчанию вставляется как в тексте...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 29.9.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Hoor
Дата 29.9.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.2.2007

Репутация: нет
Всего: нет



Сорри, я кажется не совсем понял.  smile 
Если задать

"...просто выбери место через 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 секунд

 smile 

попробовал не через свойство name, а просто

W.Selection.InlineShapes.AddPicture...

Заработало 
Огромное спасибооо
PM MAIL   Вверх
Albinos_x
Дата 30.9.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Hoor @  29.9.2007,  20:52 Найти цитируемый пост)
Так может быть?
W.Selection.End:=W.ActiveDocument.Range.End;
W.Selection.Start:=W.ActiveDocument.Range.End;

Ну зачум... просто доходишь до нужного места и вставляешь рисунок
Код

W.ActiveDocument.Shapes.AddPicture('имя');

или так:
Код
...
WordApplication1.Selection.InlineShapes.AddPicture('C:\Documents and Settings\зима.jpg',
                                                                                  EmptyParam, EmptyParam, EmptyParam);
...


координаты указывать не надо, т.к. когда ты их указываешь формат из "в тексте" меняется на "перед текстом".

а так он вставит по положению курсора...

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
B2_Russia
Дата 13.11.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь

Репутация: нет
Всего: 1



А как бы еще отобразить документ на своей форме?
PM WWW ICQ   Вверх
Albinos_x
Дата 15.11.2007, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



OleConteiner


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
SmarTik
Дата 27.12.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Доброго времени суток !
Может я немного не потеме, но такой вопрос: как получить index активного документа ?
Спасибо.


Это сообщение отредактировал(а) SmarTik - 27.12.2007, 18:31
PM MAIL   Вверх
Peha
  Дата 11.1.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.1.2008
Где: C:\Украина&# 092;Северо-запад

Репутация: нет
Всего: нет



Очень интересная статья!!!  smile 
Мне она сэкономила кучу времени, т.к. начальнику захотелось сделать прогу для генерации кой-каких отчетов, но именно в Ворде...
И вот я столкнулся с небольшой проблемой (точнее пока нет времени на эксперименты), нужно создать табличку вида:
Код

+----------+----------+----------+----------+
|  Текст   |  Текст   |        Текст        |
+----------+----------+----------+----------+
|    Вот тут тоже кусок текста   |  Текст   |
+----------+----------+----------+----------+
|  Текст   |  Текст   |  Текст   |  Текст   |
+----------+----------+----------+----------+

Точнее, меня интересует, как можно обьединить несколько ячеек в созданной таблице в MS Word (у меня 2003)
Если кто сталкивался, помогите плиз... Свое решение выложу, как-только сам разберусь...

---------

все, нашел. Если кому интересно, код обьединяет ячейки в предпоследней строке с первой по пятую:
Код

 Table1.Cell(Table1.Rows.Count-1,1).Merge(Table1.Cell(Table1.Rows.Count-1,5));


Это сообщение отредактировал(а) Peha - 20.1.2008, 16:12
PM MAIL WWW ICQ   Вверх
mikolka
Дата 15.1.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.1.2008

Репутация: нет
Всего: нет



Доброго времени суток.
как можно узнать страницу на которой, сейчас находится курсор в ворде?
PM MAIL   Вверх
Jsn
  Дата 5.2.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.2.2008

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 13.6.2006,  22:13)
часто задают вопрос как отключить сообщения выскакивающие в Excel:
Код
...
ExcelApplication1.DisplayAlerts[icid]:=false;
...

Помогите, плз, решить проблему:
создаю 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 - нет изменеий

PM MAIL   Вверх
Albinos_x
Дата 13.2.2008, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



извините что дого не отвечал, был в состоянии переезда и имелись проблемы со связью...

SmarTik
не уверен, но попробуй так:
Код

ind:=WordApplication1.ActiveWindow.Index;


если не поможет, то пробуй перебором...

=============

mikolka
не могу пока сказать как, т.к сам ещё не нашёл... справка по VBA говорит, что есть объект Pages предствляющий собой массив страниц,
доступ к ним должен выглидить где-то так: 
Wapp.ActivWindows.Panes.Item(1).Pages.Item(1)

но с этим  у меня ничего не получилось..(

============

Jsn
1. используйте теги code
2. хм... странно... попробуйте так:
Код

Application1 := TWordApplication.Create(nil);
  with Application1 do
  begin
    try
// запускаем ворд
Application1.Connect;
...
// теперь говорим серверу, что события нужно игнорировать
      DisplayAlerts := wdAlertsNone; 
// выполняем остальные действия, например
      Documents.Open(fn, fn1, fn2, fn1, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam); 
...



Это сообщение отредактировал(а) Albinos_x - 13.2.2008, 01:40


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 13.2.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



mikolka, попровляюсь, тут мне XperT подсказал
Код

// номер страницы на которой находится курсор
Edit1.Text:=WordApplication1.Selection.Information[wdActiveEndPageNumber];

функция возвращает OleVariant


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Jsn
Дата 14.2.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.2.2008

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 13.2.2008,  01:19)

2. хм... странно... попробуйте так:
Код

Application1 := TWordApplication.Create(nil);
  with Application1 do
  begin
    try
// запускаем ворд
Application1.Connect;
...
// теперь говорим серверу, что события нужно игнорировать
      DisplayAlerts := wdAlertsNone; 
// выполняем остальные действия, например
      Documents.Open(fn, fn1, fn2, fn1, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam); 
...


Albinos_x 

Application1.Connect; - не помогает smile 
PM MAIL   Вверх
Albinos_x
Дата 16.2.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



хм.....

Jsn, если я правильно понял, то этот код Вы используюте, только для того чтоб печатать документы. Если я правильно понял, то этот код можно реализовать гораздо проще
вот код:
Код
...
uses ..., ShellAPI;
....
begin    
if ShellExecute(handle, 'print', PChar(FileName), nil, nil, SW_SHOW) <= 32 then
  begin
    // если ошибка печати
   MessageDlg('Ошибка печати #10#13'+s,mtWarning,[mbOK],0);
   end;
end;
...
 
если показывать окно ворда не надо, то передайте вместо SW_SHOW значение SW_HIDE




--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 6.3.2008, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Пример смарт-тега здесь:
http://forum.vingrad.ru/forum/topic-197657...y1434286/0.html


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Чердак
Дата 3.5.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



А где можно найти Help по функциям сервера MSOffice?  smile 
--------------------
fly_agaric@mail.ru
PM MAIL   Вверх
Albinos_x
Дата 4.5.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



в справке по VB


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Чердак
  Дата 5.5.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Спасибо, а как можно установить отдельно эту справку? и можно ли где скачать?
Время доброе smile У меня такая проблема при добавлении нового листа и попытки его переименовать, почему-то переименовывается первый лист :(
Код

    EA1.Worksheets.Add(EmptyParam,EmptyParam,1,EmptyParam,icid);
    EA1.ActiveWorkbook.ActiveSheet;
    EWsh1.Name:=DateToStr(now)+'_'+time;


что не так делаю?

Это сообщение отредактировал(а) Чердак - 5.5.2008, 19:07
--------------------
fly_agaric@mail.ru
PM MAIL   Вверх
Чердак
Дата 5.5.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Получилось...
Код

    EA1.Worksheets.Add(EmptyParam,EmptyParam,1,EmptyParam,icid);
    EWsh1.ConnectTo(EA1.ActiveWorkbook.ActiveSheet as ExcelWorkSheet);
    EA1.ActiveWorkbook.ActiveSheet;
    EWsh1.Name:=DateToStr(now)+'_'+time;



Это сообщение отредактировал(а) Чердак - 5.5.2008, 21:38
--------------------
fly_agaric@mail.ru
PM MAIL   Вверх
Albinos_x
Дата 5.5.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Чердак @  5.5.2008,  18:57 Найти цитируемый пост)
Спасибо, а как можно установить отдельно эту справку? и можно ли где скачать?

когда устанавливаете оффис, поставить галку выбрать конфигурацию в ручную... ну и там соответственно "Установить"


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 5.5.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Чердак @  5.5.2008,  18:57 Найти цитируемый пост)
что не так делаю?

хм... ну во первых...
то что в первом варианте Вы не подсоединили EWsh1 к листу
Код
...
EWsh1.ConnectTo(EA1.Worksheets.Add(EmptyParam,EmptyParam,1,EmptyParam,icid) as ExcelWorksheet);
EWsh1.Name:=DateToStr(now)+'_'+time;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
zhefran
Дата 19.5.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



На tablet Pc в Word есть такая комманда как InsertInkAnnoptations - это рукописные примечания. У меня вопрос: Как можно добраться до пунктов его CommandBar-а? Там в нем есть изменение цвета примечания; изменения типа пера - ручка, фломастер, выделение; изменение толщины линии. Пробовал выполнять запись макроса, потом эти команды. В макросе ничего не написано. Потом все это надо будет сделать с помощью Delphi. Я думаю буду просто выполнять макрос, но я не знаю как добраться до тех команд. smile  smile 

Это сообщение отредактировал(а) zhefran - 19.5.2008, 12:37
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 27.5.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(zhefran @  19.5.2008,  12:37 Найти цитируемый пост)
пунктов его CommandBar-а

Код

WordApplication1.CommandBars...

Цитата(zhefran @  19.5.2008,  12:37 Найти цитируемый пост)
Пробовал выполнять запись макроса, потом эти команды. В макросе ничего не написано.

если не написано, значит через макрос по лубому не получится... а эти команды скорее нужно выполнять в отдельном интерфейсе...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
NightKeeper
Дата 29.5.2008, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.5.2008

Репутация: нет
Всего: нет



Доброго времени суток!

Помогите решить следующую проблему:
Есть файл Excel, в котором присутствуют объекты типа Image и CheckBox, необходимо передавать в них значения из программы на Дельфи. Формат файла разработан не мной и редактировать его структуру категорически запрещено.

Каким образом я могу получить доступ к этим объектам если известны только их имена?
PM MAIL   Вверх
NightKeeper
Дата 29.5.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.5.2008

Репутация: нет
Всего: нет



Все. Всем спасибо!
Сам разобрался smile
PM MAIL   Вверх
Beltar
Дата 3.6.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 1
Всего: 7



Кстати, а кто-нибудь писал здесь о таких неприятных вещах, как отключение от Office версий ниже 2003-ей? Сервер остается в памяти, но к нему не подключишься и его оттуда только через 3 веселых клавиши. 2003-ий же если он уже загружен только пускаться быстрее будет. В свое время статья помогла мне найти решение. Запомнить при коннекте версию, и делать так:

Код

procedure TfmReports.EAWorkbookBeforeClose(ASender: TObject;
  const Wb: _Workbook; var Cancel: WordBool);
begin
case Ver of
  9,10:EA.Disconnect;
end;
end;


Хотя под Win2000 все равно подглючивает сообщением об ошибке, которое можно просто закрыть.

Еще один "прикол" с версиями Excel младше 2003.
Если Range получился пустой, то при попытке оформить границы ячеек происходит сбой. Или например Range включает одну строку и при попытке обратится к границе xlInsideHorizontal также происходит сбой. В 2003 же все работает отлично.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
nuzzle
Дата 16.6.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.6.2008

Репутация: нет
Всего: нет



Здравствуйте.
При обработке информации в таблицах документа MS Word я пытаюсь использовать две переменные типа 
OleVariant, которые ссылаются на IDispatch таблиц, в которых были найдены определенные значения. 
Как узнать, ссылаются переменные на одну и ту же таблицу или нет. Благодарю Вас.
PM MAIL   Вверх
TVV777
Дата 15.7.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.7.2008

Репутация: нет
Всего: нет



При работе с 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
Подскажите как правильно?
PM MAIL   Вверх
Albinos_x
Дата 15.7.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



TVV777
Цитата(TVV777 @  15.7.2008,  14:30 Найти цитируемый пост)
Split(1,3)

значения 1 и 3 попробуйте передать как olevariant, я вам уже ответил по мылу

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
TVV777
Дата 16.7.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.7.2008

Репутация: нет
Всего: нет



Большое спасибо за предыдущую подсказку!!! У меня к Вам есть ещё вопрос.
Допустим у меня есть заполненная таблица. и мне нужно выделить в одной из ячеек одно слово (чтобы отформатировать его). Слово может находится в любом месте строки. Слово этоя я знаю, и знаю что оно там точно есть. Подскажите как это сделать пожалуйста!!! Местоположение слова с точностью до символа и его длину я тоже знаю.
И ещё: каким способом можно перемешать курсор по ячейкам (к примеру нужно поставить курсор в 5,1 яейку)? 
Топик просто великолепен!!!
PM MAIL   Вверх
Albinos_x
Дата 16.7.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



попробуйте так:

Код

// выделение другой ячейки
 Tbl.Cell(2,3).Range.Select;
WordDocument1.Range.Collapse(fil);
// вставляем текст после выделения, по текущей позиции курсора
 WordApplication1.Selection.InsertAfter(#13+'hello insert');


Добавлено через 1 минуту и 29 секунд
это по поводу выделения ячейки

Добавлено через 2 минуты и 56 секунд
если знаете расположение слова с такой точностью, то устанавливайте Range и потом запускайте процедуру Select


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Beltar
Дата 17.2.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 1
Всего: 7



Можно вопрос по TExcelChart?

У меня есть рабочая книга на первом листе таблица, на втором диаграмма.
Используя TExcelChart я попробовал присоедениться так:

Код

EChart.ConnectTo(EWBook.Sheets[2] as ExcelChart);


Никаких сообщений об ошибках не выдается, это радует.

Записал для выяснения свойств макрос:


Код

    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "Диаграмма 2"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Ось X"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Ось Y"
    End With
    ActiveChart.ChartArea.Select
    ActiveChart.SeriesCollection(1).XValues = "=Лист1!R2C1:R16C1"
    ActiveChart.SeriesCollection(1).Values = "=Лист1!R2C2:R16C2"


Однако при попытках в Delphi написать:

Код

EChart.ChartTitle[lcid].Characters.Text[lcid]:='Название диаграммы';
EChart.SeriesCollection(1).XValues:='=Лист1!R5C2:R6C2';
EChart.SeriesCollection(1).Values:='=Лист1!R5C3:R6C3';


только получаю сообщения, что [Pascal Error] FormReport.pas(345): E2029 '[' expected but '.' found да [Pascal Error] FormReport.pas(346): E2003 Undeclared identifier: 'XValues'

Как правильно?

Это сообщение отредактировал(а) Beltar - 17.2.2009, 10:47


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Albinos_x
Дата 1.3.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Код
...
EChart.ChartTitle[lcid]].Characters[Start, Length :Olevariant].Text:='Название диаграммы';
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Ymnuk
Дата 4.3.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.2.2008
Где: Ставрополь

Репутация: нет
Всего: нет



Доброго времени суток. Подскажите пожалута как в Excel узнать количество заполненных строк.
В Delphi пишу:
Код

c:=ExcelApp.Rows.count;

В итоге количество строк показывает 65536, хотя я точно знаю, что их там не более 35000.  smile 
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 5.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



на первой странице этой темы написано...
http://forum.vingrad.ru/forum/topic-84634/0.html#


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Akella
Дата 26.3.2009, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18476
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329



Объединить ячейки Excel
Код
Sheet.Range[...].Merge(Across)


Добавлено через 2 минуты и 15 секунд
Относительно LOCALE_USER_DEFAULT
Относительно открытия существующих рабочих книг
Закрытие книги
Способы обращения к ячейкам
Копирование данных в буфер обмена
http://forum.vingrad.ru/index.php?showtopi...st&p=306276
Это по идее должно было попасть в DRKB
PM MAIL   Вверх
Beltar
Дата 21.4.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 1
Всего: 7



Опять вопрос относительно диаграммы. На этот раз диаграмма на том же листе, что и данные. Пробую работать без TExcelChart. Хочу просто поменять у диаграммы название.

Код

var COs:ChartObjects;
      CO:ChartObject;
begin
COs:=EWSheet.ChartObjects as ChartObjects; {не уверен, что это правильное преобразование}
CO:=COs.Item(1) as ChartObject;
CO.Activate;
//CO.Chart.ChartArea[lcid].Select; // Такой вызов есть у Excel в макросе, но мне от этого толку ноль. 
CO.Chart.HasTitle[lcid]:=true;
CO.Chart.ChartTitle[lcid].Characters[0,255].Text:='Нормальное распределение';
end;


HasTitle[lcid]:=true проходит. Однако потом вываливается ошибка OLE и AV С адресом в ноль.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Yudya
Дата 29.4.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Привет всем. Подскажите как мне программным путем при создании документа Excel или Word дать название создаваемого документа (т.е. название документу Excel или Word)???
PM MAIL   Вверх
Данкинг
Дата 29.4.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Yudya, ...saveas('имя_файла.xls');


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Albinos_x
Дата 8.6.2009, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



// HasTitle[lcid]:=true проходит. Однако потом вываливается ошибка OLE и AV С адресом в ноль.

Beltar, попробуй закомментировать строки:
Код

// CO.Activate;
// CO.Chart.ChartArea[lcid].Select; // Такой вызов есть у Excel в макросе, но мне от этого толку ноль. 

сталкивался иногда с тем, что именно эти строки могут вызывать ошибки, а обращение к нужному обёкту у вас всё равно будет происходить....


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Akella
Дата 2.9.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18476
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329



PM MAIL   Вверх
TSIBA
Дата 6.9.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 22.4.2009

Репутация: нет
Всего: нет



Может поможет:

Название: Советы по 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
PM MAIL   Вверх
Natalishka
Дата 29.9.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.9.2009

Репутация: нет
Всего: нет



Подскажите пож-та, мне нужно сделать импорт данных (котрые генерируются ХР)в 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 показать в какое именно место мне вставить данные ?

PM MAIL   Вверх
Alfredphb
Дата 1.10.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



Вопрос: надо изменить размер рисунка, вставляемого в Word.
Я делаю так (на основе кода, найденного где-то в инете):
Код

vprocedure TForm1.Button1Click(Sender: TObject);
var  
  fwdCharacter,wdExtend,Count: OleVariant;
  JPEG: TJPEGImage;
  bmp: TBitmap;
begin
  Word:=TWordApplication.Create(self);
 {....}
       JPEG := TJPEGImage.Create;
        JPEG.Assign(TBlobField(proc.FieldByName('Photo')));
        // изменить размер
         bmp:= Tbitmap.Create;
        try
          {Create thumbnail bitmap, keep pictures aspect ratio}
          bmp.Width :=  106; // ~ 28 мм
          bmp.Height:= 139; // ~ 35 мм
          bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect,JPEG  );
          {Draw thumbnail as control}
          Self.Canvas.Draw( 100, 10, bmp );
        finally
        Clipboard.Assign(bmp);
        Word.Selection.Range.Paste;
        bmp.free;
        end;
end;

Проблема в том, что вставленный в документ рисунок изрядно теряет в качестве, "распикселизация".
Если вставляю в оригинальном размере:
         
Код

 bmp.Width := JPEG.Width;
 bmp.Height:=JPEG.Height;

то качество сохраняется.
Я пытался после вставки изменить размер рисунка в вордовском документе:
       
Код

        fwdCharacter:=wdCharacter;
        Count:=1;
        Word.Selection.MoveRight (fwdCharacter, Count, wdExtend);
       Word.Selection.ShapeRange.Width:=28;


никаких сообщений не выдаётся, размер не меняется.
Что я делаю не так, и как надо правильно?



PM MAIL   Вверх
Alfredphb
Дата 8.10.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



По поводу изменения размеров рисунка получилось вот так, вдруг кому пригодиться:

Код

procedure Tf.bbClick(Sender: TObject);
var
       Word : TWordApplication;
       WDoc: Word2000._Document;
       OleFileName   : OleVariant;
       JPEG: TJPEGImage;
       bmp: TBitmap;
begin
  Word:=TWordApplication.Create(self);
  WDoc:=word.Documents.Open(OleFileName, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam);

 {....}
       JPEG := TJPEGImage.Create;
        JPEG.Assign(TBlobField(proc.FieldByName('Photo')));
        // изменить размер
         bmp:= Tbitmap.Create;
       try
          {Create thumbnail bitmap, keep pictures aspect ratio}
          bmp.Width := JPEG.Width; 
          bmp.Height:=JPEG.Height; 
          bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect,JPEG  );
          Self.Canvas.Draw( 100, 10, bmp );
        finally
          Clipboard.Assign(bmp);
          Word.Selection.Paste;
          WDoc.InlineShapes.Item(1).Height := 100; // 35,24 mm
          WDoc.InlineShapes.Item(1).Width := 74 ;  // 26,14 mm
          bmp.free;
       end;
end;

PM MAIL   Вверх
TopCore
Дата 14.10.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



Здравствуйте! Я с вопросом "из Excel в Paradox". Делаю по примеру с первой страницы. Но есть проблемы. Подсчёт строк неправильный: вместо 65 подсчитывает 74. И когда доходит код до работы с БД выдаёт сообщение об ошибке:
Код

Project Project1.exe raised exception class EDatabaseError with message
'Table1: Cannot perform this operation on a closed dataset'.
Process stopped. Use Step or Run to continue.

Как набор данных сделать открытым?

Это сообщение отредактировал(а) TopCore - 14.10.2009, 12:53
PM MAIL   Вверх
Данкинг
Дата 14.10.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



TopCore, создай новый топик. При чём здесь ExcelApplication вообще?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
TopCore
Дата 14.10.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.8.2009

Репутация: нет
Всего: нет



За вопрос о БД прошу прощения. А вот что не так с определением количества строк в таблице?
Код

ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

Эта строка активирует ячейку 'Х74' вместо 'Т62'.
PM MAIL   Вверх
Alexanderneo
Дата 17.4.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.2.2010

Репутация: нет
Всего: нет



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

Подсоединяюсь к ворду так:

Код

procedure TForm1.Button1Click(Sender: TObject);
...
  WordApplication1.AutoConnect:=true;
  WordApplication1.ConnectKind := ckNewInstance;
  WordApplication1.Connect;
  WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);       // (вот на эту строчку он потом ругается)
  WordApplication1.Visible:=false;

 
В подключении пихаю все уже от безисходности
Вопрос заключается в том, что при первом разе ворд автоматом подключается, потом если процесс ворда прервать, то к ворду уже не получается подключиться. Помогите кто может.
PM MAIL   Вверх
Данкинг
Дата 17.4.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(Alexanderneo @  17.4.2010,  14:11 Найти цитируемый пост)
Если потом открыть созданный документ, а потом закрыть его (процесс WINWORD при этом закрывается естественно) 

Ничего естественного. Можно закрыть документ, не закрывая самого "ворда".


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Albinos_x
Дата 19.4.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Alexanderneo @  17.4.2010,  13:11 Найти цитируемый пост)
попытаться создать еще один документ (не закрывая программы), то программа выводит ошибку о недоступности сервера RPC

я вроде писал об этом в статье.... 
в общем:
1. Если Вы показываете документ пользователю и он его может закрыть, то Вам необходимо отлавливать сообщение о закрытии документа или самого сервера Word, для этого у компанента есть необходимые обработчики событий.
2. При программном закрытии таких проблем возникать не должно, но если все-же возникают, то пробуйте при закрытии делатьсь Disconnect с сервером, тогда он будет переинициализировать сервер заново.



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
scorpion87
Дата 3.5.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Здравствуйте, проблема в следующем: 
используя фукнцию:      Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text:='текст';
я вставляю в нужную ячейку необходимый текст, далее необходимо вставить в этой же ячейке таблицы другую строку, я програмно жму клавишу "Enter" используя функцию WordApp.Selection.TypeParagraph;
Как вставить текст? вызвав функцию  Word.selection.TypeText('sdf2');    текст вставляется не в таблицу а в документ, по сути нужно наверное поставить указатель в данную ячейку и потом в нее записывать.
Короче говорю мне нужно в одну ячеку вордовской таблицы вставить последовательно несколько строк.

Это сообщение отредактировал(а) scorpion87 - 3.5.2010, 15:44
PM MAIL   Вверх
Albinos_x
Дата 4.5.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(scorpion87 @  3.5.2010,  15:42 Найти цитируемый пост)
я вставляю в нужную ячейку необходимый текст, далее необходимо вставить в этой же ячейке таблицы другую строку, я програмно жму клавишу "Enter" используя функцию WordApp.Selection.TypeParagraph;

хм... а что мешает сделать вставку в один присест:
Код

Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text:='текст'+#13#10+'text2';

или таким вот подходом:
Код

Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text:='текст';
...
Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text:=Word.ActiveDocument.Tables.Item(1).Cell(12,2).Range.Text+#13#10+'text2';

?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
Akella
Дата 7.8.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18476
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329



Excel в Delphi. Работа со свойствами документа.
http://www.webdelphi.ru/2010/06/excel-v-de...vami-dokumenta/
PM MAIL   Вверх
klyaksa
Дата 25.8.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Подскажите возможно ли экспортировать в excel не плоский текст, а форматированный rtf? Если да, то как?
Т.е. у меня в строковой переменной s есть rtf-текст, при присваивании Excel.ActiveWorkBook.WorkSheets[1].Range['A1'].Value:=s в ячейке плоских текст и видны все теги rtf, а не форматированный текст :(
PM MAIL   Вверх
Данкинг
Дата 25.8.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(klyaksa @  25.8.2010,  15:48 Найти цитируемый пост)
Подскажите возможно ли экспортировать в excel не плоский текст, а форматированный rtf?

Возможно, через буфер обмена. Только создай новую тему для этого вопроса.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
klyaksa
Дата 25.8.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Данкинг @  25.8.2010,  15:08 Найти цитируемый пост)
Возможно, через буфер обмена. Только создай новую тему для этого вопроса.

Пробывал, копируя тут вручную... Из JvRichEdit вставляет голый текст. Если же вставить в ворд и уже оттуда скопировать тогда вставляет...



Как переписать с помощью ExcelApplication, ExcelWorkbook, ExcelWorksheet?
Что постоянно ошибки выскакивают...
Код

// Создание Excel
ExcelApp := CreateOleObject('Excel.Application');
// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := false;
//  Создаем Книгу (Workbook)
ExcelApp.SheetsInNewWorkbook := 10;
Workbook := ExcelApp.WorkBooks.Add;
for IWS := 1 to 10 do begin
... WorkBook.WorkSheets[IWS]...
end;







PM MAIL   Вверх
Albinos_x
Дата 26.8.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(klyaksa @  25.8.2010,  14:48 Найти цитируемый пост)
Подскажите возможно ли экспортировать в excel не плоский текст, а форматированный rtf? Если да, то как?Т.е. у меня в строковой переменной s есть rtf-текст, при присваивании Excel.ActiveWorkBook.WorkSheets[1].Range['A1'].Value:=s в ячейке плоских текст и видны все теги rtf, а не форматированный текст :(

смотря что ты хочешь получить.... текст с потерей форматирования *.rtf?... да можно... только сначала нужно обработать текст от лишних тегов...
если хочешь с форматированием... то сложнее... тогда писать свой парсер, который будет разбирать форматирование rtf и переносить его в excel...

Добавлено через 31 секунду
иначе будет вставлять только полный текст

Добавлено через 2 минуты и 48 секунд
Цитата(klyaksa @  25.8.2010,  20:05 Найти цитируемый пост)
Как переписать с помощью ExcelApplication, ExcelWorkbook, ExcelWorksheet?

что именно переписать?
если создание и подключение к серверу с созданием определенного количества страниц, то смотри первые 2 страницы... там про это написано... с примерами...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 28.8.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Как переписать разобрался... Я просто 1 у имен обычно убираю, а после as ...
ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets[NSheet] as ExcelWorkSheet);

А вот с сохранением документа (созданного с нуля) проблема, на всех примерах ругается... Например, не может там что-то в булеан преобразовать... (ExcelXP)
        
PM MAIL   Вверх
Данкинг
Дата 28.8.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(klyaksa @  25.8.2010,  21:05 Найти цитируемый пост)
Как переписать с помощью ExcelApplication, ExcelWorkbook, ExcelWorksheet?

Зачем? Чем ole не нравится? Там сохранение (.SaveAs) отлично работает. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Albinos_x
Дата 29.8.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(klyaksa @  28.8.2010,  10:26 Найти цитируемый пост)
А вот с сохранением документа (созданного с нуля) проблема, на всех примерах ругается... Например, не может там что-то в булеан преобразовать... (ExcelXP)

Код

...
var FileNameOle: OleVariant;
    Fileformat : OleVariant;
    BoolOle    : OleVariant;
begin
FileNameOle:=FileName;
....
// сохраняем в формат *.xls - считаем что нам могут попасться только 2003 и 2007 офисы
if (StrToInt(Copy(ExcelApp.Version[LOCALE_USER_DEFAULT],1,pos('.',ExcelApp.Version[LOCALE_USER_DEFAULT])-1)))=12 then
              Fileformat:=56          // для office 2007
              else
              Fileformat:=xlNormal;   // для Office 2003
          ExcelApp.ActiveWorkbook.SaveAs(FileNameOle, Fileformat, EmptyParam, EmptyParam,
                                         BoolOle, BoolOle, xlExclusive, EmptyParam,
                                         BoolOle, EmptyParam, EmptyParam, EmptyParam,
                                         LOCALE_USER_DEFAULT);
....

вообще, конечно, достаточно указать параметр xlExclusive и он не должен ругаться, но для перестраховки можно и так

Добавлено через 31 секунду
xlExclusive - это значит он откроет монопольно...

Добавлено через 7 минут и 42 секунды
Цитата(Albinos_x @  29.8.2010,  20:28 Найти цитируемый пост)
Fileformat:=xlNormal;   // для Office 2003

для office XP этот параметр тоже подойдет... 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 30.8.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Albinos_x, все ОК. Спасибо.

Цитата(Данкинг @  28.8.2010,  14:32 Найти цитируемый пост)
Зачем? Чем ole не нравится?

Предупреждения которые мешают заметит нужную ошибку.
PM MAIL   Вверх
klyaksa
Дата 30.8.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Albinos_x, при сохранении с именем уже сущ. файла в excel вылазит окно заменить? (да, нет, отмена). Если нет то делфи выдает ошибку "OLE ERROR 800A03EC"...
PM MAIL   Вверх
fishick
Дата 31.8.2010, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.8.2010

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 16.7.2008,  17:29)
попробуйте так:

Код

// выделение другой ячейки
 Tbl.Cell(2,3).Range.Select;
WordDocument1.Range.Collapse(fil);
// вставляем текст после выделения, по текущей позиции курсора
 WordApplication1.Selection.InsertAfter(#13+'hello insert');


Добавлено @ 17:30
это по поводу выделения ячейки

Добавлено @ 17:32
если знаете расположение слова с такой точностью, то устанавливайте Range и потом запускайте процедуру Select

Здравствуйте. У меня такая же проблема (отформатировать одно из слов в ячейке таблицы).
Подскажите что я делаю не так: 

tbl.cell(3,3).range.setrange(3,6);
tbl.cell(3,3).range.select;

далее я делаю подчеркивание, но в результате подчеркивается все содержимое ячейки. 


PM MAIL   Вверх
Albinos_x
Дата 1.9.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(fishick @  31.8.2010,  23:52 Найти цитируемый пост)
tbl.cell(3,3).range.setrange(3,6);
tbl.cell(3,3).range.select;

далее я делаю подчеркивание, но в результате подчеркивается все содержимое ячейки. 


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

Добавлено через 1 минуту и 5 секунд
klyaksa, а какие команды ты выполняешь после? приведи кусок кода в котором ты делаешь сохранение.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 1.9.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Albinos_x @  1.9.2010,  15:54 Найти цитируемый пост)
klyaksa, а какие команды ты выполняешь после? приведи кусок кода в котором ты делаешь сохранение.


Создание нужного документа в excel  (получается все как надо) и сохранение как в Дата 29.8.2010, 20:28 и все.
PM MAIL   Вверх
fishick
Дата 1.9.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.8.2010

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 1.9.2010,  15:54)
Цитата(fishick @  31.8.2010,  23:52 Найти цитируемый пост)
tbl.cell(3,3).range.setrange(3,6);
tbl.cell(3,3).range.select;

далее я делаю подчеркивание, но в результате подчеркивается все содержимое ячейки. 


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

Добавлено @ 15:55
klyaksa, а какие команды ты выполняешь после? приведи кусок кода в котором ты делаешь сохранение.

А какой командой можно это сделать? Подскажите, пожалуйста.
PM MAIL   Вверх
Albinos_x
Дата 3.9.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



klyaksa, на какой строчке вылетает ошибка? приведи кусок кода.

Добавлено через 32 секунды
fishick, чуть позже посмотрю, отпишусь


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
fishick
Дата 3.9.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.8.2010

Репутация: нет
Всего: нет



У меня появилось кое-какое решение, но не очень элегантное в виду большого количества обращений к серверу. Решил проблему через Characters.
Код

tbl.cell(3,3).Range.Characters.Item(2).select;
w.selection.Range.font.underline:=true;
tbl.cell(3,3).Range.Characters.Item(3).select;
w.selection.Range.font.underline:=true;



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


w.selection.start:=tbl.cell(3,3).Range.Characters.Item(2)
w.selection.end:=tbl.cell(3,3).Range.Characters.Item(3)

выдает ошибку.






Это сообщение отредактировал(а) fishick - 3.9.2010, 13:52
PM MAIL   Вверх
Albinos_x
Дата 3.9.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



вот так можно решить:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
   Tbl: Table;
   fil:OleVariant;
   Rang:Range;
   text:String;
   x,y:Integer;
begin
....
// документ запущен соединение установлено
...
// получаем таблицу
Tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
// получаем текст
text:=Tbl.Cell(8,5).Range.Text;
// получаем позиции начала и конца ранжа
x:=Tbl.Cell(8,5).Range.Start;
y:=Tbl.Cell(8,5).Range.End_;
// выделяем в тексте слово hello 
// получаем его позицию в ранже
x:=x+pos('hello',text)-1;
y:=x+5;
// получаем ранж документа
Rang:=WordDocument1.Range;
// устанавливаем  ранж
fil:=x;
Rang.MoveStart(EmptyParam,fil);
fil:=y-WordDocument1.Range.End_;
Rang.MoveEnd(EmptyParam,fil);
// выделяем слово
Rang.Font.Bold:=1;
end;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
fishick
Дата 3.9.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.8.2010

Репутация: нет
Всего: нет



Albinos_x, попробую. Спасибо!
PM MAIL   Вверх
klyaksa
Дата 5.9.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Albinos_x @  3.9.2010,  11:37 Найти цитируемый пост)
klyaksa, на какой строчке вылетает ошибка? приведи кусок кода.


При нажатии Нет выскакивает сообщение внизу.

Код

  SheetsInNewWB :=  5;

  ExcelApplication1.ConnectKind := ckNewInstance;
  ExcelApplication1.AutoQuit := True;
  ExcelApplication1.Visible[lcid] := False;
  ExcelApplication1.Connect;
  ExcelApplication1.SheetsInNewWorkbook[lcid] := SheetsInNewWB;
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,lcid)) ;


  for I := 1 to 5 do
  begin
        ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets[I] as ExcelWorkSheet);
        Range := GetRange(ExcelWorksheet1, 1, 1, 1, 2);
        Range.MergeCells := True;
        Range.Value := 'ляллляляллялялялял';
        Range.Font.Bold := True;
  end;


  ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets[1] as ExcelWorkSheet);
  ExcelApplication1.Visible[lcid] := True;
  ExcelWorksheet1.Activate;


    FileName := ConfigDirSaveReport +
      'лялял.dat';
    FileName := ChangeFileExt(FileName, '.xls');
    FileNameOle  := FileName;
    // сохраняем в формат *.xls - считаем что нам могут попасться только 2003 и 2007 офисы
    if (StrToInt(Copy(ExcelApplication1.Version[LOCALE_USER_DEFAULT],1,pos('.',ExcelApplication1.Version[LOCALE_USER_DEFAULT])-1)))=12 then
              Fileformat:=56          // для office 2007
              else
              Fileformat:=xlNormal;   // для Office 2003
    ExcelApplication1.ActiveWorkbook.SaveAs(FileNameOle, Fileformat, EmptyParam, EmptyParam,
                                         BoolOle, BoolOle, xlExclusive, EmptyParam,
                                         BoolOle, EmptyParam, EmptyParam, EmptyParam,
                                         LOCALE_USER_DEFAULT);


---------------------------
Debugger Exception Notification
---------------------------
Project MyReport.exe raised exception class EOleException with message 'OLE error 800A03EC'.
---------------------------
Break   Continue   Help   
---------------------------


PM MAIL   Вверх
Albinos_x
Дата 6.9.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



??? а  в каком месте здесь он у тебя спрашивает да или нет???? если делаешь SaveAs и все коректно передаешь, то ничего спрашивать не должен, дорлжен в тихую сохранить и все.
1. проверь корректные ли данные передаютя через FileNameOle серверу приложений
2. попробуй закомментить
Код
...
ExcelWorksheet1.Activate;
...

будет ли появляться данная ошибка?
3. переменная BoolOle задана?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 6.9.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Код

BoolOle    : OleVariant;


Если файл с таким именем существует, то из екзеля вываливаюсь в дельфи с сообщением выще на строчке
ExcelApplication1.ActiveWorkbook.SaveAs(FileNameOle, Fileformat, EmptyParam, EmptyParam,

Но это все из под дельфи, так то все гладко.
PM MAIL   Вверх
Albinos_x
Дата 7.9.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(klyaksa @  6.9.2010,  17:15 Найти цитируемый пост)
Если файл с таким именем существует

хм... обычо в таких местах всталяю проверку:
Код

if FileExists(fileneme) then
   deletefile(filename);


Добавлено через 34 секунды
Цитата(klyaksa @  6.9.2010,  17:15 Найти цитируемый пост)
BoolOle    : OleVariant;

с типом то понятно... с другим не скомпелируется, значение какое?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 7.9.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Albinos_x @  7.9.2010,  14:17 Найти цитируемый пост)
if FileExists(fileneme) then   deletefile(filename);

Зачем?  smile Это пусть пользователь решает, ему же ексел вопрос в случае существования задает.

PM MAIL   Вверх
Albinos_x
Дата 7.9.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(klyaksa @  7.9.2010,  15:05 Найти цитируемый пост)
Зачем?   Это пусть пользователь решает, ему же ексел вопрос в случае существования задает.

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

по существу вопроса... у тебя после или ещё где-нибудь есть обращение к  серверу приложений? как и где разрываешь связь, и как и где освобождаешь память?

пошаговая отладка также показывает ошибку после этой команды?

Цитата(klyaksa @  6.9.2010,  17:15 Найти цитируемый пост)
Но это все из под дельфи, так то все гладко. 

т.е. ошибка появляется тилько в режиме отладки? или все же при обычном запуске тоже пояавляется сообщение?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 21.9.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Albinos_x @  7.9.2010,  16:08 Найти цитируемый пост)
т.е. ошибка появляется тилько в режиме отладки? или все же при обычном запуске тоже пояавляется сообщение?

да...


А как правильно закончить работу с excel и оставить его пользователю?
PM MAIL   Вверх
Albinos_x
Дата 21.9.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



используй метод disconnect


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
klyaksa
Дата 22.9.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 15.9.2005

Репутация: нет
Всего: нет



Цитата(Albinos_x @  21.9.2010,  22:35 Найти цитируемый пост)
используй метод disconnect

ExcelApplication1.disconnect закрывает эксел... Или я что-то не так пишу?
PM MAIL   Вверх
Albinos_x
Дата 24.9.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



нет. эта команда разрывает связь. Скорее всего у тебя параметр Autoconnect стоит в True, поэтому он и закрывает его. Выставь его в false и будет тебе счастье)))


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL WWW ICQ   Вверх
wood
Дата 20.3.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 1.5.2006

Репутация: нет
Всего: нет



Подскажите, как в ворде добавить (или вставить) в существующую таблицу строки (документ был создан ранее - форма отчета).
К ворду подключаюсь через CreateOleObject( 'Word.Application' ), к таблице Table:= MSWord.ActiveDocument.Tables.Item(4);  
PM MAIL   Вверх
wood
Дата 21.3.2011, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 1.5.2006

Репутация: нет
Всего: нет



Нашел!
http://www.delphi.int.ru/articles/11/ - было бы здорово добавить к данной теме
PM MAIL   Вверх
stanlys
Дата 28.3.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Возник вопрос, даже после чтения ветки форума.
Проблема такая есть шаблон в ворде (на каждом листе: шапка, рамка, условные обозначения, исполнитель), всего 5 листов и есть 5 картинок(одна в формате bmp, остальные emf). Нужно получить лист и в центре картинка. Первая удачно вставляю, а вот дальше не получается, может быть не работает переход, так и не разобрался в чем проблема. Помогите, пожалуста.

Код


  WordApplication1.Connect;
   fnameword:=knpath+'\графика.doc';
   WordDocument1.ConnectTo(WordApplication1.Documents.Open(FNameword, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam));
   WordApplication1.Visible:=true;
   WordFindAndReplaceinWord(WordDocument1,'<KN>',kn);
   WordFindAndReplaceinWord(WordDocument1,'<AUTHOR>',author);
   ttt:=100;
   WordDocument1.Range.Find.Execute(fnameword,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam
   ,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);          picturename:=WordApplication1.ActiveDocument.Shapes.AddPicture(шаблоны+'raster.bmp',EmptyParam,EmptyParam,ttt,ttt,EmptyParam,EmptyParam,EmptyParam).Name;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).Top:=75;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).left:=180;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).Height:=550;
WordApplication1.Browser.Next;
   ttt:=100;
 picturename:=WordApplication1.ActiveDocument.Shapes.AddPicture(шаблоны+'plots.emf',EmptyParam,EmptyParam,ttt,ttt,EmptyParam,EmptyParam,EmptyParam).Name;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).Top:=75;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).left:=180;
   WordApplication1.ActiveDocument.Shapes.Item(picturename).Height:=550;

Вообщем в результате получается, что у меня все картинки на первой странице. Как решить эту проблему???
PM MAIL   Вверх
Ptica_Oz
Дата 17.11.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Здравствуйте, уважаемые.
Строю я диаграмму в Excel: открываю шаблон с лежащей на нём пустой диаграммой, заполняю ячейки значениями, подсовываю получившуюся таблицу диаграмме. Всё работает, всё замечательно. Только вот надо мне после построения пройтись по "столбикам" (Point) и задать им конкретные цвета, те, что на генерировал Excel не устраивают smile Записала для этого дела макрос:
Код

    ActiveSheet.ChartObjects("DropUot").Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(6).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent1
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0
        .Solid
    End With
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
        .Solid
    End With


А вот перевести на свой язык не получается.
Вообще-то я пишу на C#, но подобная проблема возникает и на Delphi на сколько я могу судить по этому
Помогите, пожалуйста, примером на Delphi или C# 
PM MAIL   Вверх
Ptica_Oz
Дата 18.11.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Разобралась!  smile 
Простите, код на C#
Код

 foreach (var point in chartPage.SeriesCollection(1).Points)
{
    point.Format.Fill.ForeColor.RGB = (int)XlRgbColor.rgbRed;
}

PM MAIL   Вверх
findme
Дата 18.11.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Подскажите, как скопировать выделенную область ячеек в другой лист?
PM MAIL   Вверх
cadil
Дата 30.1.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.1.2012

Репутация: нет
Всего: нет



Есть команда следующего вида -
Код

Excel.workbooks[1].worksheets[1].cells[j, 2] := Edit2.Text;

У меня два вопроса (да простит меня модератор!):
1.  Редактор Дельфи worksheets, cells помечает как незадекларированные идентификаторы, хотя команда работает. Как исправить эту ошибку?
2. Как из ячейки cells[j, 2]записать информацию, например, в Edit2?
Заранее благодарю!
PM MAIL   Вверх
serafim0
  Дата 30.1.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.3.2011

Репутация: нет
Всего: нет



подскажите кто знает, как получить текст выделенного в ячейке текста из excel в переменную или же начало - конец выделения?
 я так понимаю надо смотреть в сторону XlReferenceStyle? 2-ой день ищу бестолку.. ((
пока одна мысль - вызывать метод xlCopy, но это не совсем то что-бы хотелось.

Это сообщение отредактировал(а) serafim0 - 30.1.2012, 19:01
PM MAIL   Вверх
Akella
Дата 13.3.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18476
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329



PM MAIL   Вверх
jDeuterium
Дата 27.3.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.3.2012

Репутация: нет
Всего: нет



Подскажите, как вставить данные из базы в Excel?
с помощью WordApplication я понял как:
Код
worddocument1.Tables.Item(2).cell(k,2).range.insertAfter