因需要,需要从cxgrid导出数据到excel2007,i 不知道怎么写,有什么方法?
    
    我的机器上安装的是office 2007, 为什么 execlAPP := CreateOleObject('Excel.Application');执行这个语句时出错,
 提示:无效的类字符串。  谢谢。

解决方案 »

  1.   

        最主要的是这个:需要从cxgrid导出数据到excel2007,i 不知道怎么写,有什么方法?
      

  2.   

    每一行按 每个格的内容+#9格式组合 作为文件的一行写入文件
    文件后缀保存为excel2007的格式即可
      

  3.   


    usecxGridExportLink;
    procedure TForm23.BitBtn3Click(Sender: TObject);
      var
      filename,fileExt:string;
      begin
        self.SaveDialog1.FileName:=formatdatetime('信息YYYYMMDDHHMMSS',now);
          if   SaveDialog1.Execute   then
          begin
           try
          FileName   :=   Self.SaveDialog1.FileName;
          case self.SaveDialog1.FilterIndex of 
          1: filename:=filename+'.xls';
          2: filename:=filename+'.txt';
          3: filename:=filename+'.xml';
          4: filename:=filename+'.html';
          end;      FileExt   :=   LowerCase(ExtractFileExt(FileName));
          if   FileExt   =   '.xls'   then
              ExportGridToEXCEL(FileName,   Self.cxGrid1,false,true,true)
          else   if   FileExt   =   '.xml'   then
              ExportGridToXML(FileName,   Self.cxGrid1,false,false)
          else   if   FileExt   =   '.txt'   then
              ExportGridToText(FileName,   Self.cxGrid1,false,false)
          else   if   FileExt   =   '.html'   then
              ExportGridToHTML(FileName,   Self.cxGrid1,false,false)
          else   
          begin
             MessageBox(self.Handle ,'不支持的导出文件类型...','系统提示',$00000040);
              Exit;   
          end;          except
             messagebox(self.Handle,'导出文件保存失败!','错误提示',$00000040);
           end;      end;end;if SaveDialog1.Execute then
     begin
       ExportGridToExcel(SaveDialog1.FileName,cxGrid1,True,True,True);
     end;
    end;
      

  4.   

    楼上,你说的这个函数我也懂用,就是不能导出excel2007格式的excel表*.xlsx ,这样的,
    下面是我自己写的一个代码,可是又出错。  procedure Tfrinboundcheck.btn2Click(Sender: TObject);
    var
      SfileName, str: string;
      execlAPP, sheet, data: Variant;
      row,i: Integer;
      j, k: Integer;
    begin  dm.dlgSave1.Filter := '*.xls| *.xls';
      DM.dlgSave1.DefaultExt := '*.xls';
      if DM.dlgSave1.Execute then
      begin
        //ShowMessage(SfileName);
        SfileName := DM.dlgSave1.FileName;
        try
          execlAPP := CreateOleObject('Excel.Application');
           execlAPP.workbooks.add;
        except
          ShowMessage('创建exce2007失败!');
          exit;
        end;
        for i := 0 to cxgrdbtblvwGrid1DBTableView1.ColumnCount - 1 do
        begin
          if cxgrdbtblvwGrid1DBTableView1.Columns[i].Visible then
          begin
            execlAPP.cells[1, i + 1 ] := cxgrdbtblvwGrid1DBTableView1.Columns[i].Caption;
          end;
        end;    i := 2;
        aqybase.First;
        while not aqybase.Eof do
        begin
          for j := 0 to aqybase.FieldCount -1  do
          begin
            if cxgrdbtblvwGrid1DBTableView1.Columns[j].Visible then
            begin
             // execlAPP.cells[i, j + 1].numberformat :='@';
              if not aqybase.FieldByName(aqybase.Fields.Fields[j].FieldName).IsNull then
              begin            //就是这个j超出了上限14,我是有14个字段,我用的是dbgrid这样写也没有错啊,这个j 就是0 到 13而已,那里到14了?
                str := aqybase.fieldbyname(aqybase.Fields.Fields[j].FieldName).Value;
                //ShowMessage(str);
                execlAPP.cells[i,j + 1] :=  str;
              end;
            end;
          end;
          if  i =65535 then
            Break;
          Inc(i);
          Next;
        end;    execlAPP.ActiveWorkbook.SaveAs(sFileName,xlNormal,'', '',False,False);
        execlAPP.workbooks[1].Close;
        execlAPP.quit;
        execlAPP := Unassigned;
      end;
      

  5.   

      if cxgrdbtblvwGrid1DBTableView1.Columns[j].Visible then  说错了,是这个这里错,j超出了索引上限了
      

  6.   

    不知道楼主的Delphi是什么版本的,delphi7默认的是office2k控件,到了delphiXE有officeXP和office2k3可以选择,至于office2k7恐怕楼主要自己写了吧或者找第三方控件传出吧
      

  7.   

    cle 可以.2003 .2007 CLE 都可以实现!
      

  8.   

    我用一个第三方控件“DataToExcel”,挺好用的,楼主要的话可以发给你