Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 17:50   #1
Mr_skiner
Пользователь
 
Аватар для Mr_skiner
 
Регистрация: 21.05.2010
Сообщений: 56
По умолчанию Работа с Word.

В общем запарился я с работой в Word средствами Делфей. Нужно сформировать небольшой отчет из таблицы.
Порыскав в интернете я нашел вариант с "оле" объектами. Собственно сам вопрос:
1) Как сделать Разрыв на новую страницу
2)Как выровнять по центру строчку 'Название отчета'
3) Может быть "Оле" уже давно устарело и нужно это все делать как то по другому?

Код:
  Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
  Word.Documents.Add;
Word.ActiveDocument.Range.InsertAfter('Название отчета');
  for i:=1 to StringGrid1.RowCount-1 do
  begin
   Word.ActiveDocument.Range.InsertAfter(inttostr(i)+'. ');
    for j:=1 to  TrackBar1.Position+1 do
      begin
        if s[j] <>' ' then
        Word.ActiveDocument.Range.InsertAfter(#9+ s[j]+') ');
        Word.ActiveDocument.Range.InsertAfter(StringGrid1.Cells[j,a[i]]+#13);
      end;
          Word.ActiveDocument.Range.InsertAfter(' '+#13);
  end;
Mr_skiner вне форума Ответить с цитированием
Старый 12.04.2013, 09:55   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
1) Как сделать Разрыв на новую страницу
Копать в сторону InsertBreak. К сожелению под рукой документации нету.
Цитата:
2)Как выровнять по центру строчку 'Название отчета'
Код:
const
  wdAlignParagraphLeft = $00000000;
  wdAlignParagraphCenter = $00000001;
  wdAlignParagraphRight = $00000002;
  wdAlignParagraphJustify = $00000003;
  wdAlignParagraphDistribute = $00000004;
  wdAlignParagraphJustifyMed = $00000005;
  wdAlignParagraphJustifyHi = $00000007;
  wdAlignParagraphJustifyLow = $00000008;
  wdAlignParagraphThaiJustify = $00000009

...
ParagraphFormat.Alignment := wdAlignParagraphCenter;
...
Вот, нашел в одной из папок: WordXP.zip
Это экспортированная библа типов из Word'а. Там описаны нужные интерфейсы, типы и константы.

Последний раз редактировалось Sibedir; 12.04.2013 в 09:59.
Sibedir вне форума Ответить с цитированием
Старый 12.04.2013, 11:08   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Через ОЛЕ очень даже удобно работать. А самое главное, что если нет документации, то всегда можно открыть ворд, записать макрос во время форматирования нужной Вам части текста, открыть макрос и потом это всё перенести в код Delphi и всё будет идеально работать.
FaTaL вне форума Ответить с цитированием
Старый 12.04.2013, 11:43   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от FaTaL
... всё перенести в код Delphi и всё будет идеально работать.
Не совсем так. С передачей параметров могут возникнуть проблемы. Хотя именно так я и узнал имя метода InsertBreak. И еще иногда структура объекта на встроеном VBA может отличаться от внешнего интерфейса тогоже COM-объекта.

Если вести речь: оле, не оле, то особо вариантов нет. Если не хотите вылезать за рамки Delphi, то оле. Вариантов-то особо нет. Если не оле, то макросы на VBA.

Так, еще где-то дома валяется примерчик использования COM без OleVariant. Там не Word, но принцип тот же. Работаем с COM-интерфейсом напрямую, а сам интерфейс берем из приведенного файла. Вобщем, вечером гляну.

Последний раз редактировалось Sibedir; 12.04.2013 в 12:41.
Sibedir вне форума Ответить с цитированием
Старый 12.04.2013, 13:20   #5
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Попробуйте воспользоваться модулем для MS Office
kta87 вне форума Ответить с цитированием
Старый 12.04.2013, 14:16   #6
Mr_skiner
Пользователь
 
Аватар для Mr_skiner
 
Регистрация: 21.05.2010
Сообщений: 56
По умолчанию


То же самое происходит и с InsertBreak.
Mr_skiner вне форума Ответить с цитированием
Старый 12.04.2013, 16:02   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Mr_skiner Посмотреть сообщение
1) Как сделать Разрыв на новую страницу
В место разрыва (где курсор) введите символ с кодом 12.

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

