Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как данные из dbgrid поместить в excel для распечатки? [D5, D6, dBase, FoxPro]


Wlad Gorohov ©   (2002-09-29 00:33:00) 

Низкий поклон мастерам, чайнику не поможете?
Данные в dbgrid попадают исходя из sql скрипта, как их отправить на страницу EXCEL для распечатки?
Почему не quickreport спросите, там проблема с принтером, выдаем данные в qrdbtext, при предварительном просмотре все правильно показывается на русском и нормального размера, но потом при распечатке принтер печатает очень мелко, там 1 или 2 размер шрифта, и отечественые буквы превращаются в иероглифы, может это поможете полечить, мне надо одно из двух.


turusov   (2002-09-30 11:21:00) [1]

//Содержимое DataSource в Excel учитывая состояние Visible
Для увеличения скорости передачи передаю Массив из массивов. Проблема можетбыть при передаче дат ниже 01.01.1900 года
procedure TNsExcel2000.PutDataSource(cVisible: boolean; Owner: TComponent = Nil);
var
Row, Col: integer;
RowCount: integer;
PutOk, bStop: boolean;
Arr: TNsVarArray;
A: variant;
AOwner: TComponent;
BS: TBookmarkStr;
L: TStringList;
procedureGetVisibleField(List: TStrings);
var
k: integer;
begin
List.Clear;
if Assigned(AOwner) then
if AOwner is TDataSet then begin
for k:= 0 to (AOwner as TDataSet).Fields.Count-1 do
if cVisible then begin
if (AOwner as TDataSet).Fields[k].Visible then
List.Add((AOwner as TDataSet).Fields[k].FieldName);
end
else
List.Add((AOwner as TDataSet).Fields[k].FieldName);
end//if
else
if AOwner is TDBGrid then begin
for k:= 0 to (AOwner as TDBGrid).Columns.Count-1 do
if cVisible then begin
if (AOwner as TDBGrid).Columns[k].Visible then
List.Add((AOwner as TDBGrid).Columns[k].FieldName);
end
else
List.Add((AOwner as TDBGrid).Columns[k].FieldName);
end//if
end;
begin
try
if Connected AND (VarType(NsWorkbook) = varDispatch) AND
Assigned(FDataSource) then
if FDataSource.DataSet.Active then begin
if Assigned(Owner) then AOwner:= Owner
else AOwner:= FDataSource.DataSet;
RowCount:= 2;
try
L:= TStringList.Create;
GetVisibleField(L);
PutStrings(1,1,L);
Arr:= TNsVarArray.Create(BlockSize,L.Count);//FDataSource.DataSet.FieldCount);
A:= VarArrayCreate([1,Arr.ColumnCount], varVariant);
BS:= FDataSource.DataSet.Bookmark;
FDataSource.DataSet.DisableControls;
FDataSource.DataSet.First;
repeat
for Row:= 1 to Arr.LinesCount do begin
for Col:= 1 to Arr.ColumnCount do
A[Col]:= FDataSource.DataSet.FieldByName(L[Col-1]).Value;
Arr.AddVarArray(A);
FDataSource.DataSet.Next;
if FDataSource.DataSet.Eof then Break;
end;
RowCount:= PutRows(RowCount,Arr.ArrayDim2);
Arr.Clear;
if RowCount = 0 then Break;
if Assigned(FOnNsProgress) then begin
bStop:= False;
FOnNsProgress(RowCount-2,FDataSource.DataSet.RecordCount,bStop);
if bStop then Break;
end;
until (RowCount >= FDataSource.DataSet.RecordCount);
finally
FDataSource.DataSet.EnableControls;
FDataSource.DataSet.Bookmark:= BS;
L.Free; Arr.Free;
end;
end;//if
except
on E:Exception do begin
MessageBox(Forms.Application.Handle,PChar(nseDataSource), PChar(nseExcel),MB_OK OR MB_ICONHAND);
end;
end;
end;
unit NsVarArrayUnit; Урезаю
procedure TNsVarArray.AddVarArray(ArrayDim1: variant);
var k, k1: integer;
begin
if VarArrayDimCount(FArrDim2) = 2 then
if VarIsArray(ArrayDim1) then begin
if VarArrayDimCount(ArrayDim1) <> 1 then
raise Exception.Create(*
if (VarArrayHighBound(ArrayDim1,1)-VarArrayLowBound(ArrayDim1,1))+1 <> ColumnCount then
raise Exception.Create(*
try inc(FPos);
k1:= VarArrayLowBound(FArrDim2,2);
for k:= VarArrayLowBound(ArrayDim1,1) to VarArrayHighBound(ArrayDim1,1) do begin
FArrDim2[FPos,k1]:= ArrayDim1[k];
inc(k1);
end;
except
dec(FPos);
raise;
end;
end;
end;


Tatyana   (2002-09-30 09:47:00) [2]

Печать можно осуществить различными способами.
Например можно использовать компоненты следующих классов TExcelApplication; TExcelWorkbook;TExcelWorksheet и далее можешь связываться при помощи раннего или познего связывания, я рекомендую первое быстродействие увеличивается.


Praco   (2002-09-30 08:57:00) [3]

В DBGridEh довольно просто сохранить в Excel или распечатать выделенный фрагмент или весь грид. Рекомендую.


aus   (2002-09-30 08:17:00) [4]

Если X - порядковый номер поля, а Y - номер записи, то учитывая, что курсор стоит на первой записи набора данных, используй
MoveBy(Y) и DBGrid1.SelectedField := DBGrid1.Fields[X]
Примерно так, хотя могут быть варианты.


Wlad Gorohov   (2002-09-29 23:39:00) [5]

Еще вопрос по DBGRID давно мучает:
Как обратиться с ячейке DBGRID с координатами X Y?


aus   (2002-09-29 22:36:00) [6]

Сделай макрос в Excel, выбери данные и вставь в нужное место
Range("a1").CopyFromRecordset RS
где RS - твой набор данных.
Это самый быстрый способ.
Но способов еще полно, так же как и описаний их на этом форуме.
Поищи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо