DBGridEh输出EXCEL的方法

 

//方法一调用DBGRID的函数


#include "DBGridEhImpExp.hpp"

void __fastcall TfrmViewReport::cmdSaveAsClick(TObject *Sender)
{
/**************************************************************
  函数名:cmdSaveAsClick(TObject *Sender)
  用途: 保存报表到本地文件中
  修改者:
  修改日期:
**************************************************************/

    TDBGridEhExportClass ExpClass;
/*
    TDBGridEhExportAsText * ExpText=new TDBGridEhExportAsText;
    TDBGridEhExportAsCSV * ExpCsv=new TDBGridEhExportAsCSV;
    TDBGridEhExportAsHTML * ExpHtml=new TDBGridEhExportAsHTML;
    TDBGridEhExportAsRTF * ExpRtf=new TDBGridEhExportAsRTF;
    TDBGridEhExportAsXLS * ExpXls=new TDBGridEhExportAsXLS;
*/
    String Ext;

    SaveDialog1->FileName="ExFile";
    if (SaveDialog1->Execute())
    {
     switch(SaveDialog1->FilterIndex)
      {
       case 1:
            ExpClass=__classid(TDBGridEhExportAsText);
            Ext="txt";
            break;
      case 2:
            ExpClass=__classid(TDBGridEhExportAsCSV);
            Ext="csv";
            break;
      case 3:
            ExpClass=__classid(TDBGridEhExportAsHTML);
            Ext= "htm";
            break;
      case 4:
           ExpClass=__classid(TDBGridEhExportAsRTF);
           Ext= "rtf";
           break;
      case 5:
           ExpClass=__classid(TDBGridEhExportAsXLS);
           Ext="xls";
           break;
      Default:
        ExpClass=NULL;
        Ext="";
      }
      if(ExpClass!=NULL)
       {
//        if(UpperCase(Copy(SaveDialog1->FileName,SaveDialog1->FileName.Length()-2,3))!=
        if(UpperCase(SaveDialog1->FileName)!=UpperCase(Ext))
         {
          SaveDialog1->FileName=SaveDialog1->FileName + "." + Ext;
          grdDBGridEh1->Selection->SelectAll();//选择所有 
//          SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsXLS),DBGridEh1,SaveDialog1->FileName,False);
          SaveDBGridEhToExportFile(ExpClass,grdDBGridEh1,SaveDialog1->FileName,False);
          grdDBGridEh1->Selection->Clear();
          String sMsg="文件导出成功!/r/n/r/n"+SaveDialog1->FileName;
          Application->MessageBox(sMsg.c_str(),"导出文件",MB_OK+64);
         }
       }
   }

//==============================================================================

//方法二,运用OLE

 

//將DS輸出到Execl
int txDSToExecl(TDataSet *ds)
{
    Variant ex,newxls,sh;
    try{
       ex=CreateOleObject("Excel.Application");//啟動Excel
       ex.OlePropertySet("Visible",(Variant)true); //使Excel啟動后可見
       newxls=(ex.OlePropertyGet("Workbooks")).OleFunction("Add");//新建一新工作薄
       sh=newxls.OlePropertyGet("ActiveSheet");
    }catch(...)
    {
       ShowMessage("启动Excel出错,可能由于Excel没有正确安装");
       return -1;
    }
    if(ds->IsEmpty())
    {
       return 1;
    }
    ds->First();
    sh.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropert ySet("Size",11);
    for(int i=0;i<ds->FieldCount;i++)
    {
        sh.OlePropertyGet("Cells",1,i+1).OlePropertySet("Value",(TVa riant)(ds->Fields->Fields [I]->FieldName));
        sh.OlePropertyGet("Cells",1,i+1).OlePropertyGet("Font").OleP ropertySet("Bold",(TVariant)true);
    }
    int RecCount=0;;
    while(!ds->Eof)
    {
       for(int i=0;i<ds->FieldCount;i++)
       {
           sh.OlePropertyGet("Cells",RecCount+2,i+1).OlePropertySet("Value",
           (TVariant)ds->Fields->Fields[I]->AsString);
       }
       ds->Next();
       RecCount++;
    }
    return 0;
}
int txDSToExecl(TStringGrid *grid)
{
    Variant ex,newxls,sh;
    try{
       ex=CreateOleObject("Excel.Application");//啟動Excel
       ex.OlePropertySet("Visible",(Variant)true); //使Excel啟動后可見
       newxls=(ex.OlePropertyGet("Workbooks")).OleFunction("Add");//新建一新工作薄
       sh=newxls.OlePropertyGet("ActiveSheet");
    }catch(...)
    {
       ShowMessage("启动Excel出错,可能由于Excel没有正确安装");
       return -1;
    }
    if(grid->RowCount<10 )
    {
       return 1;
    }
    //ds->First();
    sh.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropert ySet("Size",11);
    for(int i=1;i<grid->ColCount;i++)
    {
        sh.OlePropertyGet("Cells",1,i+1).OlePropertySet("Value",(TVa riant)(grid->Cells[I][0]));// ds->Fields->Fields[I]->FieldName));
        sh.OlePropertyGet("Cells",1,i+1).OlePropertyGet("Font").OleP ropertySet("Bold",(TVariant)true);
    }
    int RecCount=0;;
    //while(!ds->Eof)
    for (int k=1;k<grid->RowCount;k++)
    {
       for(int i=1;i<grid->ColCount;i++)
       {
           sh.OlePropertyGet("Cells",RecCount+2,i+1).OlePropertySet("Value",
           (TVariant)grid->Cells[I][k]);//ds->Fields->Fields[I]->AsString);
       }
       //ds->Next();
       RecCount++;
    }
    return 0;
}
//將DS保存到Execl文件
void txDSToExeclFile(TDataSet *ds,AnsiString FileName)
{
    TStringList *sl;
    AnsiString sline="";
    try{
       sl=new TStringList();
       ds->First();
       for(int i=0;i<ds->FieldCount;i++)
       {
           sline+=ds->Fields->Fields[I]->FieldName;
           if(i!=ds->FieldCount-1)
           sline+=",";
       }
       sl->Add(sline);
       sline="";
       while(!ds->Eof)
       {
           for(int i=0;i<ds->FieldCount;i++)
           {
              if(ds->Fields->Fields[I]->AsString!="")
              sline+=ds->Fields->Fields[I]->AsString;
              else
              sline+="' ";
              if(i!=ds->FieldCount-1)
              sline+=",";
           }
           sl->Add(sline);
           sline="";
           ds->Next();
       }
       sl->SaveToFile(FileName);
    }
    __finally{
    delete sl;
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在他人的DBGridEh导出到Excel的基础上进行改进,增加功能如下: 1、支持多个DBGridEH同时导出到Excel的不同Sheet页 2、进度条与数据进度保持一致 3、增加了进度百分比显示 //调用方法: procedure TForm1.Button1Click(Sender: TObject); var DbOut: TDBGridEhToExcel; i: integer; begin try DbOut := TDBGridEhToExcel.Create(Self); for i := 0 to 9 do //初始化数组 begin DbOut.DBGridEhRecAry[i].TempDBGridEh := nil; DbOut.DBGridEhRecAry[i].TitleName := ''; DbOut.DBGridEhRecAry[i].SheetTabName := ''; end; //有多少个DBGridEh的数据要导出,此处表示两个 DbOut.DBGridEhRecLength := 2; //统计结果一 DbOut.DBGridEhRecAry[0].TempDBGridEh := dbgSpotCheckCount; DbOut.DBGridEhRecAry[0].TitleName := '统计结果一'; DbOut.DBGridEhRecAry[0].SheetTabName := '统计结果一'; //统计结果二 DbOut.DBGridEhRecAry[1].TempDBGridEh := dbgValuationCount; DbOut.DBGridEhRecAry[1].TitleName := '统计结果二'; DbOut.DBGridEhRecAry[1].SheetTabName := '统计结果二'; DbOut.TitleName := '统计结果'; DbOut.ShowProgress := True; DbOut.ShowOpenExcel := True; DbOut.ExportToExcel; finally FreeAndNil(DbOut); end; end; 还可以改进的地方,比如: 1、标题栏占用几行,字体,字体颜色,字体大小,背景颜色可以封装提供设置方法; 2、字段标题字体,字体颜色,字体大小; 3、表格样式设置; 就是动态数据不会封装到类里面,如果有高人封装得更好一些,请发一份我;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值