Ошибка формирования таблицы в документе Word из базы данных Msaccess

kostarev

New Member
22.09.2009
1
0
37
Омск
#1
// Функция FindRowColumnInTable находит текстовую константу и
// возвращает таблицу, а также номер строки и столбца где находится
// эта константа
function FindRowColumnInTable(FindText: string; var tab: variant;
var Row,Column:integer):boolean;
begin
FindRowColumnInTable:=false;
try
W.Selection.Find.Text:=FindText;
if W.Selection.Find.Execute then begin
Column:=W.Selection.Cells.Item(1).ColumnIndex;
Row:=W.Selection.Cells.Item(1).RowIndex;
tab:=W.Selection.Tables.Item(1);
FindRowColumnInTable:=true;
end;
except
FindRowColumnInTable:=false;
end;
end;

begin
// Создаем объект Word.Application и поместим ссылку на него
// в переменную W: variant
W:=CreateOleObject('Word.Application');

// Сделаем окно приложения Word видимым
W.Visible:=true;
// Отобразим все необходимые панели управления приложения Word
for a_:=1 to W.CommandBars.Count do
W.CommandBars.Item[a_].Enabled:=true;

// Создаем новый документ по шаблону
W.documents.Add(ExtractFileDir(Application.ExeName)+'\Шаблон СЧЕТ.docx');
messagebox(handle,'Шаблон создан! Переходим к заполнению.','Внимание!',0);
// Подставляем текст в заголовок документа
FindAndInsert('###НОМЕР&',DM.ADONaklad.Fields[0].AsString);
FindAndInsert('###Дата&',DateToStr(DM.ADONaklad.Fields[1].AsDateTime));
FindAndInsert('###ПРОДАВЕЦ&','ОАО Балтика');
FindAndInsert('###АДРЕС_ПРОДАВЦА&',
'г. Санкт-Петербург, ул. Кузнечная, 5');
FindAndInsert('###ИНН_ПРОДАВЦА&','1234567890');
FindAndInsert('###ГРУЗООТПРАВИТЕЛЬ&','ОАО Балтика');
FindAndInsert('###ГРУЗОПОЛУЧАТЕЛЬ&',DM.ADOZakazcik.Fields[1].AsString+
' г. Санкт-Петербург, '+DM.ADOZakazcik.Fields[2].AsString);
FindAndInsert('###ДОКУМЕНТ&',' ');
FindAndInsert('###ДАТА_ДОКУМЕНТА&',' '{datetostr(date)});
FindAndInsert('###ПОКУПАТЕЛЬ&',DM.ADOZakazcik.Fields[1].AsString);
FindAndInsert('###АДРЕС_ПОКУПАТЕЛЯ&',' г. Санкт-Петербург, '
+DM.ADOZakazcik.Fields[2].AsString);
FindAndInsert('###ИНН_ПОКУПАТЕЛЯ&','0987654321');

// Если нашли текстовую константу, то переходим к формированию
// табличной части
if FindRowColumnInTable('###ТАБЛИЦА&',table_,Row_,Column_)then begin
// Перед началом формирования курсор находится в таблице table_
// в ячейке Cell(Row_,Column_)
k_:=0;
if not DM.ADOSnakl.IsEmpty then
with DM.ADOSnakl do
begin
First;
repeat k_:=k_+1;
until not FindNext;
end;
sum_:=0;
// Добавляем в таблицу необходимое количество пустых строк
if k_>1 then W.Selection.InsertRows(k_-1);

// Формируем табличную часть документа
if not DM.ADOSnakl.IsEmpty then
with DM.ADOSnakl do
begin
First;
repeat
table_.Cell(Row_,Column_+0).Range.Text:=DM.ADOIzdelie.Fields[1].AsString;
table_.Cell(Row_,Column_+1).Range.Text:=DM.ADOIzdelie.Fields[2].AsString;
table_.Cell(Row_,Column_+2).Range.Text:=
IntToStr(DM.ADOSnakl.Fields[2].AsInteger);
table_.Cell(Row_,Column_+3).Range.Text:=
CurrToStr(DM.ADOIzdelie.Fields[3].AsCurrency);
table_.Cell(Row_,Column_+4).Range.Text:=
CurrToStr(DM.ADOSnakl.Fields[5].AsCurrency);
table_.Cell(Row_,Column_+6).Range.Text:=' ';
table_.Cell(Row_,Column_+7).Range.Text:=' ';
table_.Cell(Row_,Column_+8).Range.Text:=' ';
sum_:=sum_+DM.ADOSnakl.Fields[5].AsCurrency;

Inc(Row_);
until not FindNext;
end;

// Формируем подпись табличной части документа
if FindRowColumnInTable('###ИТОГ&',table_,Row_,Column_)then begin
table_.Cell(Row_,Column_+0).Range.Text:=CurrToStr(sum_);
table_.Cell(Row_,Column_+1).Range.Text:=' ';
table_.Cell(Row_,Column_+2).Range.Text:=' ';
end;
end;

// Заполняем текст в окончании документа
FindAndInsert('###ВСЕГО_К_ОПЛАТЕ&',
CurrToStr(DM.ADONaklad.Fields[2].AsCurrency)+' руб.');

// Изменяем масштаб отображения документа
W.ActiveWindow.ActivePane.View.Zoom.Percentage:=100;

// Сохраняем документ на диске
W.ActiveDocument.SaveAs('D:\Учеба институт\My База\СЧЕТ.docx');
if W.ActiveDocument.Saved
then messagebox(handle,'Документ сохранен!','Внимание!',0)
else messagebox(handle,'Документ не сохранен!','Внимание!',0);

// Закрываем документ и приложение Word, освобождаем память
W.ActiveDocument.Close;
W.Quit;
W:=UnAssigned;

end;