解决方案 »
- object pascal问题 (数据类开型转换问题)
- Locate气死我了
- 关于 DBGrid ,大家请进!? 100分感谢!?
- 在DLL中,为什么返回值的字符串总是不完全,大家看看这段代码,错在哪里?先谢了!
- delphi7好像多了很多东西,也少了不少东西
- 删除一个文件用filedelete,删除一个目录用什么?
- ODAC 中的oraquery 有没有updatebatch 这个属性的?
- 请问如何用delphi在excel里插入一张图片?
- 如何发数据给电子屏显示
- Delphi 7调用接口API C++ DLL 带结构体的函数问题?
- delphi怎么调用java写的WebService ?
- 使用GetShareNetInfo获取本机共享目录的信息,请高手指点
-------------------------------------------------------------------------------
1、recordset就是数据集,相当于 TClientDataSet的Data
xlQuery :=xlSheet.QueryTables.Add(dm.dsPOremnuntType.data,xlSheet.Range['A1']);
出错了...
错误提示:类型不匹配
TClientDataSet的Data数据集好像是XML类型的
// 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;
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;
只能用最原始的方法了[好慢啊]
感谢大家的支持
iasp发的ADOXMLFromDataSet还是很有用的