![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать в MS Word [D6, D7, 2000, XP]
Officeman © (2007-02-05 10:18:00)Доброе время суток!
Передаю контент ListView (LVprice) в MS Word.
Используя для target вставки 'Закладки'
Происходит:
1) открытие Word
2) переход к нужной 'Закладки'
3) посторочная передача данных
4) остановка передачи.
и если во время передачи данных [3], нажать несколько раз мышью.
но передача прерывается и таблица остаётся незаполненной.
либо заполняется наперекосяк.
вопрос: как блокировать мышь до завершения передачи данных.
или испольщовать другой способ. например передавать а потом показывать Word
Var
S,Info : string;
i,Nn : integer;
Sum : double;
Tv, Ss : PChar;
MsWord: Variant;
begin
try
MsWord := GetActiveOleObject('Word.Application');
except
try
MsWord := CreateOleObject('Word.Application');
MsWord.Visible := True;
except
ShowMessage('Не могу запустить Microsoft Word');
Exit;
end;
end;
S:=AppDir+'data\newlist.doc'; //имя открываемого документа
DDE1.DdeTopic:=MsWord;
DDE1.OpenLink; //устанавливаем связь
Tv:=StrAlloc(20000); Ss:=StrAlloc(300); //выделяем память
//даем команду открыть документ и установить курсор
//в начало документа
StrPCopy(Tv, '[FileOpen "'+S+'"][StartOfDocument]');
S:='1'; //номер документа
{ ШАПКА }
Info:=Form7.addinfo.Text;
StrCat(Tv, StrPCopy(SS, '[EditBookmark.Name = "Info", .Goto][Insert "'+Info+'"]'+'[EditBookmark .Name = "Table", .Goto]'));
if not DDE1.ExecuteMacro(Tv, false) then
begin
MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0);
StrDispose(Tv); StrDispose(Ss);
exit;
end;
{ТАБЛИЦА}
{ Заполняем таблицу }
Sum:=0; Nn:=0;
for i:=0 to LVprice.Items.Count-1 do
begin
inc(Nn);
StrPCopy(Tv, '[Insert "'+inttostr(Nn)+'"][NextCell][Insert "'+LVprice.Items[i].subitems[1]+'"]'+
'[NextCell][Insert "'+LVprice.Items[i].subitems[2]+'"][NextCell][Insert "'+LVprice.Items[i].subitems[3]+'"][NextCell]');
if not DDE1.ExecuteMacro(Tv, false)
then begin
MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0);
exit;
end;
end;
StrDispose(Tv); StrDispose(Ss);
Officeman (2007-02-07 14:04:00) [1]VBA почитал. получилось! ура! ;)
mydoc := MSWord.Documents.Open(FileName:=AppDir+'Data\mydoc.doc');
//таблица
myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');
MyTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count+1, 4);
MyTable.Cell(1, 1).Width :=40;
MyTable.Cell(1, 2).Width :=300;
MyTable.Cell(1, 3).Width :=100;
MyTable.Cell(1, 4).Width :=60;
MyTable.Cell(1, 1).Range.InsertAfter('н.п.');
MyTable.Cell(1, 2).Range.InsertAfter('Наименование');
MyTable.Cell(1, 3).Range.InsertAfter('Цена');
MyTable.Cell(1, 4).Range.InsertAfter('Гарантия');
for i := 2 to LVprice.Items.Count+1 do
begin
MyTable.Cell(i, 1).Width :=40;
MyTable.Cell(i, 2).Width :=300;
MyTable.Cell(i, 3).Width :=100;
MyTable.Cell(i, 4).Width :=60;
myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i-1));
for j := 1 to 3 do
myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i-2].subitems[j]);
end;
myTable := Unassigned;
myBookmark := Unassigned;
mydoc := Unassigned;
MSword := Unassigned;
end;
Officeman (2007-02-07 13:30:00) [2]да. таблица формируется нормально. только все столбцы одинаковой ширины.
umbra (2007-02-07 12:03:00) [3]а у Вас хоть таблица то появляется? Вот эта строка кода
> myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');
предусматривает переход к закладке с именем table. Есть в Вашем документе такая закладка? Если нет - ничего не получится.
P.S. И неплохо бы Вам все же попытаться почитать справку по VBA для Word (идет в комплекте с оффисом)
Officeman (2007-02-07 11:48:00) [4]это я понимаю, но немогу найти ошибку. поэтому привожу кусок кода.
пожалуста кому знакомо. отпишите
YurikGL (2007-02-07 11:38:00) [5]
> ошибка "запрашиваемый номер семейства не существует"
Обращаешься к несущесвующей ячейке или таблице
Officeman (2007-02-07 10:57:00) [6]
> umbra © (06.02.07 13:45) [17]
> myTable.Columns[1].Width := 20;
Этот метод пробовал, не получется.
Нужно прописывать до таблицы или после?
//таблица
myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');
MyTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count+1, 4);
MyTable.Columns[1].Width := 20;
MyTable.Columns[2].Width := 120;
MyTable.Columns[3].Width := 40;
MyTable.Columns[4].Width := 20;
MyTable.Cell(1, 1).Range.InsertAfter('н.п.');
MyTable.Cell(1, 2).Range.InsertAfter('Наименование');
MyTable.Cell(1, 3).Range.InsertAfter('Цена');
MyTable.Cell(1, 4).Range.InsertAfter('Гарантия');
for i := 2 to LVprice.Items.Count+1 do
begin
myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i-1));
for j := 1 to 3 do
myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i-2].subitems[j]);
end;
ошибка "запрашиваемый номер семейства не существует"
umbra (2007-02-06 13:45:00) [7]
> а) как задать ширину для 4 столбцов: 20, 120, 40, 20
myTable.Columns[1].Width := 20;
и т.д.
> б) как прописать шапку. "н.п., Наименование, Цена, Гарантия"
>
myTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count + 1, 4);
myTables.Cells(1, 1).Range.InsertAfter('н.п.');
// и т.д.
for i := 0 to LVprice.Items.Count - 1 do
begin
myTable.Cell(i + 2, 1).Range.InsertAfter(IntToStr(i + 2));
for j := 1 to 3 do
myTable.Cell(i + 2, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
end;
Neket (2007-02-06 12:39:00) [8]А название
так
XLApp.Workbooks[1].WorkSheets[1].Name:=name;
Neket (2007-02-06 12:33:00) [9]Работая с Exele-м я задава ширину стобцов так:
Colum:=XLApp.Workbooks[1].WorkSheets[RealTimZapr].Columns;
Colum.Columns[1].ColumnWidth:=20;
Colum.Columns[2].ColumnWidth:=20;
..... и.д.
Может поможет :-(
Elen (2007-02-06 12:24:00) [10]
> Officeman
Ну чтоб ответить на вот это тебе придется изучать состав Ворда например через справку по VBA в макросах ворда или в книгах. Удачи! :)
Officeman (2007-02-06 12:21:00) [11]по тексту модуля, в цикле добавляем строки:
for i := 0 to LVprice.Items.Count - 1 do
begin
myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i));
for j := 1 to 3 do
myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
end;
вопрос:
а) как задать ширину для 4 столбцов: 20, 120, 40, 20
б) как прописать шапку. "н.п., Наименование, Цена, Гарантия"
Officeman (2007-02-06 07:22:00) [12]спасибо! попробую так.
Neket (2007-02-05 16:32:00) [13]
> umbra © (05.02.07 16:28) [10]
Я впринципе это и имел ввиду только необходимо учитывть в целях избежания неприятностей какой модуль подключать
Word97, Word2000 или WordXP.
umbra (2007-02-05 16:28:00) [14]
uses ..., Word97, ...;
{...............................}
Var
i, j : integer;
MsWord, myDoc, myBookmark, myTable: Variant;
begin
try
MsWord := GetActiveOleObject('Word.Application');
except
try
MsWord := CreateOleObject('Word.Application');
MsWord.Visible := True;
except
ShowMessage('Не могу запустить Microsoft Word');
Exit;
end;
end;
mydoc := MSWord.Documents.Open(FileName:='c:\mydoc.doc');
myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='закладка');
myTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count, 4);
for i := 0 to LVprice.Items.Count - 1 do
begin
myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i));
for j := 1 to 3 do
myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
end;
mydoc.Save;
myTable := Unassigned;
myBookmark := Unassigned;
mydoc := Unassigned;
MSword := Unassigned;
end;
Elen (2007-02-05 15:54:00) [15]
> а как без DDE сделать на моём примере ?
На твоем убрать DDE и применить способности Ворда типаWordDocument1.Range.InsertBefore('текст')
Ну это ты можеш увидеть расставив на форме из servers TWordApplication и TWordDocument. они подскажут что можно вызывать из твоей MsWord.
Neket (2007-02-05 15:53:00) [16]А если использовать WRDApp:= CreateOleObject('Word.Application');
и подключаеш Word2000
Или посмотри пример здесь
C:\Program Files\Borland\Delphi7\Demos\ActiveX\OleAuto\Word8
Officeman (2007-02-05 15:37:00) [17]а фиг его знает). а как без DDE сделать на моём примере ?
Elen (2007-02-05 13:44:00) [18]
> неа) не помогает ни одна из предложенных таблеток.
В таком случае передавай без DDE
umbra (2007-02-05 13:41:00) [19]2 Officeman ©
а зачем Вам ДДЕ?
Officeman (2007-02-05 13:33:00) [20]неа) не помогает ни одна из предложенных таблеток.
так как при добавлении данных в Word, активное окно Word-а.
и после нескольких кликов. происхолдит сбой передачи данных.
;(