不试用cxgrid自带的导出功能,就是
1. 先uses
cxExportGrid4Link   单元
 
2. 使用方法ExportGrid4ToEXCEL();
这个不要,因为这个导出的时候有时候会出错,  有的导出来没有按字段类型来,有没有哪位大大能告诉我手动写代码导出的怎么写,导出的要按界面上的顺序来导出的,可支持多层级的,不要按字段的创建顺序

解决方案 »

  1.   

    没有啊,网上的都是ExportGrid4ToEXCEL的
      

  2.   


    从DBGrid,StringGrid导出Excel

    你要求的这些最好是自己写个循环导出比较好。
      

  3.   

    cxgrid有多层,和普通的不一样
    会写我就不用在这边问了
      

  4.   


    Function FunOutPutGrid(AFGrid, ASGrid: TcxGridDBTableView; APath, ASQlStr: String): Boolean; //字母grid导出到excel
    Var
      AValue, AStr, ABStr, AAStr, ASSql, ASpaceStr, ABeginLines: String;
      AFADQQuery, ASADQQuery: TADOQuery;
      AInt1, AInt2, ALines: Integer;
      ExcelApp: Variant;
      AColumn: TcxGridDBColumn;
      AList: TStringList;
      NewField, OldField: TField;
    Begin
      Try
        Try
          AFADQQuery := TADOQuery(AFGrid.DataController.DataSource.DataSet);
          ASADQQuery := TADOQuery(ASGrid.DataController.DataSource.DataSet);      If Not AFADQQuery.Active Then exit;
          If ASADQQuery.RecordCount = 0 Then exit;      ALines := 1;
          ExcelApp := CreateOleObject('Excel.Application');
          ExcelApp.WorkBooks.Add;
          ExcelApp.WorkSheets[1].Activate;      AFADQQuery.First;
          While Not AFADQQuery.Eof Do
            Begin
              //          ExcelApp.ActiveSheet.Rows[ALines].Font.Color := clBlue;
                        //        ExcelApp.ActiveSheet.cells[ALines].Color := clBlue;
                        //        ExcelApp.ActiveSheet.Rows[ALines].Brush.Color  := clBlack;
              For AInt1 := 1 To AFGrid.VisibleColumnCount Do
                Begin
                  ExcelApp.Cells[ALines, AInt1].Value := AFGrid.VisibleColumns[AInt1 - 1].Caption;
                  ExcelApp.Cells[ALines, AInt1].Interior.Color := clBlue;
                  ExcelApp.Cells[ALines, AInt1].Borders.Color := clBlue;
                  //            ExcelApp.Cells[ALines, AInt1].Brush.Color := clBlack;
                End;
              ALines := ALines + 1;          For AInt1 := 1 To AFGrid.VisibleColumnCount Do
                Begin
                  AColumn := TcxGridDBColumn(AFGrid.VisibleColumns[AInt1 - 1]);
                  ExcelApp.Cells[ALines, AInt1].Value :=
                    AFADQQuery.FieldByName(AColumn.DataBinding.FieldName).AsString;
                End;
              ALines := ALines + 1;          For AInt1 := 1 To ASGrid.VisibleColumnCount Do
                Begin
                  ExcelApp.ActiveSheet.Rows[ALines].Font.Color := clred;
                  ExcelApp.Cells[ALines, AInt1].Value := ASGrid.VisibleColumns[AInt1 - 1].Caption;
                  ExcelApp.Cells[ALines, AInt1].Interior.Color := clBlue;
                  ExcelApp.Cells[ALines, AInt1].Borders.Color := clBlue;
                End;
              ALines := ALines + 1;          If ASADQQuery.Active Then
                Begin
                  If ASADQQuery.RecordCount > 0 Then
                    Begin
                      ASADQQuery.First;
                      ABeginLines := IntToStr(ALines);
                      While Not ASADQQuery.Eof Do
                        Begin
                          For AInt1 := 1 To ASGrid.VisibleColumnCount Do
                            Begin
                              AColumn := TcxGridDBColumn(ASGrid.VisibleColumns[AInt1 - 1]);
                              ExcelApp.Cells[ALines, AInt1].Value :=
                                ASADQQuery.FieldByName(AColumn.DataBinding.FieldName).AsString;
                            End;
                          ALines := ALines + 1;
                          ASADQQuery.Next;
                        End;                End;
                End;          For AInt1 := 0 To ASGrid.DataController.Summary.FooterSummaryItems.Count - 1 Do
                Begin
                  For AInt2 := 1 To ASGrid.VisibleColumnCount Do
                    Begin
                      AColumn := TcxGridDBColumn(ASGrid.VisibleColumns[AInt2 - 1]);
                      If TcxGridDBTableSummaryItem(ASGrid.DataController.Summary.FooterSummaryItems[AInt1]).FieldName =
                        AColumn.DataBinding.FieldName Then
                        Begin
                          //                    ASSql := 'select sum('+AColumn.DataBinding.FieldName+') as SumValse form ';
                          //                    AFADQQuery.fie
                          ExcelApp.Cells[ALines, AInt2].Value := '=SUM(' + Chr(64 + AInt2) + ABeginLines + ':' + Chr(64 + AInt2) + IntToStr(ALines - 1) + ')';
                        End;
                    End;
                End;
              ALines := ALines + 2;
              AFADQQuery.Next;
            End;      ExcelApp.ActiveWorkBook.SaveAs(APath);
          ExcelApp.Visible := True;    Finally
          ExcelApp.WorkBooks.Close;
          ExcelApp.quit;
          Result := True;
        End;
      Except  End;End;
    字母表一起导出,母表导出一行后,子表导出相应数据,删除了相应代码,未测试
      

  5.   


    很感谢你的回答,可是我用的不是关联数据集的,我们都是手动赋值进去的,无关联ADO
      

  6.   

    那你循环Grid就好了啊,那不是和循环数据集一个道理么,直接在grid里取值就好了啊  For  I:= 0 To cxGrid1DBBandedTableView1.ViewData.RowCount - 1 Do
        Begin
          If Not cxGrid1DBBandedTableView1.ViewData.Rows[i].ExpandOnDblClick Then
            Begin
              AValue := String(cxGrid1DBBandedTableView1.ViewData.Rows[i].Values[n]);
              Try
                ExcelApp.Cells[ALines, AInt1].Value := AValue;
              Except          End;
            End;
        End;    大概是上面的意思吧,比较忙,没时间测试,变量你自己设,只要你能取到Grid各个格子的值,
    然后一个格子一个格子的往excel里面写,那就ok了
      

  7.   

    额,在行循环里面再加一个列循环  For  I:= 0 To cxGrid1DBBandedTableView1.ViewData.RowCount - 1 Do
        Begin
          If Not cxGrid1DBBandedTableView1.ViewData.Rows[i].ExpandOnDblClick Then
            Begin
              for n:= 0 to cxGrid1DBBandedTableView1.VisibleColumnCount -1 do
              begin
                AValue := String(cxGrid1DBBandedTableView1.ViewData.Rows[i].Values[n]);
                Try
                  ExcelApp.Cells[ALines, AInt1].Value := AValue;
                Except            End;
              end;
            End;
        End;    
      

  8.   

    哥哥啊,第一个回答里面有导出的,
    后面的我只是把取得值重新取了一遍,你2个结合一下就ok了,
    前面的你用其中的导出层,然后把取自ado的值换成取自grid就好了啊
      

  9.   


    大哥,呵呵,不好意思哈,还是不太懂,我组合起来运行老报错,能不能帮我组合下啊,我不需要主从表,只有一个TcxGridBandedTableView的,能按着界面上的顺序导出表格,所见即所得就行,可以的话最好连字段的格式都一样,拜托了
      

  10.   

    Var
      ExcelApp: Variant;
      AInt1, AInt2, ALines, i, n: Integer;
      AValue, APath: String;
    Begin
      Try
        If RzOpenDialog1.Execute Then APath := RzOpenDialog1.FileName;
        ALines := 1;
        ExcelApp := CreateOleObject('Excel.Application');
        ExcelApp.WorkBooks.Add;
        ExcelApp.WorkSheets[1].Activate;    For AInt1 := 1 To cxGridDBTableView2.VisibleColumnCount Do
          Begin
            ExcelApp.Cells[ALines, AInt1].Value := cxGridDBTableView2.VisibleColumns[AInt1 - 1].Caption;
            ExcelApp.Cells[ALines, AInt1].Interior.Color := clBlue;
            ExcelApp.Cells[ALines, AInt1].Borders.Color := clBlue;
            //            ExcelApp.Cells[ALines, AInt1].Brush.Color := clBlack;
          End;
        ALines := ALines + 1;
        For I := 0 To cxGridDBTableView2.ViewData.RowCount - 1 Do
          Begin
            If Not cxGridDBTableView2.ViewData.Rows[i].ExpandOnDblClick Then
              Begin
                For n := 1 To cxGridDBTableView2.VisibleColumnCount  Do
                  Begin
                    AValue := String(cxGridDBTableView2.ViewData.Rows[i].Values[n]);
                    Try
                      ExcelApp.Cells[ALines, n].Value := AValue;
                    Except                End;
                  End;
              End;
            ALines := ALines + 1;
          End;    ExcelApp.ActiveWorkBook.SaveAs(APath);
        ExcelApp.Visible := True;  Finally
        ExcelApp.WorkBooks.Close;
        ExcelApp.quit;
      End;
    End;
      

  11.   

    在单元引用里添加  ComObj
      

  12.   


    大哥,很感谢你,但是有一些问题,我的表格不是单单只有一层的,也就是不单单只是字段名,有可能有三层或者两层这样的,您的代码只能导出标题的,而且有些格式和字段值貌似都不对,能否加下我QQ详细指导下呢,我比较笨,QQ:502943096