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 ;
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值