![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как эспортировать содержимое DBGrid в Excel !? [D6, Win2k]
beginnn © (2005-02-10 12:24:00)Здравствуйте!
Как эспортировать содержимое DBGrid в Excel !?
Ega23 (2005-02-11 11:38:00) [1]Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)
Почему сразу "экзотику"? Что, свет клином на OLE DB сошёлся?
Fareader (2005-02-11 11:35:00) [2]2Карелин Артем ©
Сорри - действительно недосмотрел :(
Карелин Артем (2005-02-11 11:33:00) [3]Кстати я автора этих статей по нескольким вопросам направлял на путь истинный в те времена.
Карелин Артем (2005-02-11 11:28:00) [4]Fareader (11.02.05 11:00) [11]
Странно. У меня 1700 страниц в масштабе 60% уходят за 46 секунд.
Советую повнимательнее посмотреть мой код.
Danilka (2005-02-11 11:14:00) [5][14] Manfred8 (11.02.05 11:10)
Их есть у меня. :)) Еще та версия, которая была бесплатная, еще не под крышей ТМС. Сам могу скинуть кому-нибудь. :))
Только ее применение гораздо более широкое, чем экспорт дбгрида.
Manfred8 (2005-02-11 11:10:00) [6]Могу скинуть на мыло
Danilka (2005-02-11 11:07:00) [7][12] Manfred8 (11.02.05 11:03)
Угу, только они платные стали, после того, как начали распостраняться ТМС, а не разработчиком.
Manfred8 (2005-02-11 11:03:00) [8]Есть замечательные компаненты от TMS :FlexCel кажется называются.Рекомендую.
Fareader (2005-02-11 11:00:00) [9]2Карелин Артем © (10.02.05 14:23) [6]
Если использовать указаный подход, то тормоза будут жуткие - рекомендую посмотреть на заргузку процессора в этот момент - загрузка данных в Excel по ячеечно - извращение. Рекомендую почитать серию статей "По волнам интеграции" на "Королевстве Delphi"
aus (2005-02-11 03:27:00) [10]Danilka © (10.02.05 22:23) [9]
rec := TCustomADODataSet(DBGrid.DataSource.DataSet).Recordset
Вот про это я думал, но поленился проверить, а потому и не написал.
Danilka © (10.02.05 22:23) [9]
подключаться к своей СУБД через АДО
Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)
Danilka (2005-02-10 22:23:00) [11][8] aus (10.02.05 18:17)
Тем, что имеет ограниченное применение - программа должна уметь подключаться к своей СУБД через АДО. :)
Кстати, если датасет, чьи данные отображаются в гриде - наследник TCustomADODataSet, то можно и проще, вместо:
XL.Range['a1'].CopyFromRecordset(Conn.Execute('select * from Table1'));
сделать примерно так:
rec := TCustomADODataSet(DBGrid.DataSource.DataSet).Recordset;
XL.Range['a1'].CopyFromRecordset(rec);
соответсвтенно убрать все, что касается Conn. :)
aus (2005-02-10 18:17:00) [12]
> Как эспортировать содержимое DBGrid в Excel !?
А чем плох примерно такой способ?
procedure TForm1.Button1Click(Sender: TObject);
var XL, Conn: variant;
begin
Conn := CreateOleObject('ADODB.Connection');
XL := CreateOleObject('Excel.Application');
try
Conn.ConnectionString := 'FILE NAME=c:\temp\test.udl';
Conn.Open;
XL.Workbooks.Add('C:\temp\test.xls');
XL.Range['a1'].CopyFromRecordset(Conn.Execute('select * from Table1')); //Здесь запрос, который используеися для заполнения грида.
XL.Visible := true;
Conn.Close;
XL.ActiveSheet.PrintPreview(false);
XL.ActiveWorkbook.Close(false);
finally
XL := Unassigned;
Conn := Unassigned;
end;
end;
Карелин Артем (2005-02-10 14:27:00) [13]ComObj в uses у меня стоит.
Карелин Артем (2005-02-10 14:23:00) [14]Вот и кусман из моего проекта.
procedure TfReport_TO2.Button2Click(Sender: TObject);
var Excel,WorkBook,Sheet:variant;
i:integer;
begin
if not DBGridEh1.DataSource.DataSet.Active then exit;
try
Excel := CreateOleObject('Excel.Application');
Excel.SheetsInNewWorkbook := 2;
WorkBook := Excel.WorkBooks.Add ;
Sheet := WorkBook.WorkSheets[1];
except
ShowMessage('Невозможно запустить MS Excel');
exit;
end;
i:=MainData.Grid2Excel(Sheet,3,1,DBGridEh1);
Sheet.UsedRange.Borders.LineStyle :=1;
Sheet.UsedRange.BorderAround(1,3);
Sheet.Cells[i+4,1].Value:='Всего';
Sheet.Cells[i+4,3].FormulaR1C1:='=ROWS(R[-'+IntToStr(i)+']C:R[-1]C)';
Sheet.Cells.Columns.AutoFit;
Sheet.Cells[1,1].Value:=MainData.GetTitle1('');
Sheet.Cells[2,1].Value:=MainData.Get1DateTitle(Self.Caption,Now);
Sheet := WorkBook.WorkSheets[2];
MainData.Grid2Excel(Sheet,3,1,DBGridEh2);
Sheet.Cells.Columns.AutoFit;
Sheet.UsedRange.Borders.LineStyle :=1;
Sheet.UsedRange.BorderAround(1,3);
Sheet.Cells[2,1].Value:=Self.Caption;
Excel.Visible:=true;
Excel.ScreenUpdating:=true;
Sheet:=Unassigned;
WorkBook:=Unassigned;
Excel:=Unassigned;
end;
function TMainData.Grid2ExcelEx(const ExcelDoc: variant; const row,
col: integer; const Grid: TDBGridEh; const ShowTitles: Boolean;const ExFormat:string='@'):integer;
var x,y:integer;
bm:TBookmark;
{BeginCol, BeginRow, }i, j : integer;
RowCount, ColCount : integer;
Cell1, Cell2,ArrayData:Variant;
begin
Screen.Cursor:=crHourGlass;
try
fProgressForm:=TfProgressForm.Create(Grid);
fProgressForm.Caption:='Идет загрузка данных.';
fProgressForm.Show;
Application.ProcessMessages;
y:=row;
Grid.DataSource.DataSet.DisableControls;
bm:=Grid.DataSource.DataSet.GetBookmark;
Grid.DataSource.DataSet.First;
if ShowTitles then
for x:=0 to Grid.Columns.Count-1 do
begin
ExcelDoc.Cells[y,x+col].Value:=StringReplace(Grid.Columns[x].Title.Caption,'|',#10,[rfReplaceAll]);
ExcelDoc.Cells[y,x+col].Font.Bold:=true;
end;
Grid.DataSource.DataSet.Last;
Grid.DataSource.DataSet.First;
fProgressForm.ProgressBar1.Max:=Grid.DataSource.DataSet.RecordCount;
RowCount:=Grid.DataSource.DataSet.RecordCount;
ColCount:=Grid.Columns.Count;
ArrayData := VarArrayCreate([1, RowCount+1, 1, ColCount], varVariant);
i:=1;
while not(Grid.DataSource.DataSet.Eof or (Grid.DataSource.DataSet.RecNo>65000)) do
begin
for J := 1 to ColCount do
begin
ArrayData[I, J] := Grid.Columns[j-1].Field.Text;
end;
inc(i);
RowCount:=i;
Grid.DataSource.DataSet.Next;
fProgressForm.ProgressBar1.StepIt;
Application.ProcessMessages;
end;
fProgressForm.Caption:='Идет вывод данных в Excel.';
Cell1 := ExcelDoc.Cells[Row+1, Col];
Cell2 := ExcelDoc.Cells[Row + RowCount-1, Col +ColCount - 1];
ExcelDoc.Cells.NumberFormat:=ExFormat;
ExcelDoc.Range[Cell1, Cell2].Value := ArrayData;
Grid.DataSource.DataSet.GotoBookmark(bm);
Grid.DataSource.DataSet.FreeBookmark(bm);
Grid.DataSource.DataSet.EnableControls;
Screen.Cursor:=crDefault;
Result:=RowCount-1;
finally
ArrayData:=Null;
FreeAndNil(fProgressForm);
end;
end;
Mamed (2005-02-10 14:17:00) [15]Function ExportGridToFile(FileName:String;Caption:TStringlist;D:TDbgrid;Mselected:Boolean):Integer;
var F:TextFile;
i,k:Integer;
s:string;
r:Integer;
Procedure exportg;
Var i:Integer;s:string;
Begin
D.DataSource.DataSet.DisableControls;
D.DataSource.DataSet.First;
while not D.DataSource.DataSet.Eof do
begin
s:='';
For i:=0 to d.Columns.Count-1 do
IF I=0 Then
s:=d.Columns[i].Field.AsString
else
s:=s+ExcellColSep+d.Columns[i].Field.AsString;
Writeln(f,s);
D.DataSource.DataSet.Next ;
end;
D.DataSource.DataSet.EnableControls;
End;
begin
ExportGridToFile:=0;
if D.DataSource.DataSet.Active=false then
begin
ExportGridToFile:=1;
exit;
end ;
try
AssignFile(f,FileName);
Rewrite(f);
except
Closefile(f);
ShowMessage(FileName+' dosyasýna eriþilemedi.');
ExportGridToFile:=1;
exit;
end;
For i:=0 to Caption.Count-1 do
Writeln(f,Caption.Strings[i]);
r:=d.DataSource.DataSet.RecNo;
s:='';
For i:=0 to d.Columns.Count-1 do
IF I=0 Then
s:=d.Columns[i].Title.Caption
else
s:=s+ExcellColSep+d.Columns[i].Title.Caption;
Writeln(f,s);
If Mselected Then
Begin
k :=0;
if D.SelectedRows.Count=0 Then
exportg
Else
While k
Карелин Артем (2005-02-10 13:47:00) [16]В EhLib есть готовый модуль для экспорта без Екселя.
Ega23 (2005-02-10 12:54:00) [17]2 Sergey13 © (10.02.05 12:41) [2]
Открываешь экспортно/импортную фирму? 8-)
Нет, готов поделится несколькими юнитами. А сюда они точно не влезут.
Прелесть в том, что функция может формировать Эксельный файл без установленного экселя.
Sergey13 (2005-02-10 12:41:00) [18]2[1] Ega23 © (10.02.05 12:39)
Открываешь экспортно/импортную фирму? 8-)
Ega23 (2005-02-10 12:39:00) [19]egorov@dedal.dubna.ru