本帖最后由 lsh341999 于 2009-12-08 15:34:56 编辑

解决方案 »

  1.   

    请问怎么在TClientDataSet控件无recordset属性的情况下代替TAODQuery控件中的recordset属性 
    -------------------------------------------------------------------------------
    1、recordset就是数据集,相当于 TClientDataSet的Data
      

  2.   

    这个我知道啊,
    xlQuery :=xlSheet.QueryTables.Add(dm.dsPOremnuntType.data,xlSheet.Range['A1']);
    出错了...
    错误提示:类型不匹配
    TClientDataSet的Data数据集好像是XML类型的
      

  3.   

    //   ---------------------------------------------------------   //
    //   Name:                 FieldTypeToADOString(p_FieldType:   TFieldType):   string;
    //   Description:   把各种数据格式(Delphi   supported)转换成ADO字符串;
    //   Input   Para:     1)   p_FieldType:   TFieldType;
    //   Output   Par:     1)   String   --   only   has   value   'string';
    //   Comment:
    //   ---------------------------------------------------------   //function FieldTypeToADOString(p_FieldType: TFieldType): string;
    begin
          {   TODO   :   Real   values   }
      case p_FieldType of
        ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
          ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
          ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
          ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,
          ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob,
          ftVariant, ftInterface, ftIDispatch, ftGuid: result := 'string';
      end;
    end;//   ---------------------------------------------------------   //
    //   Name:                 ADOXMLFromDataSet(Source:   TDataSet):   String;
    //   Description:   Transfer   the   specified   dataset   into   the   XML
    //       document   which   supplied   by   microsoft's   ADO;
    //   Input   Para:     1)   Source:   Dataset   --   Original   dataset
    //   Output   Par:     1)   String   --   XML   document's   string;
    //   Comment:           1)   把数据集转换为ADO支持的XML格式;
    //                             2)   注意xml文档中的microsoft的name-space;
    //   ---------------------------------------------------------   //function ADOXMLFromDataSet(Source: TDataSet): string;
    const
      BoolToStrMAP: array[boolean] of string = ('true', 'false');
    var
      FieldIndex: Integer;
      slst: TStringList;
    begin
      result := '';
      slst := TStringList.Create;
      try
        //   ADO   XML   Prolog   --   Note   is   microsoft's   type!!!
        slst.Add('<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"');
        slst.Add('xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"');
        slst.Add('xmlns:rs="urn:schemas-microsoft-com:rowset"');
        slst.Add('xmlns:z="#RowsetSchema">');
        //   Schema
        slst.Add('<s:Schema id="RowsetSchema">');
        slst.Add('<s:ElementType   name="row"   content="eltOnly"   rs:updatable="true">');
        //   Loop   through   each   of   the   Fields   in   the   DataSet
        for FieldIndex := 0 to Source.FieldCount - 1 do
        begin
          slst.Add(Source.Fields[FieldIndex].FieldName + '="' + Source.Fields[FieldIndex].AsString + '"   ');
          slst.Add('<s:AttributeType   name="' + Source.Fields[FieldIndex].FieldName + '"   rs:number="' + IntToStr(FieldIndex) + '"   rs:write="' + BoolToStrMAP[Source.Fields[FieldIndex].ReadOnly] + '">');
          slst.Add('<s:datatype   dt:type="' + FieldTypeToADOString(Source.Fields[FieldIndex].DataType) + '"   dt:maxLength="' + IntToStr(Source.Fields[FieldIndex].Size) + '"');
          slst.Add('   rs:maybenull="' + BoolToStrMAP[Source.Fields[FieldIndex].Required] + '"/>');
          //   rs:precision='0'   rs:long='true'
          slst.Add('</s:AttributeType>');
        end;
        slst.Add('<s:extends   type="rs:rowbase"/>');
        slst.Add('</s:ElementType>');
        slst.Add('</s:Schema>');
        //   Data
        slst.Add('<rs:data>');
        slst.Add('<rs:insert>');
        while not Source.EOF do
        begin
          //   Generic   tag   identifying   new   record
          slst.Add('<z:row   ');
          //   Loop   through   each   of   the   Fields   in   the   DataSet
          for FieldIndex := 0 to Source.FieldCount - 1 do
            //   Add   the   Param   for   the   Field
            slst.Add(Source.Fields[FieldIndex].FieldName + '="' + Source.Fields[FieldIndex].AsString + '"   ');
          //   Close   record   tag
          slst.Add('   />');
          //   Go   to   the   next   record
          Source.Next;
        end; //   while
        slst.Add('</rs:insert>');
        slst.Add('</rs:data>');
        slst.Add('</xml>');
        //   return   the   result
        result := slst.Text;
      finally
        slst.free;
      end;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      ExlApp: OleVariant;
      ExlBook: OleVariant;
      xlSheet: OleVariant;
      xlQuery: Variant;
      rs: _Recordset;
      xml: string;
    begin
      ExlApp := CreateOleObject('Excel.Application');
      ExlApp.Visible := true;
      ExlBook := ExlApp.Workbooks.Add;
      xlSheet := ExlBook.Worksheets[1];
      xlSheet.activate;
      xml := ADOXMLFromDataSet(ds1);
      rs := RecordsetFromXML(xml);
      xlQuery := xlSheet.QueryTables.Add(rs, xlSheet.Range['A1']);
      xlQuery.FieldNames := True;
      xlQuery.RowNumbers := False;
      xlQuery.FillAdjacentFormulas := False;
      xlQuery.PreserveFormatting := True;
      xlQuery.RefreshOnFileOpen := False;
      xlQuery.BackgroundQuery := True;
      //xlQuery.RefreshStyle := xlInsertDeleteCells;
      xlQuery.SavePassword := True;
      xlQuery.SaveData := True;
      xlQuery.AdjustColumnWidth := True;
      xlQuery.RefreshPeriod := 0;
      xlQuery.PreserveColumnInfo := True;
      xlQuery.FieldNames := True;
      xlQuery.Refresh;
    end;
      

  4.   

    {
      Example:
      ...
        ADOQuery1.Recordset:=RecordsetFromXML(Memo1.Lines.Text);
      ...
    }
    function RecordsetFromXML(const XML: String): _Recordset;
    var RS: Variant;
        Stream: TStringStream;
    begin
      Result:=nil;
      if XML='' then Exit;
      try
        Stream:=TStringStream.Create(AnsiToUtf8(XML));
        Stream.Position:=0;
        RS:=CreateOleObject('ADODB.Recordset');
        RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
        Result:=IUnknown(RS) as _Recordset;
      finally
        Stream.Free;
      end;
    end;
      

  5.   

    哎,解决不了啊.
    只能用最原始的方法了[好慢啊]
    感谢大家的支持
    iasp发的ADOXMLFromDataSet还是很有用的