Показать сообщение отдельно
  #4  
Старый 22.12.2008, 01:53
жекаизжека жекаизжека вне форума
Начинающий
 
Регистрация: 10.09.2008
Сообщения: 193
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
а тебе тоже надо в табличку?
Просто с табличкой там чуть посложнее. используется хитрый фокус с тем, сто при нажатии какой-то клавиши ворд сам добавляет строку.

А если без таблички, то смотри в ФАКе - примеров полно. Там практически тоже, что и с Экселем, но проще, т.к. нет листов.

Вот нашел, только как мне от запроса избавиться?
Код:
procedure TForm1.TableExport(DataSet:TDataSet; Title, FlagText:string);
var
i,ColCount,  //количество колонок в таблице
TableBeg,     //Номер символа в начале таблицы
TableBeg2     //Номер символа в начале данных таблицы
:integer;
vr1,vr2:OleVariant;
f:boolean;
st:string;

Function ConvertString(S:string):string;
{это, казалось бы глупая функция, делает очень важное дело. При формировании
таблицы в качестве разделителя по умолчанию используется "-", который
может встречаться в экспортируемых записях. В этом случае в таблицу
преобразутеся абсолютно неверно. Что бы избежать этого, мы меняем
обычный "-" на символ с кодом #173, который отображается точно так-же}
Begin
Result := StringReplace(S, '-', #173,[]);

End;
Begin
{Процедура экспортирует лишь те записи датасета, у которых
значение последнего поля совпадает с FlagText
Если FlagText='' то экспортируются все записи.
Это связано с тем, что зачастую нужно разнести в разные
таблицы записи, полученные в результате долгого запроса}


  Application.ProcessMessages;
  vr1:=wdStory;
  w1.Selection.EndKey(vr1,EmptyParam); //переходим в конец документа
//вставляем заголовок таблицы
  W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(Title);
//далее идут настройки, что-бы заголовок не отрывался от основной таблицы
//и все красиво выглядело
  W1.ActiveDocument.Paragraphs.Item(w1.ActiveDocument.Paragraphs.Count).Range.Select;
  W1.Selection.ParagraphFormat.KeepWithNext:=-1;
  W1.Selection.ParagraphFormat.SpaceAfter:=14;
  W1.Selection.Font.Size:=15;         //применяем шрифт
  W1.Selection.Font.bold:=1;
  W1.ActiveDocument.Paragraphs.Add(EmptyParam); //добавляем строчку
                                                //выбираме ее
  W1.ActiveDocument.Paragraphs.Item(w1.ActiveDocument.Paragraphs.Count).Range.Select;
  W1.Selection.ParagraphFormat.SpaceAfter:=0;
  vr1:=wdStory;
  w1.Selection.EndKey(vr1,EmptyParam); //переходим в конец документа
//запоминаем положение курсора. Это - начало будущей таблицы.
//потом выберем весь оставшийся текст, что-бы преобразовать его в таблицу
//Во ворде есть такая фунция "Преобразовать в таблицу" ею и воспользуемся
  TableBeg:=W1.Selection.End_;
  DataSet.First;
//вставляем заголовки для всех видимых полей
  for i:=0 to DataSet.FieldCount-1 do
    if DataSet.Fields[i].Visible then
      W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(convertstring(DataSet.Fields[i].DisplayLabel)+#9);
  Application.ProcessMessages;
  w1.Selection.EndKey(vr1,EmptyParam);
//убираем последний символ табуляции
{Вообще символ табуляции используется в качесве разделителя для столбцов таблиццы}
  w1.Selection.TypeBackspace;
//применяем шрифт
  W1.ActiveDocument.Paragraphs.Item(w1.ActiveDocument.Paragraphs.Count).Range.Select;
  W1.Selection.Font.Size:=14;
  W1.Selection.Font.Italic:=1;
  W1.Selection.Font.bold:=0;

//добавляем строчку
  W1.ActiveDocument.Paragraphs.Add(EmptyParam);
  f:=true;//флаг для определения, были ли в таблице вообще записи для экспорта
  st:=''; //в эту стрчку будем экспортировать текст таблицы
  TableBeg2:=W1.Selection.End_;   //начала данных в таблице

if dataset.RecordCount>0 then begin
  Repeat
    Application.ProcessMessages;
    if (dataset.fields[DataSet.Fields.Count-1].AsString=FlagText) or (FlagText='')
      then begin
        for i:=0 to DataSet.FieldCount-1 do
           if DataSet.Fields[i].Visible then
               st:=st+DataSet.Fields[i].AsString+#9; //через табуляцию выводим все видимые поля
        SetLength(st,length(st)-1);                  //убираем последний символ табуляции
        st:=st+#13;                                  //перенос строки
        f:=false;
           end;
    dataset.Next;
  until dataset.Eof;
  w1.Selection.EndKey(vr1,EmptyParam);//уходим в конец текста
  W1.Selection.InsertAfter(convertstring(st));       //вставляем данные таблицы
  vr1:=TableBeg2;                     //начало данных таблицы
  vr2:=W1.Selection.End_;             //конец таблицы
  W1.Selection.Font.Size:=12;
  W1.Selection.Font.bold:=0;
  W1.Selection.Font.Italic:=0;
                             end;
//в том случае, если не экспортировалось ни одной записи
//формируем пустую строчку
  if f then begin
    for i:=0 to DataSet.FieldCount-1 do
      if DataSet.Fields[i].Visible then
        W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(' '+#9);
    w1.Selection.EndKey(vr1,EmptyParam);
    w1.Selection.TypeBackspace;
            end;
   Application.ProcessMessages;
   vr1:=TableBeg;//начало будущей таблицы
   vr2:=W1.Selection.End_;//конец будущей таблицы
   W1.ActiveDocument.Range(vr1,vr2).Select;//выбираем этот диапазон
//и преобразуем его в таблицу
   W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   colcount:=1;
//выставляем ширины колонок
    for i:=0 to DataSet.FieldCount-1 do
      if DataSet.Fields[i].Visible then begin
        W1.ActiveDocument.Tables.Item(W1.ActiveDocument.Tables.Count).Columns.Item(colcount).Width:=DataSet.Fields[i].Tag;
        inc(colcount);
        Application.ProcessMessages;
                                        end;

  TableLineSet; //эта процедура раскрашивает таблицу нужным образом
  W1.ActiveDocument.Paragraphs.Add(EmptyParam);
  W1.ActiveDocument.Paragraphs.Item(w1.ActiveDocument.Paragraphs.Count-1).Range.Select;
  W1.Selection.ParagraphFormat.KeepWithNext:=0;

End;

Procedure TForm1.TableLineSet; //процудура проирсовывает соответсвующие границы таблицы
Begin
  w1.Selection.Cells.Borders.Item(wdBorderLeft).LineStyle:=wdLineStyleSingle;
  w1.Selection.Cells.Borders.Item(wdBorderRight).LineStyle:= wdLineStyleSingle;
  w1.Selection.Cells.Borders.Item(wdBorderHorizontal).LineStyle:= wdLineStyleSingle;
  w1.Selection.Cells.Borders.Item(wdBorderTop).LineStyle:= wdLineStyleSingle;
  w1.Selection.Cells.Borders.Item(wdBorderBottom).LineStyle:= wdLineStyleSingle;
  w1.Selection.Cells.Borders.Item(wdBorderVertical).LineStyle:= wdLineStyleSingle;

End;

procedure TForm1.WInit;
Begin
//для избежания глюков полезно убивать используемые компоненты
//и потом их создавать заново...
 W1.free;
 W1:=TWordApplication.Create(Form1);
 w1.connectkind:=ckNewInstance;//Что бы всегда новое приложение запускалось


End;

procedure TForm1.Button2Click(Sender: TObject);
var
vr1,vr2,vr3,vr4,vr5:OleVariant;
begin
vr1:=0;
vr2:=false;
vr3:='Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\Dataware\Deplhi7\Для статьи\db1.mdb;Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=5;';
vr4:='SELECT Телефон, Корпус FROM QMain ORDER BY ФИО';
vr5:=GetCurrentDir+'\db1.mdb';
winit;
try
w1.Connect;
w1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
w1.Visible:=true;
w1.Selection.Range.InsertDatabase(vr1,vr1,vr2,vr3,vr4,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,vr5,EmptyParam,EmptyParam,EmptyParam);

except
w1.Disconnect;
end;


end;

и что тут по вашему лишнее?
Ответить с цитированием