Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.038 c
1-1109568677
Guitar
2005-02-28 08:31
2005.03.13
Алгоритмы цифровой фильтрации.


6-1105215904
Colonel
2005-01-08 23:25
2005.03.13
Knocking to ....


3-1108102236
O.O
2005-02-11 09:10
2005.03.13
Принудительная запись кэш BDE на диск


1-1109230829
3APA3A
2005-02-24 10:40
2005.03.13
Combobox


1-1109236287
sunsay
2005-02-24 12:11
2005.03.13
Вопрос по оптимизации





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский