2013-01-18 454 views
2

我有一个数据库网格被排序(用户点击几个单选按钮和复选框来影响显示)。将DBgrid导出为CSV?

我想导出所有数据(不仅仅是网格中可见的数据),按照相同的顺序导出为CSV - 我该怎么做?数据 - 不是用户设置,只是为了澄清。

预先感谢任何帮助


[更新]我建sqlQuery的点点滴滴,这取决于复选框的用户设置&单选按钮组,然后,当他们中的一个变化,我

ActivityADQuery.SQL.Clear(); 
    ActivityADQuery.SQL.Add(sqlQuery); 
    ActivityADQuery.Open(sqlQuery); 

也就是说,没有硬编码查询,它会变化,我想导出当前设置。

我不知道如果我想从网格或数据集(我只是不是数据库的家伙,这是我的第一个DBgrid)导出,但我怀疑我想要网格,因为它有一个他数据集的字段子集。

我猜TJvDBGridCSVExport是一个Jedi组件(?)我试图避免它们到目前为止,听起来很棒,因为我更喜欢谨慎的,独立的组件来安装一个巨大的集合。这可能不是做最聪明的事情,但它是我的感觉 - YMMV(和prolly做)

+1

试过TJvDBGridCSVExport? –

+1

数据的执行顺序如何?相关的数据集应该具有与网格所示相同的顺序,并且您只需将数据集导出为CSV –

+2

@ Arioch'TJvDBGridCSVExport是从相关DataSet中导出所有数据还是仅导出Grid所显示的数据? –

回答

3

另一种解决方案,作品还与(多)选定的行:

procedure TReportsForm.ExportToCSV(const aGrid : TDBGrid; const FileName : String); 
Var 
    I, J : Integer; 
    SavePlace : TBookmark; 
    Table : TStrings; 
    HeadTable : String; 
    LineTable : String; 
    First : Boolean; 
Begin 

    HeadTable := ''; 
    LineTable := ''; 
    Table := TStringList.Create; 
    First := True; 

    Try 
    For I := 0 To Pred(aGrid.Columns.Count) Do 
     If aGrid.Columns[I].Visible Then 
     If First Then 
     Begin 
// Use the text from the grid, in case it has been set programatically 
// E.g., we prefer to show "Date/time" than "from_unixtime(activity.time_stamp, "%D %b %Y %l:%i:%S")" 
//   HeadTable := HeadTable + aGrid.Columns[I].FieldName; 
      HeadTable := HeadTable + ActivityReportStringGrid.Columns[i].Title.Caption + ','; // Previous separated wth semi-colon, not comma! (global) 
      First := False; 
     End 
     Else 
     begin 
//   HeadTable := HeadTable + ';' + aGrid.Columns[I].FieldName; 
      HeadTable := HeadTable + ActivityReportStringGrid.Columns[i].Title.Caption + ','; 
     end; 

    Delete(HeadTable, Length(HeadTable), 1); // Remove the superfluous trailing comma 
    Table.Add(HeadTable); 
    First := True; 

    // with selection of rows 
    If aGrid.SelectedRows.Count > 0 Then 
    Begin 
     For i := 0 To aGrid.SelectedRows.Count - 1 Do 
     Begin 
     aGrid.DataSource.Dataset.GotoBookmark(pointer(aGrid.SelectedRows.Items[i])); 
     For j := 0 To aGrid.Columns.Count - 1 Do 
      If aGrid.Columns[J].Visible Then 
      If First Then 
      Begin 
       lineTable := lineTable + aGrid.Fields[J].AsString; 
       First := False; 
      End 
      Else 
       lineTable := lineTable + ',' + aGrid.Fields[J].AsString; 

     Delete(LineTable, Length(LineTable), 1); // Remove the superfluous trailing comma 
     Table.Add(LineTable); 
     LineTable := ''; 
     First := True; 
     End; 
    End 
    Else 
     //no selection 
    Begin 
     SavePlace := aGrid.DataSource.Dataset.GetBookmark; 
     aGrid.DataSource.Dataset.First; 

     Try 
     While Not aGrid.DataSource.Dataset.Eof Do 
     Begin 
      For I := 0 To aGrid.Columns.Count - 1 Do 
      If aGrid.Columns[I].Visible Then 
       If First Then 
       Begin 
       lineTable := lineTable + aGrid.Fields[I].AsString; 
       First := False; 
       End 
       Else 
       lineTable := lineTable + ',' + aGrid.Fields[I].AsString; 


      Delete(LineTable, Length(LineTable), 1); // Remove the superfluous trailing comma 
      Table.Add(LineTable); 
      LineTable := ''; 
      aGrid.DataSource.Dataset.Next; 
      First := True; 
     End; 

     aGrid.DataSource.Dataset.GotoBookmark(SavePlace); 
     Finally 
     aGrid.DataSource.Dataset.FreeBookmark(SavePlace); 
     End; 
    End; 
    Table.SaveToFile(FileName); 
    Finally 
    Table.Free; 
    End; 
End; // ExportToCSV() 
1

你可以使用自己的小程序至极可以适应您的需求

Procedure Dataset2SeparatedFile(ads: TDataset; const fn: String; const Separator: String = ';'); 
var 
    sl: TStringList; 
    s: String; 
    i: Integer; 
    bm: TBookmark; 

    Procedure ClipIt; 
    begin 
    s := Copy(s, 1, Length(s) - Length(Separator)); 
    sl.Add(s); 
    s := ''; 
    end; 
    Function FixIt(const s: String): String; 
    begin 
    // maybe changed 
    Result := StringReplace(StringReplace(StringReplace(s, Separator, '', [rfReplaceAll]), #13, '', [rfReplaceAll]), #10, '', [rfReplaceAll]); 
    // additional changes could be Quoting Strings 
    end; 

begin 
    sl := TStringList.Create; 
    try 
    s := ''; 
    For i := 0 to ads.FieldCount - 1 do 
    begin 
     if ads.Fields[i].Visible then 
     s := s + FixIt(ads.Fields[i].DisplayLabel) + Separator; 
    end; 
    ClipIt; 
    bm := ads.GetBookmark; 
    ads.DisableControls; 
    try 
     ads.First; 
     while not ads.Eof do 
     begin 
     For i := 0 to ads.FieldCount - 1 do 
     begin 
      if ads.Fields[i].Visible then 
      s := s + FixIt(ads.Fields[i].DisplayText) + Separator; 
     end; 
     ClipIt; 
     ads.Next; 
     end; 
     ads.GotoBookmark(bm); 
    finally 
     ads.EnableControls; 
     ads.FreeBookmark(bm); 
    end; 
    sl.SaveToFile(fn); 
    finally 
    sl.Free; 
    end; 
end;