Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

как эспортировать содержимое 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1109571142
Oleg_K
2005-02-28 09:12
2005.03.13
Как обьявить событие при создании компоненты


1-1109264947
Dwan
2005-02-24 20:09
2005.03.13
множества и строки


3-1108397709
MakedoneZ
2005-02-14 19:15
2005.03.13
Table и его Fields


3-1107789895
Ярослав
2005-02-07 18:24
2005.03.13
ID вставляемой записи


3-1108107634
Mishenka
2005-02-11 10:40
2005.03.13
В поле какого типа лучше всего загружать Gif файлы?