2012-12-03 12 views
1

我試圖使用ADO連接將內容從TDBGrid複製到Excel文件以傳輸數據。這適用於< = 255個字符的值,但對於更長的字符串將失敗。我能做些什麼來複制超過255個字符的字符串?通過ADO將TDataSet複製到XLS

更改數據類型爲adLongVarWChar tbl.Columns.Append不起作用。 ADOQuery獲取大小爲255的varchar字段,不考慮我在創建表時使用的內容。

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; 
+1

也許你可以在ADO之外做到這一點?您可以使用COM接口(TExcelApplication組件) - 雖然它不是非常快速的方法。或者也許是DDE。或創建Excel-XML文件並通過excel.exe打開它 –

回答

1

您可以使用TJvDBGridExcelExport JVCL絕地(www.delphi-jedi.org/)的到來。我用這個很好的結果,這是開源的。

+0

不幸的是我不能完全包含jedi組件,但TJvDBGridExcelExport是重新實現導出的一個很好的起點。 – Trellmor

相關問題