不试用cxgrid自带的导出功能,就是
1. 先uses
cxExportGrid4Link 单元
2. 使用方法ExportGrid4ToEXCEL();
这个不要,因为这个导出的时候有时候会出错, 有的导出来没有按字段类型来,有没有哪位大大能告诉我手动写代码导出的怎么写,导出的要按界面上的顺序来导出的,可支持多层级的,不要按字段的创建顺序
1. 先uses
cxExportGrid4Link 单元
2. 使用方法ExportGrid4ToEXCEL();
这个不要,因为这个导出的时候有时候会出错, 有的导出来没有按字段类型来,有没有哪位大大能告诉我手动写代码导出的怎么写,导出的要按界面上的顺序来导出的,可支持多层级的,不要按字段的创建顺序
从DBGrid,StringGrid导出Excel
你要求的这些最好是自己写个循环导出比较好。
会写我就不用在这边问了
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;
字母表一起导出,母表导出一行后,子表导出相应数据,删除了相应代码,未测试
很感谢你的回答,可是我用的不是关联数据集的,我们都是手动赋值进去的,无关联ADO
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了
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;
后面的我只是把取得值重新取了一遍,你2个结合一下就ok了,
前面的你用其中的导出层,然后把取自ado的值换成取自grid就好了啊
大哥,呵呵,不好意思哈,还是不太懂,我组合起来运行老报错,能不能帮我组合下啊,我不需要主从表,只有一个TcxGridBandedTableView的,能按着界面上的顺序导出表格,所见即所得就行,可以的话最好连字段的格式都一样,拜托了
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;
大哥,很感谢你,但是有一些问题,我的表格不是单单只有一层的,也就是不单单只是字段名,有可能有三层或者两层这样的,您的代码只能导出标题的,而且有些格式和字段值貌似都不对,能否加下我QQ详细指导下呢,我比较笨,QQ:502943096