Delphi вывод таблицы в word

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
procedure TForm1.N2Click(Sender: TObject);
 var
SaveChanges,OriginalFormat,RouteDocument: OleVariant;
NumRows,Count,Unit_,AutoFitBehavior,DefaultTableBehavior,FileName:OleVariant;
begin
try
WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
WordApplication1.Application.Keyboard(1049);
WordApplication1.Selection.TypeText(DateToStr(Date));
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.Font.Bold:= wdToggle;
WordApplication1.Selection.Font.Bold:= wdToggle;
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.TypeParagraph;
 
DefaultTableBehavior:=wdWord9TableBehavior;
AutoFitBehavior:=wdAutoFitFixed;
Unit_:=wdCell;
Count:=1;
WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,1,3,DefaultTableBehavior,
AutoFitBehavior);
WordApplication1.Selection.TypeText('№');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Вопрос');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText('Ответ');
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
DataModule3.ADOTable1.first;
if DataModule3.ADOTable1.recordcount>0 then
while not(DataModule3.ADOTable1.eof) do begin
WordApplication1.Selection.TypeText(DataModule3.ADOTable1.Fields[1].asstring);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText(DataModule3.ADOTable1.Fields[2].asstring);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
WordApplication1.Selection.TypeText(DataModule3.ADOTable1.Fields[3].asstring);
WordApplication1.Selection.MoveRight(Unit_,Count,EmptyParam);
NumRows:=1;
WordApplication1.Selection.InsertRowsBelow(NumRows);
DataModule3.ADOTable1.next;
end;
FileName:='h:работакурсовая по оопанкетыank.doc';
//FileFormat:=wdFormatRTF;
SaveChanges:=wdSaveChanges;
OriginalFormat:=wdWordDocument;
RouteDocument:=0;
WordApplication1.Application.Activedocument.SaveAs(FileName,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
WordApplication1.visible:=true;
WordApplication1.Disconnect;
except
on e:exception do
begin
WordApplication1.Visible:=true;
MessageDlg('!!!', mtInformation,
[mbYes], 0);
WordApplication1.Disconnect;
raise Exception.Create('!!!'+#13+e.Message);
end;
end;
 
end;
  1. Работа с таблицами

Не
позволяйте компьютеру догадаться, что
вы спешите.

Из
законов Мэрфи

Давайте
научимся вставлять таблицы в документ
Word. Каждая таблица в
программе будет представлена переменной
типа Table.
Поэтому прежде всего заведем такую
переменную:

VAR
t:Table;

При
вставке новой таблицы в документ надо
указать количество строк и столбцов в
ней. Делаетсяэтотак:

t:=WordDocument1.Tables.Add(WordApplication1.Selection.Range,

6,5,EmptyParam,EmptyParam);

Здесь
6 – число строк, а 5 – число столбцов. Не
забудьте присвоить ссылку на новую
таблицу переменной t.

Новой
таблице желательно придать приличный
вид. Чтобы линии сетки таблицы были
видны, задаем так называемый автоформат
таблицы. Здесь уже понадобятся две
переменные типа OLEVariant:
par
и par1.

par:=wdTableFormatGrid1;

par1:=wdTableFormatApplyBorders;

t.AutoFormat(par,
par1, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam);

Теперь
давайте разместим таблицу по центру
страницы:

t.Rows.Alignment:=wdAlignRowCenter;

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

t.AllowAutoFit:=True;

par:=wdAutoFitContent;

t.AutoFitBehavior(par);

Для
доступа к тексту внутри конкретной
ячейки таблицы используется ее свойство
Cell(строка,
столбец). Например,
вот так можно заполнить нашу таблицу
случайными числами (не забудьте выделить
память под целые переменные i,j
и вещественную a):

// цикл
по
ячейкам
таблицы

for i:=1 to 6
do

for
j:=1 to 5 do

begin

//
занесение значения в ячейку с координатами
i,j

t.Cell(i,j).Select;

a:=RANDOM(100);

WordApplication1.selection.InsertAfter

(FloatToStrF(a,ffFixed,10,4))

end;

Самое
трудное при работе с таблицей – это
выбраться из нее, то есть перенести
точку ввода текста и текстовый курсор
за пределы таблицы, чтобы продолжить
писать текст после нее. Делается это
так (предполагаем, что перед этим мы
выводили текст в последнюю ячейку
таблицы и курсор находится в ней):

//
Переводим курсор за пределы таблицы

par:=wdStory;

par1:=wdMove;

WordApplication1.Selection.EndKey(par,par1);

Метод
EndKey
имитирует нажатие клавиш Ctrl+End,
т.е. переход в самый конец документа,
под таблицу.

  1. Запуск Wordиз внешней программы

Общая
сумма разума на планете — величина
постоянная, а население растет…

Из
законов Мэрфи

Наша
программа, работая как СОМ-клиент,
заставляет Word сформировать
на диске doc-файл с указанным
именем. Часто желательно, чтобы по
завершении генерации этот файл оставался
бы загруженным в Word, чтобы
пользователь тут же смог его просмотреть.
Простейший способ – выбросить из
программы методы WordDocument1.Close
и WordApplication1.Quit.
Тогда созданный нами документ и весь
Word не будут закрываться.

Способ
более интересный – запуск Word
в любой момент из нашей программы и
загрузка в него файла с указанным именем.
Причем так можно запускать не только
Word, но и любую другую
программу, связанную с определенным
типом файлов (скажем, для dwg-файлов
запустится AutoCAD). Делается
это так:

ShellExecute(0,
‘OPEN’, pchar(имя файла), nil, nil, SW_MAXIMIZE)

Не
забывайте, что, если в имени файла
содержатся пробелы, то его надо взять
в кавычки. Параметр SW_MAXIMIZE
раскрывает окно Word’а на
весь экран.

Соседние файлы в папке 2 семестр

  • #
  • #
  • #
  • #

Время теряется на переключение проццесов. Чем больше таблица тем хуже.
Каждая клетка таблицы это переключение.
Сформируйте стороку данных передайте Word (один процесс) затем конвертируйте
текст в таблицу (второй процесс)
Ниже приведе текст рабочей процедуры, написанны на Delphi 6.0 для
компонентов Офиса 97. Успешно работает и с 2000

procedure Spisok_Sotrudnikov2(Name: String); 
var 
{Объявление переменных, для передачи их в качестве формальных параметров в} 
{ сервер автоматизации} 
  Shablon,FileName,Tempo,Separator,NumColumns:OleVariant; 
  i,k : Integer; 
  MyRange : Range;   {Область документа} 
  Tabl : Table;      {Одна таблица} 
  Pars : Paragraphs; {Массив параграфов} 
  Par  : Paragraph;  {Один параграф} 
  S : Array[1..9] of String; 
  Text : WideString; 
  Text1: String; 
begin 
  Screen.Cursor:=crHourGlass; 
{Оформление бегущей линейки} 
  Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=False; 
  Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=True; 
{Определяем файл шаблона документа и файл для сохранения результата} 
  Shablon:=ExtractFilePath(Application.EXEName)+'Spisok.Doc'; 
  FileName:=ExtractFilePath(Application.EXEName)+'Spisok_Sotrudnikov1.DOC'; 
{Открываем шаблон документа} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Documents.Open(Shablon,EmptyParam 
,EmptyParam,EmptyParam, 
EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                                  EmptyParam,EmptyParam); 
{Связываем компоненту с существующим интерфейсом} 
Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectKind:=ckAttachToInterface; 
Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectTo(Otchet_Spisok_Sotrudnikov. 
WordApplication1.ActiveDocument); 
{Обязательно отключить проверки орфографии и граматики в Word} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=f
alse; 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=fa 
lse; 
{Опредеоляем область документа} 
MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(EmptyParam,EmptyParam 
); 
    Tempo:=MyRange; 
{Оформляем заголовок} 
    Pars:=Otchet_Spisok_Sotrudnikov.WordDocument1.Paragraphs; 
    Par:=Pars.Add(Tempo); 
    Par.Alignment:=wdAlignParagraphCenter;  {Выравнивание параграфа} 
    Par.Range.Font.Bold:=1;          {Шрифт жирный} 
    Par.Range.Font.Size:=14;         {Размер шрифта} 
    Par.Range.Font.ColorIndex:=1;    {Цвет шрифта зеленый} 
    Par.Range.InsertBefore(Name); 
    Tempo:=Par.Range.Get_End_; {Определяем конец области} 
    MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo); 
{Формирование данных} 
       DataModule1.IBQuery2.Open; 
       DataModule1.IBQuery2.FetchAll; 
       i:=DataModule1.IBQuery2.RecordCount; 
       Otchet_Spisok_Sotrudnikov.Gauge1.MaxValue:=i; 
       Text:='? п/п@Фамилия, Имя, Отчество@Должность@Табельный номер@'; 
       for k:=1 to i do begin 
         Text1:=''; 
         Text1:=Text1+IntToStr(k)+'@'; 
         Text:=Text+Text1; 
            if not DataModule1.IBQuery2.FieldByName('FML').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('FML').Value;
            if not DataModule1.IBQuery2.FieldByName('IME').IsNull then 
               S[2]:=DataModule1.IBQuery2.FieldByName('IME').Value; 
            if not DataModule1.IBQuery2.FieldByName('OTC').IsNull then 
               S[3]:=DataModule1.IBQuery2.FieldByName('OTC').Value; 
            Text1:=S[1]+' '+S[2]+' '+S[3]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
            if not DataModule1.IBQuery2.FieldByName('NPZ').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('NPZ').Value; 
            if not DataModule1.IBQuery2.FieldByName('NSP').IsNull then 
               S[2]:=DataModule1.IBQuery2.FieldByName('NSP').Value; 
            Text1:=S[1]+' '+S[2]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
            if not DataModule1.IBQuery2.FieldByName('NNN').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('NNN').Value; 
            Text1:=S[1]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
         Otchet_Spisok_Sotrudnikov.Gauge1.Progress:=k; 
         DataModule1.IBQuery2.Next; 
                        end; 
{Передаем строку текста в Word} 
    Tempo:=MyRange; 
    Par:=Pars.Add(Tempo); 
    Par.Range.InsertBefore(Text); 
{Конвертируем текст в таблицу} 
    Separator:='@';
    NumColumns:=4; 
    MyRange.ConvertToTable(Separator,EmptyParam,NumColumns,EmptyParam, 
                           EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                           EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                           EmptyParam,EmptyParam); 
{Связываем переменную и таблицу, а затем меняем размер столбцов и 
выравнивание} 
    Tabl:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range.Tables.Item(1); 
    Tabl.Columns.Item(1).SetWidth(30,wdAdjustNone); 
    Tabl.Columns.Item(2).SetWidth(250,wdAdjustNone); 
    Tabl.Columns.Item(3).SetWidth(250,wdAdjustNone); 
    Tabl.Columns.Item(4).SetWidth(200,wdAdjustNone); 
    Tabl.Range.Paragraphs.Format.Alignment:=wdAlignParagraphCenter; 
    Tabl.Range.Cells.VerticalAlignment:=wdAlignParagraphCenter; 
    Tempo:=Par.Range.Get_End_; {Определяем конец области} 
    MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo); 
{Сохранение документа и отображение его в OLE контейнере (предварительный 
просмотр)} 
  Otchet_Spisok_Sotrudnikov.WordDocument1.SaveAs(FileName); 
  Otchet_Spisok_Sotrudnikov.WordDocument1.Close; 
{Включить проверки в Word} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=T 
rue; 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=Tr 
ue; 
  Screen.Cursor:=crDefault; 
  Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=False; 
  Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=True; 
  Otchet_Spisok_Sotrudnikov.OleContainer1.CreateLinkToFile(FileName,false); 
  Otchet_Spisok_Sotrudnikov.OleContainer1.Refresh; 
end;


Понравилась статья? Поделить с друзьями:
  • Delphi работа с excel закрыть только свой excel
  • Delphi вывод таблицы excel
  • Delphi программа для excel
  • Delphi вывод отчета в word
  • Delphi проверить что excel файл уже открыт