问题如题,本人也在网上查阅过很多资料,但是都行不通。我现在的方法是采用ADO连接,设置ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\a.xls;Extended Properties=excel 8.0';
strSql := 'select * into [Sheet1$] from abcde IN [ODBC] [ODBC;Driver=SQL Server;UID=sa;PWD=123;Server=S;DataBase=D]';
try
  ADOConnection1.Execute(strSql);
  ShowMessage('Succeed');
except
  ShowMessage('Failed');
end;
编译运行没有问题,d盘也有a.xls文件,但是点击打开后出现提示“不能访问'a.xls'”。这个方法我是在网上找到的,出现这个问题是怎么回事呢?另外我还查到一种方法,是采用下列语句:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
但我不知道EXEC是怎么一回事,该如何嵌入程序中。把他换成ADOConnection1.Execute,也发现不行。这个问题已困挠我很久了,也影响了开发进程,所以还请各位大虾多多帮忙啊,本人初来乍到,分数不多,但是谁能帮我解决这个问题,我的1/4分数都给他了,不够可以再加。

解决方案 »

  1.   

    EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
    我也是用这个的。把这个动态生成一个批处理文件,然后执行就可以了。
      

  2.   

    Ciny_Cou,请问如何动态生成批处理文件,刚学delphi,很多东西不懂啊。
      

  3.   

    function TF_pandian.ExportToExcel(Header: String;
      vDataSet: TDataSet): Boolean;
    var
      I,VL_I,j: integer;
      S,SysPath: string;
      MsExcel:Variant;
    begin
      Result:=true;
      if Application.MessageBox('您确信将数据导入到Excel吗?','提示!',MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
      begin
          SysPath:=ExtractFilePath(application.exename);
          with TStringList.Create do
          try
            vDataSet.First ;
            S:=S+Header;
            add(s);
            s:='';
            For I:=0 to vDataSet.fieldcount-1 do
              begin
                If vDataSet.fields[I].visible=true then
                   S:=S+#9+vDataSet.fields[I].displaylabel;
              end;
            system.Delete(s,1,1);
            add(s);
            while not vDataSet.Eof do
            begin
              S := '';
              for I := 0 to vDataSet.FieldCount -1 do
                begin
                  If vDataSet.fields[I].visible=true then
                     S := S + #9 + vDataSet.Fields[I].AsString;
                end;
              System.Delete(S, 1, 1);
              Add(S);
              vDataSet.Next;
            end;
            Try
              SaveToFile(SysPath+'\Tem.xls');
            Except
              ShowMessage('写文件时发生保护性错误,Excel 如在运行,请先关闭!');
              Result:=false;
              exit;
            end;
          finally
            Free;
          end;
          Try
            MSExcel:=CreateOleObject('Excel.Application');
          Except
            ShowMessage('Excel 没有安装,请先安装!');
            Result:=false;
            exit;
          end;
          Try
            MSExcel.workbooks.open(SysPath+'\Tem.xls');
          Except
            ShowMessage('打开临时文件时出错,请检查'+SysPath+'\Tem.xls');
            Result:=false;
            exit;
          end;
            MSExcel.visible:=True;
            for VL_I :=1 to 4 do
            MSExcel.Selection.Borders[VL_I].LineStyle := 0;
            MSExcel.cells.select;
            MSExcel.Selection.HorizontalAlignment :=3;
            MSExcel.Selection.Borders[1].LineStyle := 0;      MSExcel.Range['A1'].Select;
          MSExcel.Selection.Font.Size :=24;      J:=0 ;
          for i:=0 to vdataset.fieldcount-1 do
              if vDataSet.fields[I].visible  then
                 J:=J+1;      VL_I :=J;
          MSExcel.Range['A1:'+chr(VL_I+64)+'1'].Select;
          MSExcel.Range['A1:'+chr(VL_I+64)+'1'].Merge;
      end
      else
        Result:=false;
    end;调用:
    procedure TF_pandian.Button3Click(Sender: TObject);
    begin
      //adoquery2连接你要导出的SqlServer数据库表
      ExportToExcel('材料盘点表',adoquery2);
    end;
      

  4.   

    dbgrideh有这个功能直接使用就行
      

  5.   

    这种用OLE的,速度不是很快,我最近也在弄这个。还有就是你要对记录数进行判断。太大就要分批,或者不让导出。Excel中只让导出65536条的。
      

  6.   

    我试了一下,这个可以(运行环境Delphi7+Oracle9):
    procedure ExportToExcel;
    var
          SaveDialog: TSaveDialog;
          fileName: string;      Excel,
          WorkBook,
          WorkSheet: Variant;      r,
          c: Integer;
    begin
         if VisibleColumnCount <= 0 then begin
                MessageBox(GetActiveWindow, '导出失败,表格数据为空', '警告提示', MB_ICONWARNING or MB_OK);
                Exit;
          end;      try
                Excel := CreateOleObject('Excel.Application');
          except
                on e: Exception do begin
                      MessageBox(GetActiveWindow, '导出失败,请先安装电子表格Microsoft Excel', '警告提示', MB_ICONWARNING or MB_OK);
                      Excel := null;
                      Exit;
                end;
          end;      SaveDialog := TSaveDialog.Create(Self);
          SaveDialog.Filter := 'Excel表格|*.xls';      if SaveDialog.Execute then
                fileName := SaveDialog.FileName
          else
                Exit;      try
                WorkBook := Excel.Application.WorkBooks.Add;
                WorkSheet := WorkBook.WorkSheets[1];            //列
                for c := 0 to VisibleColumnCount - 1 do begin
                      WorkSheet.Cells[1].NumberFormat := '@';
                      WorkSheet.Cells[1, c + 1].Value := VisibleColumns[c].Caption.Text;
                end;            //行
                for r := 0 to Count - 1 do begin
                      for c := 0 to VisibleColumnCount - 1 do begin
                            WorkSheet.Cells[r + 2, c + 1].Value := Nodes[r].Texts[getCOlIndex(c)];
                      end;
                end;            try
                      if WorkBook.SaveAs(fileName) then begin
                            MessageBox(GetActiveWindow, pchar('成功导出到文件' + fileName), '提示', MB_ICONINFORMATION or MB_OK);
                      end;
                except
                      on e: Exception do begin
                            MessageBox(GetActiveWindow, '放弃保存', '提示', MB_ICONWARNING or MB_OK);
                            exit;
                      end;
                end;
          except
                on e: Exception do begin
                      MessageBox(GetActiveWindow, PChar(e.Message), '警告', MB_ICONWARNING or MB_OK);
                      WorkBook.Saved := True;
                      WorkBook := null;
                      Excel.Quit;
                      Excel := null;
                      Exit;
                end;
          end;      WorkBook.Saved := True;
          WorkBook := null;
          Excel.Quit;
          Excel := null;
    end;
      

  7.   

    一般导出到excel,
    方法1、用OLE的方法,从数据库提取数据然后逐条写入EXCEL文件,效率比较低,但方法灵活
    方法2、就是用EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
    你把这些内容改写后,读取到query中的sql中,然后执行就可以了。
      

  8.   

    各位辛苦了,我试了lovejiajia和wudi_1982的方法2,两者都可行,wudi_1982的方法2刚好解答我的第二个问题,原来这个sql是query中的sql,哈哈,多谢。但是这种方法无疑是最简洁方便的,缺憾是不够灵活,导出的excel文件中没有对应的字段名,查看起来就不大方便。chenyansong的方法,我一看很喜欢,但请问数据库连接部分是怎么样的?另外,谁能解答我的第一个问题。