通过ADO将TDataSet复制到XLS

我试图使用ADO连接将内容从TDBGrid复制到Excel文件以传输数据。 这适用于<= 255个字符但更长的string失败的值。 我能做些什么来复制超过255个字符的string?

将数据types更改为adLongVarWChar tbl.Columns.Append不起作用。 ADOQuery获取大小为255的varchar字段,不pipe我在创build表时使用的是什么。

procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string); var cat : _Catalog; tbl : _Table; col : _Column; i : integer; ADOConnection : TADOConnection; ADOConnectionExcel: TADOConnection; ADOQuery : TADOQuery; ScrollEvents : TScrollEvents; SavePlace : TBookmark; begin //exporting ADOConnectionExcel := TADOConnection.Create(nil); try ADOConnectionExcel.LoginPrompt := False; ADOConnectionExcel.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0'; ADOConnectionExcel.Open; //WorkBook creation (database) cat := CoCatalog.Create; cat._Set_ActiveConnection(ADOConnectionExcel.ConnectionObject); //WorkSheet creation (table) tbl := CoTable.Create; tbl.Set_Name(SheetName); //Columns creation (fields) DBGrid.DataSource.DataSet.First; with DBGrid.Columns do begin for i := 0 to Count - 1 do if Items[i].Visible then begin col := nil; col := CoColumn.Create; with col do begin Set_Name(Items[i].Title.Caption); Set_Type_(adVarWChar); end; //add column to table tbl.Columns.Append(col, adVarWChar, 20); end; end; //add table to database cat.Tables.Append(tbl); col := nil; tbl := nil; cat := nil; //exporting ADOConnection := TADOConnection.Create(nil); ADOConnection.LoginPrompt := False; ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0'; ADOQuery := TADOQuery.Create(nil); ADOQuery.Connection := ADOConnection; ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]'; ADOQuery.Open; DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents); SavePlace := DBGrid.DataSource.DataSet.GetBookmark; try with DBGrid.DataSource.DataSet do begin First; while not Eof do begin ADOQuery.Append; with DBGrid.Columns do begin ADOQuery.Edit; for i := 0 to Count - 1 do if Items[i].Visible then begin //Fails if Length > 255 ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString; end; ADOQuery.Post; end; Next; end; end; finally DBGrid.DataSource.DataSet.GotoBookmark(SavePlace); DBGrid.DataSource.DataSet.FreeBookmark(SavePlace); EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents); ADOQuery.Close; ADOConnection.Close; ADOQuery.Free; ADOConnection.Free; end; finally if Assigned(ADOConnection) and ADOConnection.Connected then ADOConnectionExcel.Close; ADOConnectionExcel.Free; end; end; 

您可以使用Jedi中的TJvDBGridExcelExport JVCL(www.delphi-jedi.org/)。 我用这个很好的结果,这是开源的。