cxGrid 明细表数据导出Excel 例子

Delphi 下的QuantumGrid控件不支持主从表结构的直接从表数据导出,目前因为需求做了一个从表数据导出的功能,仅作参考,代码如下:
procedure TFormScheduleQuery.cxButtonExportClick(Sender: TObject);
const
  xlNone 
= $FFFFEFD2;
  xlAutomatic 
= $FFFFEFF7;
  xlSolid 
= $00000001;

  xlInsideHorizontal 
= $0000000C;
  xlInsideVertical 
= $0000000B;
  xlDiagonalDown 
= $00000005;
  xlDiagonalUp 
= $00000006;
  xlEdgeBottom 
= $00000009;
  xlEdgeLeft 
= $00000007;
  xlEdgeRight 
= $0000000A;
  xlEdgeTop 
= $00000008;

  xlContinuous 
= $00000001;
  xlDash 
= $FFFFEFED;
  xlDashDot 
= $00000004;
  xlDashDotDot 
= $00000005;
  xlDot 
= $FFFFEFEA;
  xlDouble 
= $FFFFEFE9;
  xlSlantDashDot 
= $0000000D;
  xlLineStyleNone 
= $FFFFEFD2;
  
  xlHairline 
= $00000001;
  xlMedium 
= $FFFFEFD6;
  xlThick 
= $00000004;
  xlThin 
= $00000002;

  xlCenter 
= $FFFFEFF4;
  xlBottom 
= $FFFFEFF5;
  xlLeft 
= $FFFFEFDD;
  xlRight 
= $FFFFEFC8;
  xlTop 
= $FFFFEFC0;
var
  FileName, s: String;
  xlApp, xlWorkbook, xlWorkSheet, xlRange: OleVariant;
  i, j, RowIndex, MasterRecordIndex, TitleRows: 
Integer;
  TableView, MainView, DetailView: TcxGridDBTableView;
  DetailVisible: Boolean;
  RangeBorders: array 
of Cardinal;
begin
  
//导出
  
if Self.tvWorkCenterSchedule.DataController.RecordCount = 0 then
  
begin
    
if Language = Chinese then
      s :
= '没有导出数据...'
    
else
      s :
= 'No data to export!';
    Application.MessageBox(PChar(s), PChar(Application.Title),
      MB_OK 
or MB_ICONERROR);
    
Exit;
  
end;

  
if Language = Chinese then
  
begin
    FormMain.SaveDialogExport.Filter :
= 'Excel文件 (*.xls)';
    FormMain.SaveDialogExport.Title :
= '导出为';
  
end
  
else
  
begin
    FormMain.SaveDialogExport.Filter :
= 'Excel File (*.xls)';
    FormMain.SaveDialogExport.Title :
= 'Export As';
  
end;

  
if not FormMain.SaveDialogExport.Execute then
    
Exit;

  FileName :
= FormMain.SaveDialogExport.FileName;
  Application.ProcessMessages;

  try
    xlApp :
= CreateOleObject('Excel.Application');
  
except
    Application.MessageBox(
'无法创建Excel文件, 请确认是否安装了Excel软件',
      PChar(Application.Title), MB_OK 
+ MB_ICONWarning);
    
Exit;
  
end;
  Screen.
Cursor := crHourGlass;
  Application.ProcessMessages;

  xlApp.Visible :
= False;
  xlApp.DisplayAlerts :
= False;
  xlApp.ScreenUpdating :
= False;

  xlWorkBook :
= xlApp.WorkBooks.Add;
  xlWorkSheet :
= xlWorkBook.WorkSheets[1];
  xlWorkSheet.Name :
= 'WorkCenter Plan';

  TableView :
= TcxGridDBTableView(Self.cxGrid1.FocusedView);
  
if TableView.IsMaster then
  
begin
    MainView :
= TableView;
    MasterRecordIndex :
= MainView.DataController.FocusedRecordIndex;
    
with MainView.DataController do
      DetailView :
= TcxGridDBTableView(TcxGridDataController(GetDetailDataController(FocusedRecordIndex, 0)).GridView);
  
end
  
else
  
begin
    DetailView :
= TableView;
    MainView :
= TcxGridDBTableView(TcxGridDataController(DetailView.DataController.GetMasterDataController).GridView);
    MasterRecordIndex :
= DetailView.DataController.GetMasterRecordIndex;
  
end;

  TitleRows :
= 3;
  RowIndex :
= TitleRows + 1;
  xlWorkSheet.Rows
[RowIndex].Font.Name := '宋体';
  xlWorkSheet.Rows
[RowIndex].Font.Bold := True;
  xlWorkSheet.Rows
[RowIndex].Font.Size := 9;
  xlWorkSheet.Rows
[RowIndex].WrapText := True;

  
for i := 0 to DetailView.VisibleColumnCount - 1 do
    xlWorkSheet.Cells
[RowIndex, i + 1].Value := VarToStr(DetailView.VisibleColumns[i].Caption);

  
//设置标题行
  xlWorkSheet.Cells
[RowIndex, 1].AutoFilter;

  xlRange :
= xlWorkSheet.Range[xlWorkSheet.Cells[RowIndex, 1], xlWorkSheet.Cells[RowIndex, DetailView.VisibleColumnCount]];
  xlRange.Interior.ColorIndex :
= 37;
  xlRange.Interior.Pattern :
