将DBGrid里的数据导入EXCEL的

将DBGrid里的数据导入EXCEL的,分享一下:
void __fastcall Tsearch::DBGridToExcel(TDBGrid *AGrid, AnsiString Title)   //从DBGrid导出到Excel
{
  if (AGrid->DataSource->DataSet->IsEmpty())
  {
    ShowMessage("没有数据需要导出");
  }
  else
  {
    AGrid->DataSource->DataSet->DisableControls();
    TBookmark bmkDataSet = AGrid->DataSource->DataSet->GetBookmark();
    try
    {
      try
      {
        Variant vExcel = CreateOleObject("Excel.Application");
        vExcel.OlePropertySet("Visible",false);
        Variant vWorkbooks = vExcel.OlePropertyGet("Workbooks");
        Variant vWorkbook  = vWorkbooks.OleFunction("Add");
        Variant vSheets = vWorkbook.OlePropertyGet("Sheets");
        Variant vCells = vExcel.OlePropertyGet("Cells");

        int k = 0;
        for(int i = 0; i < AGrid->Columns->Count; i++)
        {                //本循环输出标题
          if (AGrid->Columns->Items[i]->Visible)
          {
            k++;
            vCells.OlePropertyGet("Cells",1,k).OlePropertySet("Value",AGrid->Columns->Items[i]->Title->Caption.c_str() );
            //vSheets.OlePropertyGet("Columns", k).OlePropertyGet("ColumnWidth").OlePropertySet("Value",
            //                         AGrid->Fields[k - 1]->DisplayWidth);
          }
        }
        AGrid->DataSource->DataSet->First();
        Variant vText=VarArrayCreate(OPENARRAY(int,
            (1, AGrid->DataSource->DataSet->RecordCount,
            1, AGrid->Columns->Count)), varVariant);
        int iRow=1;
        while (!AGrid->DataSource->DataSet->Eof)
        {
          int iCol = 0;
          for (int j=1;j<=AGrid->Columns->Count;j++)
          {
            if (AGrid->Columns->Items[j-1]->Visible)
            {
              iCol++;
              //vText.GetElement(iRow,iCol).ChangeType(varString);
              if(AGrid->Columns->Items[j-1]->Field->DataType==ftString)      //如果是字符原样输出,利用LOTUS '符
                  vText.PutElement("'"+AGrid->Columns->Items[j-1]->Field->DisplayText,iRow,iCol);
              else
                  vText.PutElement(AGrid->Columns->Items[j-1]->Field->DisplayText,iRow,iCol);
              //vCells.OlePropertyGet("Cells",iRow,iCol).OlePropertySet("NumberFormatLocal","@");

            }
          }
          iRow ++;
          Application->ProcessMessages();
          AGrid->DataSource->DataSet->Next();
        }

        vCells.OlePropertyGet("Range", vCells.OlePropertyGet("Item",2,1),
            vCells.OlePropertyGet("Item",AGrid->DataSource->DataSet->RecordCount+1,AGrid->Columns->Count)).OlePropertySet("Value",vText);

        vExcel.OlePropertySet("Visible", true);
      }
      catch(Exception &E)
      {
        ShowMessage(E.Message+"/n可能是系统没有安装Excel");
        //Application->MessageBox("系统没有安装Excel", Application->Title.c_str(), MB_ICONINFORMATION);
      }
    }
    __finally
    {
      if(bmkDataSet)
      {
        AGrid->DataSource->DataSet->GotoBookmark(bmkDataSet);
        AGrid->DataSource->DataSet->FreeBookmark(bmkDataSet);
      }
      AGrid->DataSource->DataSet->EnableControls();
    }
  }
}

把查询到的数据库记录导出到excel文件里面
#include <FileCtrl.hpp>


#pragma hdrstop
#include<Comobj.hpp>
#include<Utilcls.h>


