Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Внизкак эспортировать содержимое DBGrid в Excel !? Найти похожие ветки
← →
beginnn © (2005-02-10 12:24) [0]Здравствуйте!
Как эспортировать содержимое DBGrid в Excel !?
← →
Ega23 © (2005-02-10 12:39) [1]egorov@dedal.dubna.ru
← →
Sergey13 © (2005-02-10 12:41) [2]2[1] Ega23 © (10.02.05 12:39)
Открываешь экспортно/импортную фирму? 8-)
← →
Ega23 © (2005-02-10 12:54) [3]2 Sergey13 © (10.02.05 12:41) [2]
Открываешь экспортно/импортную фирму? 8-)
Нет, готов поделится несколькими юнитами. А сюда они точно не влезут.
Прелесть в том, что функция может формировать Эксельный файл без установленного экселя.
← →
Карелин Артем © (2005-02-10 13:47) [4]В EhLib есть готовый модуль для экспорта без Екселя.
← →
Mamed (2005-02-10 14:17) [5]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<D.SelectedRows.Count Do
Begin
D.DataSource.DataSet.GotoBookmark(pointer(D.SelectedRows.Items[k]));
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);
k :=k+1;
End;
End
Else
exportg;
CloseFile(f);
end;
← →
Карелин Артем © (2005-02-10 14:23) [6]Вот и кусман из моего проекта.
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;
← →
Карелин Артем © (2005-02-10 14:27) [7]ComObj в uses у меня стоит.
← →
aus (2005-02-10 18:17) [8]
> Как эспортировать содержимое 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;
← →
Danilka © (2005-02-10 22:23) [9][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-11 03:27) [10]Danilka © (10.02.05 22:23) [9]
rec := TCustomADODataSet(DBGrid.DataSource.DataSet).Recordset
Вот про это я думал, но поленился проверить, а потому и не написал.
Danilka © (10.02.05 22:23) [9]
подключаться к своей СУБД через АДО
Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)
← →
Fareader (2005-02-11 11:00) [11]2Карелин Артем © (10.02.05 14:23) [6]
Если использовать указаный подход, то тормоза будут жуткие - рекомендую посмотреть на заргузку процессора в этот момент - загрузка данных в Excel по ячеечно - извращение. Рекомендую почитать серию статей "По волнам интеграции" на "Королевстве Delphi"
← →
Manfred8 (2005-02-11 11:03) [12]Есть замечательные компаненты от TMS :FlexCel кажется называются.Рекомендую.
← →
Danilka © (2005-02-11 11:07) [13][12] Manfred8 (11.02.05 11:03)
Угу, только они платные стали, после того, как начали распостраняться ТМС, а не разработчиком.
← →
Manfred8 (2005-02-11 11:10) [14]Могу скинуть на мыло
← →
Danilka © (2005-02-11 11:14) [15][14] Manfred8 (11.02.05 11:10)
Их есть у меня. :)) Еще та версия, которая была бесплатная, еще не под крышей ТМС. Сам могу скинуть кому-нибудь. :))
Только ее применение гораздо более широкое, чем экспорт дбгрида.
← →
Карелин Артем © (2005-02-11 11:28) [16]Fareader (11.02.05 11:00) [11]
Странно. У меня 1700 страниц в масштабе 60% уходят за 46 секунд.
Советую повнимательнее посмотреть мой код.
← →
Карелин Артем © (2005-02-11 11:33) [17]Кстати я автора этих статей по нескольким вопросам направлял на путь истинный в те времена.
← →
Fareader (2005-02-11 11:35) [18]2Карелин Артем ©
Сорри - действительно недосмотрел :(
← →
Ega23 © (2005-02-11 11:38) [19]Я по наивности своей думаю что все только через ADO и работают, про экзотику забыл :)
Почему сразу "экзотику"? Что, свет клином на OLE DB сошёлся?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c