= xlSolid;
  xlRange.Interior.PatternColorIndex :
= xlAutomatic;

  
//设置列格式
  xlWorkSheet.Columns
[DetailView.GetColumnByFieldName('OrderID').VisibleIndex + 1].NumberFormatLocal := '@';
  xlWorkSheet.Columns
[DetailView.GetColumnByFieldName('ItemID').VisibleIndex + 1].NumberFormatLocal := '@';
  xlWorkSheet.Columns
[DetailView.GetColumnByFieldName('StartDate').VisibleIndex + 1].NumberFormatLocal := 'yyyy-mm-dd hh:mm;@';      //yyyy-m-d h:mm;@
  xlWorkSheet.Columns
[DetailView.GetColumnByFieldName('StopDate').VisibleIndex + 1].NumberFormatLocal := 'yyyy-mm-dd hh:mm;@';

  
for i := 0 to DetailView.DataController.RecordCount - 1 do
  
begin
    Inc(RowIndex);
    xlWorkSheet.Rows
[RowIndex].Font.Name := '宋体';
    xlWorkSheet.Rows
[RowIndex].Font.Size := 9;

    
for j := 0 to DetailView.VisibleColumnCount - 1 do
      xlWorkSheet.Cells
[RowIndex, j + 1].Value := VarToStr(DetailView.DataController.Values[i, DetailView.VisibleColumns[j].Index]);
  
end;
  
  
for j := 0 to DetailView.VisibleColumnCount - 1 do
    xlWorkSheet.Columns
[j + 1].EntireColumn.AutoFit;

  RowIndex :
= 1;
  xlWorkSheet.Rows
[RowIndex].Font.Name := '宋体';
  xlWorkSheet.Rows
[RowIndex].Font.Bold := True;
  xlWorkSheet.Rows
[RowIndex].Font.Size := 18;

  xlRange :
= xlWorkSheet.Range[xlWorkSheet.Cells[RowIndex, 1], xlWorkSheet.Cells[RowIndex, DetailView.VisibleColumnCount]];
  xlRange.HorizontalAlignment :
= xlCenter;
  xlRange.VerticalAlignment :
= xlCenter;
  xlRange.ShrinkToFit :
= False;
  xlRange.MergeCells :
= True;
  xlWorkSheet.Cells
[RowIndex, 1].Value := 'WorkCenter Plan';

  Inc(RowIndex);
  xlWorkSheet.Rows
[RowIndex].Font.Name := '宋体';
  xlWorkSheet.Rows
[RowIndex].Font.Size := 9;

  xlRange :
= xlWorkSheet.Range[xlWorkSheet.Cells[RowIndex, 1], xlWorkSheet.Cells[RowIndex, DetailView.VisibleColumnCount]];
  xlRange.HorizontalAlignment :
= xlRight;
  xlRange.VerticalAlignment :
= xlCenter;
  xlRange.ShrinkToFit :
= False;
  xlRange.MergeCells :
= True;
  
with MainView.DataController do
    xlWorkSheet.Cells
[RowIndex, 1].Value := '计划日期: ' + VarToStr(Values[MasterRecordIndex, GetItemByFieldName('StartDate').Index])
      
+ ' 到 ' + VarToStr(Values[MasterRecordIndex, GetItemByFieldName('StopDate').Index]);

  xlApp.ActiveWindow.SplitRow :
= TitleRows + 1;
  
//xlApp.ActiveWindow.SplitColumn = 1
  xlApp.ActiveWindow.FreezePanes :
= True;
  xlApp.ActiveWindow.DisplayGridlines :
= False;

  xlRange :
= xlWorkSheet.Range[xlWorkSheet.Cells[TitleRows + 1, 1],
    xlWorkSheet.Cells
[TitleRows + 1 + DetailView.DataController.RecordCount, DetailView.VisibleColumnCount]];
  xlRange.Borders
[xlDiagonalDown].LineStyle := xlNone;
  xlRange.Borders
[xlDiagonalUp].LineStyle := xlNone;
  SetLength(RangeBorders, 
6);
  RangeBorders
[0] := xlEdgeBottom;
  RangeBorders
[1] := xlEdgeLeft;
  RangeBorders
[2] := xlEdgeRight;
  RangeBorders
[3] := xlEdgeTop;
  RangeBorders
[4] := xlInsideHorizontal;
  RangeBorders
[5] := xlInsideVertical;
  
for i := low(RangeBorders) to high(RangeBorders) do
  
begin
    xlRange.Borders
[RangeBorders[i]].LineStyle := xlContinuous;
    xlRange.Borders
[RangeBorders[i]].Weight := xlThin;
    xlRange.Borders
[RangeBorders[i]].ColorIndex := xlAutomatic;
  
end;

  xlWorkBook.SaveAs(FileName);
  xlWorkBook.
Close;
  xlWorkBook :
= Unassigned;
  xlWorkSheet :
= Unassigned;
  xlRange :
= Unassigned;
  xlApp.Quit;
  xlApp :
= Unassigned;
  Application.ProcessMessages;

  Screen.
Cursor := crDefault;
  Application.ProcessMessages;

  
if Language = Chinese then
    s :
= '导出完成...'
  
else
    s :
= 'Export Succeed!';
  Application.MessageBox(PChar(s), PChar(Application.Title),
    MB_OK 
or MB_IconInformation);
end;
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值