在三层结构中,怎样把ado客户端数据集中的数据导出至excel。

解决方案 »

  1.   

    function CreateExcel: _Application;
    begin
      try
        Result := CoExcelApplication.Create;
      except
        MessageDlg('系统缺少Excel或者被损坏,请您安装或者修复Mirosoft Office后再使用该功能!',
            mtWarning, [mbOK]);
      end;
    end;
                                                 
    function NewWorkBook(ExcelApp: _Application): _WorkBook;
    begin
      Result := ExcelApp.Workbooks.Add(XLWBatWorksheet, 0);
    end;function NewWorkSheet(ExcelApp: _Application): IDispatch; overload;
    begin
      Result := ExcelApp.Worksheets.Add(null, ExcelApp.ActiveSheet, 1, XLWBatWorksheet, 0);
    end;function NewWorkSheet(Book: _WorkBook): IDispatch; overload;
    begin
      Result := Book.Worksheets.Add(null, Book.ActiveSheet, 1, XLWBatWorksheet, 0);
    end;procedure SetCells(Sheet: Variant; x, y: Integer; const Value: String);
    begin
      Sheet.Cells[y, x] := Value; 
    end;//数据集导出到excel
    procedure DataSetToExcel(DataSet: TDataSet);
    var ExcelApp: _Application; Book: _WorkBook; Sheet: IDispatch;
      i, j: Integer;   OldMark: TBook;
    begin
      if not DataSet.Active then DataSet.Active := true;
      if DataSet.RecordCount>65536 then
        if MessageDlg('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?',
            mtWarning, mbOKCancel)=mrCancel then exit;
      ExcelApp := CreateExcel;
      if not VarIsEmpty(ExcelApp) then
      try
        Book := NewWorkBook(ExcelApp);
        Sheet := Book.ActiveSheet;
        for i:=0 to DataSet.FieldCount-1 do
          SetCells(Sheet, i+1, 1, DataSet.Fields[i].DisplayName);    DataSet.DisableControls;
        OldMark := DataSet.GetBook;
        Dataset.First;    i := 1;
        while not Dataset.Eof do begin
          inc(i);
          for j:=0 to DataSet.FieldCount-1 do
            SetCells(Sheet, j+1, i, Dataset.Fields[j].AsString);
          if i=65536 then
             break;
          //ProgressBar1.StepBy(1);
          Dataset.next;
        end;
        Dataset.GotoBook(OldMark);
      finally
        Dataset.EnableControls;
        ExcelApp.Visible[0] := True;
        ExcelApp := nil;
      end;
    end;
      

  2.   

    一种是比较笨的方法,将记录一条一条的写入excle文件;
    另外是用Server下面的某个组件,我忘了,以前作过,代码没有在身边
      

  3.   

    sweethzp(黄纸片) ( ) 
    能说说是怎样一个步骤,万分感谢。
      

  4.   

    我也正找这个问题的答案,希望能将数据库表中的记录导入到EXCEL,如果用SaveToFile()
    ,导出的格式太混乱,不适合编辑。通过数据集一条一条的写到EXCEL是可以实现,但是把EXCEL导入到库表中,思路是什么?总不能一条一条的写SQL插入。想知道SQL SERVER 控制台的导入导出的实质是什么?
      

  5.   

    为什么不用F1 activex控件呢?
      

  6.   

    F1 activex控件?何解? 导出为EXCEL并在需要的时候(用EXCEL手动编辑过之后)再导入到数据库表中,用代码实现,对于后边一半功能,我需要找到一个好办法。没法子,客户就是有这种需求
      

  7.   

    如果你用的是F1BOOK直接保存之后就可以用EXCEL打开。
      

  8.   

    调用OWC控件(Office Web Components)试试看。
    程序一。
    <table width=100%>
    <tr>
        <td width=100%><OBJECT classid=clsid:0002E510-0000-0000-C000-000000000046 
           id=Spreadsheet1 style="width=100%"></OBJECT></td>
        
    </tr>
    <tr><td>&nbsp;</td></tr>
    <tr>
        <td align=center>
    <input type="button" name="Submit2" onclick='Savedata()' value=" 保存数据 " class=button1>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <input type="button" name="closewin" onclick="window.close();" value=" 关闭窗口 " class=button1>
    </td>
        
    </tr>
    </table>
    <script language=vbscript>
    Dim strData
    Dim cSub Window_onLoad(url)
    set c = Spreadsheet1.Constants
    Spreadsheet1.Cells.Clear
    Spreadsheet1.TitleBar.Caption = "<%= session("companyname") %>"+"<%= request("dateyear") %>"+"年"+"<%= request("datemonth") %>"+"月份业务账单"
    Spreadsheet1.DataType = "HTMLURL"
    Spreadsheet1.HTMLURL = url
    Spreadsheet1.Refresh
    Spreadsheet1.ActiveSheet.UsedRange.AutoFitColumns
    Spreadsheet1.Range("A1").Select
    end subFunction SaveData()
    On Error Resume Next
    SpreadSheet1.ActiveSheet.Export "<%= session("companyname") %>"+"<%= request("dateyear") %>"+"年"+"<%= request("datemonth") %>"+"月份业务账单.xls", c.ssExportActionNone
    If Err<>0 Then
       MsgBox "Unable to Export to Excel."
    End If
    On Error GoTo 0
    End Function</script>
      

  9.   

    对不起,tfxg(土匪)说的F1BOOK和 bike(bike) 贴的ASP脚本,都是讲我提的问题的前一半,至于后一半呢? 比如,我有一个1000行的EXCEL表,我想把它导入到指定的数据库表中,用代码实现的思路是什么?
      

  10.   

    这个是把dbgrid中的数据存到excel中procedure TlxForm.SaveToExcel(Db_data:TDBGrid);
    var
        XlAPP:Variant;
        excelcount:integer;
        Sheet1:Variant;
        i,j:integer;
    begin
      if not Db_data.DataSource.DataSet.Active then exit;
      if Db_data.DataSource.DataSet.RecordCount<1 then exit;
      //创建excel对象
      try
          XlApp:=createoleobject('Excel.Application');
          XLApp.Visible:=false;
          excelcount:=XLApp.Workbooks.count;
          XLApp.Workbooks.Add(xlWBatWorkSheet);
          Sheet1 := XLApp.Workbooks[1].WorkSheets['sheet1'];
      except
        showmessage('你的电脑没出息有安装excel程序,无法完成此功能!');
        exit;
      end;
      //setfocus;处理标题
      for j:=0 to Db_data.FieldCount-1 do
      begin
          sheet1.cells[1,j+1]:=Db_data.Columns[j].Title.Caption;
      end;
      //处理记录
      Db_data.DataSource.DataSet.First;
      i:=2;
      while not Db_data.DataSource.DataSet.Eof do
      begin
       //处理一行
       for j:=0 to Db_data.FieldCount-1 do
       begin
          if Db_data.Fields[j]<>nil then
              Sheet1.cells[i,j+1]:=trim(Db_data.Fields[j].asstring)
          else
              Sheet1.cells[i,j+1]:='';
       end;
       i:=i+1;
       Db_data.DataSource.DataSet.Next;
      end;
      XLApp.Visible:=true;
    end;
      

  11.   

    不要用ExcelApplication来导入数据,这样当然慢了,直接用ado来导入,ado本身就支持execl的.以下是ado组件的connectionstring的连接字符串Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\我的文档\人事资料\在职\2001年11月在职职工98封定工资.xls;Mode=Share Deny None;Extended Properties=Excel 8.0;把其中的"Data Source=D:\我的文档\人事资料\在职\2001年11月在职职工98封定工资.xls"改成你的execl文件,就可以直接用adotable或adoquery来打开处理了.这样的效率将是你原来方法的N倍!