void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 AnsiString SQLTxt,str;
  SQLTxt = "select * from ovf_dun_result order by id";
  Query1->Close();
  Query1->SQL->Clear();
  Query1->SQL->Add(SQLTxt);
  Query1->Open();
  if(Query1->RecordCount == 0) //无数据退出
  return;
 Variant ex,newxls,cellms; //ole万能变量,定义excel对象使用
 try
 {
  ex=CreateOleObject("Excel.Application"); //启动Excel
 }
 catch(...)
 {
  MessageDlg("无法启动Excel,可能尚未安装或文件已经损坏!",mtError,TMsgDlgButtons()<<mbYes,0);
  return;
}
 newxls=ex.OlePropertyGet("ActiveWorkBook");//创建工作簿对象
 ex.OlePropertyGet("WorkBooks").OleFunction("Add");//添加一个工作薄
 cellms=ex.OlePropertyGet("ActiveSheet");//创建工作区
 cellms.OlePropertyGet("Cells",1,1).OlePropertySet("Value","催收方式");
 cellms.OlePropertyGet("Cells",1,2).OlePropertySet("Value","代码");
 cellms.OlePropertyGet("Cells",1,3).OlePropertySet("Value","备注");
 ex.OlePropertySet("Visible",(Variant)true); //使Excel可见
 Query1->First();
 for(int i=0;i<Query1->RecordCount;i++)//按列灌入纪录
  {
   for(int j=0;j<Query1->FieldCount;j++) //行的值
    {
      str = Query1->Fields->Fields[j]->AsString;
      cellms.OlePropertyGet("Cells",i+2, j+1).OlePropertySet("Value", str.c_str());
     }
    Query1->Next();
   }
}
//---------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
发布原因:在网上找了很久也没找到个好用的,不是慢,就是要依赖Excel(必须按装),又找呀找,才找到一个http://blog.csdn.net/xiangding/archive/2003/10/27/16918.aspx,但试了一下,不能用,不知是我用法不对还是本身有问题(由于没有给出使用示例),后来找到http://developer.51cto.com/art/200510/7494.htm这个不错,但他又让我装ehlid,不爽,所以对其做了修改,其它也就是去了个加页脚的地方,很爽,有进度条,导完后如果按安装了Excel则直接打开,如果没有的话就不管了,自已想办法打开吧!特点:一、不需安装Excel即可导出。二、有进度条。三、最多可以导出多少条,我没试,我试了5万条没有问题,时间也就是只需1-5分钟(我电脑较慢)。四、不需安装组件。使用方法(注:别忘了uses DBGridToExcel;):procedure TForm1.btn1Click(Sender: TObject);var DBGridToExcel: TDBGridToExcel; ExcelFileName: string;begin DBGridToExcel := TDBGridToExcel.Create(nil); try DBGridToExcel.TitleName := '入网车辆统计报表'; DBGridToExcel.BeginDate := '开始日期:2005-07-01'; DBGridToExcel.EndDate := '结束日期:2005-07-18'; DBGridToExcel.UserName := '系统管理员'; DBGridToExcel.DBGrid := dbgrd1; DBGridToExcel.ShowProgress := True; if ExcelFileName = '' then begin ExcelFileName := 'c:\1.xls'; with TSaveDialog.Create(nil) do begin Filter := 'Microsoft Excel xls文件|*.xls'; DefaultExt := 'xls'; if not Execute then Exit else ExcelFileName := FileName; end; end; DBGridToExcel.FileName := ExcelFileName; DBGridToExcel.Open := False; DBGridToExcel.ExportToExcel; finally DBGridToExcel.Free; end;end;
void __fastcall TPhoneForm::SelectButtonClick(TObject *Sender) {   AnsiString StrDate, ExName;//存放日期用于sheet   AnsiString Datatem,phone1="拨号";//临时存放数据库的字段值   int i,j;   //查询所需的数据   PhoneADOQuery->Close();   PhoneADOQuery->Parameters->ParamByName("date1")->Value=PhoneMaskEdit1->Text;   PhoneADOQuery->Parameters->ParamByName("date2")->Value=PhoneMaskEdit2->Text;   PhoneADOQuery->Active=true;   //新建一个EXCEL   Ex = Variant::CreateObject("Excel.Application");   Ex.OlePropertyGet("workbooks").OleFunction("Add", 6);   Wb = Ex.OlePropertyGet("ActiveWorkBook");   Sh = Wb.OlePropertyGet("ActiveSheet");   Ex.OlePropertySet("Visible", true);   //给sheet以日期重命名,   StrDate=DateToStr(Date());   Sh.OlePropertySet("Name", StrDate.c_str());   //给EXCEL输入数据   for (j=0;j<PhoneADOQuery->FieldCount;j++)   {      Datatem=PhoneADOQuery->Fields->Fields[j]->FieldName;      Sh.OlePropertyGet("Cells", 1, j+1).OlePropertySet("Value", Datatem.c_str());   }   PhoneADOQuery->First();   for (i=0; i<PhoneADOQuery->RecordCount; i++)   {   for (j=0;j<PhoneADOQuery->FieldCount;j++)   {      Datatem=PhoneADOQuery->Fields->Fields[j]->AsString;      Sh.OlePropertyGet("Cells", i+2, j+1).OlePropertySet("Value", Datatem.c_str());      if (phone1==PhoneADOQuery->Fields->Fields[j]->FieldName)     {Sh.OlePropertyGet("Cells", i+2, j+1).OlePropertySet("NumberFormatLocal", "0_ ");//设置单元格格式为数值格式 }   }   PhoneADOQuery->Next();   }   //保存EXCEL并退出   ExName=GetCurrentDir()+"\\"+DateToStr(Date())+".xls";   Wb.OleFunction("SaveAs", ExName.c_str());   Wb.OleFunction("Close");   Ex.OleFunction ("Quit");   Ex = Unassigned; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值