На VBA этому соответствует
Код:
Selection.TypeText chr(12)
Изображения
Тип файла: jpg Selection.TypeText(chr(12)).jpg (29.9 Кб, 136 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Старый 12.04.2013, 16:03   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Всё взял чисто как и писал выше из самого ворда и его справки (вернее справки VBA)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Word : variant;
begin
  Word := CreateOleObject('Word.Application');
  Word.Visible:=false;
  Word.Documents.Add;
  Word.ActiveDocument.Range.InsertAfter('Название отчета');
  // Тут выравниваем по центру
  Word.Selection.ParagraphFormat.Alignment := $00000001;
  // Переходим в конец документа
  Word.Selection.EndKey;
  //Вставляем разрыв
  Word.Selection.InsertBreak (Type:=7);
  // И пишем ещё что нибудь
  Word.ActiveDocument.Range.InsertAfter('Тут ещё что нибудь');
  Word.ActiveDocument.SaveAs (ExtractFilePath(ParamStr(0)) + 'Test.doc');
  Word.Quit;
end;
Работа с офисом очень проста через ОЛЕ. Ещё раз говорю - делай всё что тебе надо в ворде мышкой, при этом записывай макрос, а потом просто "перенеси" (ясное дело не просто скопируй) этот макрос в Delphi.

Последний раз редактировалось FaTaL; 12.04.2013 в 16:05.
FaTaL вне форума Ответить с цитированием
Старый 14.04.2013, 06:00   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну вот и вечер наступил
1. Импортируем библиотеку типов Word'а в Delphi: http://yandex.ru/yandsearch?text=%D0...0delphi&lr=197. Далее можно просто использовать 3 файла: Office_TLB.pas, VBIDE_TLB.pas и Word_TLB.pas (MS_Office.zip).
2. Немножко подправляем файл Word_TLB.zip.
3. Запускаем Word. Включаем запись макрова "". Делаем что нужно. Завершаем запись макроса "". Смотрим, что получилось:
Код:
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 14.04.2013 user
'
    Selection.Font.Size = 16
    Selection.Font.Bold = wdToggle
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
    Selection.TypeText Text:="ваплорвапрываолпрваорпылова"
    Selection.TypeParagraph
    Selection.Font.Size = 12
    Selection.Font.Bold = wdToggle
    Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
    Selection.TypeText Text:="ывапвыапывап"
    Selection.TypeParagraph
    Selection.TypeText Text:="ваыпывапыва"
    Selection.TypeParagraph
    Selection.TypeText Text:="пывапывап"
    Selection.TypeParagraph
    Selection.TypeText Text:="ывапывапыва"
    Selection.InsertBreak Type:=wdPageBreak
End Sub
4. Переносим это в Delphi:
Код:
implementation

uses
  Word_TLB;

function GetOleObject (ClassName: String): IDispatch;
begin
  try
    //Попытка подключиться к уже запущенному экземпляру
    Result := GetActiveOleObject(ClassName);
  except
    try
      //Попытка запустить и подключиться
      Result := CreateOleObject(ClassName);
    except
      MessageDlg ('Не удалось подключиться к "'+ClassName+'".', mtError, [mbOK], 0);
      Exit;
    end;
  end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Word: IWordApplication;
  Doc: IWordDocument;
  ws: WideString;
  i, j: Integer;
begin
  Word := GetOleObject ('Word.Application') as IWordApplication;
  Word.Visible := True;
  Doc := Word.Documents.Add (EmptyParam, EmptyParam, wdNewBlankDocument, True);
  Doc.Activate;

  Word.Selection.Font.Size := 16;
  Word.Selection.Font.Bold := wdToggle;
  Word.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
  Word.Selection.TypeText ('Название отчета');
  Word.Selection.TypeParagraph;
  Word.Selection.Font.Size := 12;
  Word.Selection.Font.Bold := wdToggle;
  Word.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
  for i := 1 to 20 do begin
    ws := IntToStr(i)+'.';
    for j := 1 to 4 do
      ws := ws + #9'"' + IntToStr(j) + '"';
    Word.Selection.TypeText (ws);
    Word.Selection.TypeParagraph
  end;
  Word.Selection.InsertBreak (wdPageBreak);

  Show;
end;
---------------------------------------------------------------------------------------------
Принципиально, отличий от варианта FaTaL здесь нет. Отличие одно и оно заключается в использовании уже готового пригодного для работы с COM-объектом Word'а интерфейса. Хотя на первых этапах может помочь существенно.

Последний раз редактировалось Sibedir; 14.04.2013 в 06:08.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работать в Word, не открывая документы (работа с закрытыми документами Word) Георгиевич Microsoft Office Word 10 07.09.2009 11:19
работа с Word arv БД в Delphi 13 24.05.2009 10:39
Работа с Word Ky3Heu, Общие вопросы Delphi 1 20.05.2009 12:06
работа с WORD Shaitan63 Помощь студентам 9 14.10.2008 07:25
Работа с Word Shuraken Общие вопросы Delphi 2 18.09.2007 10:57