谁有dbgrid导出到excel的快速方法?三方控件,ole,直接用数据集导出以及用存储过程的方法我都有了。但有没有直接从dbgrid导出到excel的快速方法呢?

解决方案 »

  1.   

    字段值之间用Tab值,文件扩展名用.xls就可以了
      

  2.   

    我遇到了更奇怪的问题
    dbgrid导出到Excel最前面两个字段和最后面的两个字段之间没有间隔符号,是什么原因
      

  3.   

    直接用DBGRID 导出
    我认为速度是快不了的!
      

  4.   

    给你一个函数void __fastcall Tsearch::DBGridToExcel(TDBGrid *AGrid, AnsiString Title)   //从DBGrid导出到Excel
    {
      if(AGrid->DataSource->DataSet->IsEmpty())
      {
        ShowMessage("没有数据需要导出");
      }
      else
      {
        AGrid->DataSource->DataSet->DisableControls();
        TBook bmkDataSet = AGrid->DataSource->DataSet->GetBook();
        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->GotoBook(bmkDataSet);
            AGrid->DataSource->DataSet->FreeBook(bmkDataSet);
          }
          AGrid->DataSource->DataSet->EnableControls();
        }
      }
    }
    //---------------------------------------------------------------------------
      

  5.   

    可以用逗号分隔文件 字段之间用半角逗号 记录之间用回车 取名x.csv