bcb}有关DBGRID导出到EXCEL问题

/*****************************************************************   
   **    函数名:DBGridToExcel   
   **    输    入:TDBGrid    *,AnsiString    *   
   **    TDBGrid    *:数据来源。   
   **    AnsiString    *:Excel模板文件名   
   **    输    出:    void   
   **    x    为    1,    表示...   
   **    x    为    0,    表示...   
   **    功能描述:    将DBGrid的结果输出到指定目录下的指定文件中。   
   **    全局变量:    无   
   **    调用模块:        无   
   **    作    者:      Wing   
   **    日    期:      2004-04-02   
   **    修    改:   
   **    日    期:   
   **    版本      1.0   
   ****************************************************************/   
    
   //---------------------------------------------------------------------------   
   #include    "ComObj.hpp"   
   #define        PG        OlePropertyGet   
   #define        PS        OlePropertySet   
   #define        FN        OleFunction   
   #define        PR        OleProcedure   
   //----------------------------   
   void      DBGridToExcel(TDBGrid    *DBGrid,AnsiString    strPath)   
   {   
    
   Screen->Cursor=crHourGlass;   
   //通过调用函数将DBGrid的内容输出到Excel中。   
    
   TDataSet    *dsDS=DBGrid->DataSource->DataSet;   
   if(dsDS->RecordCount==0)   
   {   
   Application->MessageBox("没有可以导出的数据!/r/n导出数据操作将会提早结束。","提示",IDOK);   
       Screen->Cursor=crDefault;   
   return;   
   }   
   AnsiString    strMessage="报表模板文件:/n/r"+strPath+"/r/n不存在,无法打开";   
   if(!FileExists(strPath))   
   {   
       Application->MessageBox(strMessage.c_str(),"错误",MB_ICONSTOP|MB_OK);   
       Screen->Cursor=crDefault;   
   return;   
   }   
   //Application->MessageBoxA("导出数据可能需要一段时间,请稍等。","提示",0);   
   Variant    Ex,Wb,Sh1,Range1;   
   AnsiString    EReport=ExtractFilePath(Application->ExeName)+"EReport//AReport"+FormatDateTime("yyyymmddhhnnsszzz",Now())+".xls";   
   if(FileExists(EReport))   
   {   
       AnsiString    strT="报表文件:/r/n"+(AnsiString)EReport+"/r/n已存在,确定后打开";   
       Application->MessageBox(strT.c_str(),"提示",MB_ICONINFORMATION|MB_OK);   
   //通过OLE找开已存在的报表文件.   
       try   
       {   
           HWND    hPrevApp    =    ::FindWindow(NULL,"Microsoft    Excel");   
           if(!hPrevApp)   
           {   
               Ex=Variant::CreateObject("Excel.Application");   
           }   
           else   
   {   
               Ex=Variant::GetActiveObject("Excel.Application");   
           }   
       }   
   catch(...)   
   {   
   Application->MessageBox("无法启动Excel,请确定已正确安装MS    OFFICE!","错误",MB_ICONSTOP|MB_OK);   
           Screen->Cursor=crDefault;   
   return;   
   }//End    try   
   // Ex.OlePropertySet("Visible",true);   
   Ex.OlePropertyGet("WorkBooks").PR("Open",EReport.c_str());   
   }    //End    Opend    exists    file   
   else    //报表不存在,复制模板文件并产生报表.   
   {   
       if(CopyFile(strPath.c_str(),EReport.c_str(),1)==0)    //复制模板   
           {   
               ShowMessage("复制模板失败,请重试.");   
   Screen->Cursor=crDefault;   
               return;   
           }   
       try   
       {   
           HWND    hPrevApp    =    ::FindWindow(NULL,"Microsoft    Excel");   
           if(!hPrevApp)   
           {   
   Ex=Variant::CreateObject("Excel.Application");   
   }   
   else   
   {   
   Ex=Variant::GetActiveObject("Excel.Application");   
   }   
   }   
   catch(...)   
   {   
   Application->MessageBox("无法启动Excel,请确定已正确安装MS    OFFICE!","错误",MB_ICONSTOP|MB_OK);   
   Screen->Cursor=crDefault;   
   return;   
   }//End    try   
   Ex.OlePropertyGet("WorkBooks").PR("Open",EReport.c_str());   
   Wb=Ex.PG("ActiveWorkBook");      //    请尝试改名。   
       Sh1=Wb.PG("ActiveSheet");   
       int    columns=DBGrid->DataSource->DataSet->FieldCount;   
       int    iRow=10,iCol=0;   
       for(;iCol<columns;iCol++)                                      //写字段名。   
   {   
           Sh1.PG("Cells",iRow,iCol+1).PS("Value",DBGrid->Columns->Items[iCol]->Title->Caption.c_str());   
       }   
       DBGrid->DataSource->DataSet->DisableControls();   
       iRow=11;    //在这个位置开始写Excel.   
       try   
       {   
           int    RecCount=1;   
   /*          WProgress->Show();   
   WProgress->ProgressBar1->Position=0;*/   
           for(dsDS->First();!dsDS->Eof;dsDS->Next(),iRow++)      //将查询到的记录依次写到工作薄中.   
           {   
               for(iCol=0;iCol<columns;iCol++)   
               {   
                   Sh1.PG("Cells",iRow,iCol+1).PS("Value",dsDS->Fields->Fields[iCol]->AsString.c_str());   
   /*                  WProgress->ProgressBar1->Position=int(RecCount*100/dsDS->RecordCount);   
   WProgress->Label1->Caption=IntToStr(WProgress->ProgressBar1->Position);*/   
                   Application->ProcessMessages();   
   }   
               RecCount++;   
   }   
     //        WProgress->Close();   
    
   /*   
   Sh1.OlePropertyGet("Range",    "A12:C10").OleProcedure("Select");   
   Range1    =    Ex.OlePropertyGet("Selection");   
   //Range1    =    Sh1.OlePropertyGet("Selection");   
   Range1.OlePropertySet("Borders","xlEdgeLeft");   
   Range1.OlePropertySet("LineStyle","xlThin");   
   Range1.OlePropertySet("ColorIndex","xlAutomatic");*/   
   }   
   catch(...)   
   {   
           Application->MessageBox("导出过程出现错误!操作将停止。请尝试重新执行操作。/n/r如果问题继续存在,请联系开发人员。","严重错误",MB_ICONSTOP|MB_OK);   
   DBGrid->DataSource->DataSet->EnableControls();   
   Ex=Unassigned;   
   Wb=Unassigned;   
   Sh1=Unassigned;   
   Screen->Cursor=crDefault;   
   DBGrid->DataSource->DataSet->EnableControls();   
   return;   
       }   
   Wb.PR("Save");   
   Ex.OlePropertySet("Visible",(Variant)true);   
   }//end    else   
   Screen->Cursor=crDefault;   
   DBGrid->DataSource->DataSet->EnableControls();   
   }   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值