Поставим задачу – печатать в наш отчет содержимое DBGrid при
нажатии на кнопку. Это бывает удобно, поскольку часто в DBGrid отправляется уже
отработанная для пользователя информация, которая может подойти и для отчета. Т.о.
возможно не будет возникать необходимость в предварительной подготовки данных и
все сведется к простому коду. Для этого воспользуемся модулем MyWord. Код
нажатия на клавишу «Печать отчета» выглядит следующим образом:
uses
MyWord;
procedure
TForm1.Button2Click(Sender: TObject);
var
table:integer;
begin
if
CreateWord then begin
VisibleWord(false);
AddDoc;
Table1.DisableControls;
WordTableAddFromDBGrid(DBGrid1,true,table);
VisibleWord(true);
Table1.EnableControls;
end;
end;
Сначала мы «создали» Word с помощью CreateWord, затем добавили документ AddDoc и добавили нашу таблицу.
Обратите внимание, что видимым Word мы сделаем после добавления таблицы – это сократит
и без того большое время работы. Особенно необходимо следить, что бы Word не
оставался невидимым или не работал в фоновом режиме, когда нам это не нужно, это
может занимать много памяти. Для завершения работы используйти CloseWord
С помощью того же модуля можно сохранить документ в файл
SaveDocAs('1.doc');
Аналогично делается, когда исходная информация содержится в StringGrid, для этого
используйте procedure GetStringGridInTable
Воспользовалась Вашим примером. Все получилось. Только в конце таблицы он вставляет по средине страницы число "32". от куда оно и как его убрать? Метод FindAndPasteTextDoc не находит его. Спасибо.
if CollSize then ColWidth := DBGrid.Columns.Items[0].Width; // W.Selection.Tables.Item(Table).Columns.Item(1).SetWidth(ColumnWidth:=ColWidth,Rul erStyle:=wdAdjustNone); For j := 0 To Col - 1 Do begin S := DBGrid.Columns.Items[j].Title.Caption; SetWordTablesCellValue(table, 1, j + 1, S); if CollSize then ColWidth := DBGrid.Columns.Items[j].Width; // W.Selection.Tables.Item(Table).Columns.Item(j+1). // SetWidth(ColumnWidth:=ColWidth,RulerStyle:=wdAdjustNone); end; DBGrid.DataSource.DataSet.First; For i := 1 To Row - 1 Do begin For j := 0 To Col - 1 Do SetWordTablesCellValue(table, i + 1, j + 1, DBGrid.Columns.Items[j].Field.AsString); DBGrid.DataSource.DataSet.Next; end; DBGrid.DataSource.DataSet.First; W.ActiveDocument.Tables.Item(table).AutoFitBehavior(wdAutoFitContent); end;
Ни в этой процедуре, ни в других, которые используются в этой, ничего не увидела. Число 32 возникает прям сразу после таблицы. Кстати, еще использую процедуру getstringgridintable для вставки таблицы с данными из stringgrid. Так при ее использовании после таблицы появляется 3232. Единственное общее у этих процедур это CreateTable. Там вроде ничего нет. А еще там есть вставка нового абзаца. Может он пробел (' ') как то перешифровывает.
Ответ: Да, по всей видимости вы правы, возможно он так интерпретирует знак пробела или переноса или что-то. Попробуйте пойти по шагам и поймать момент, когда происходит вставка 3232 - тогда вы поймете в чем проблема!