Скопируйте TDataSet в XLS через ADO

Я пытаюсь скопировать содержимое из TDBGrid в файл Excel, используя ADO-соединение для передачи данных. Это работает для значений <= 255 символов, но не для более длинных строк. Что я могу сделать, чтобы скопировать строки длиной более 255 символов?

Изменение типа DataType на adLongVarWChar tbl.Columns.Append не работает. ADOQuery получает поле varchar с размером 255 без учета того, что я использую при создании таблицы.

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; 

Interesting Posts

Зацикливание непустых ячеек, выполнение функции, если значение не пустое

Сопоставить ячейку со списком и выражением

Использование if условие для значения объекта списка и строки excel VBA

Чтение файла excel и обновление с добавлением новой строки

Странный прыжок, когда я использую панды для чтения определенных столбцов в .csv

необходимо ссылаться на 2 разных ячейки и 2 разных диапазона, чтобы найти ответ в excel и поместить его в активную ячейку

Импорт CSV-файлов со специальными символами

Запись данных в листе excel (xlsx) с таблицей

Как преобразовать внутреннюю дату Oracle в дату Excel в Excel?

Преобразование формулы excel в электронные таблицы google

Ошибка при создании Excel XML с помощью XSLT – значение Bad Index

Excel условное форматирование – цветовые шкалы

Сумма числителей разных дробей в Excel

Как обновить диаграмму при изменении данных?

Гиперссылка для запуска макроса в personal.xlsb

Давайте будем гением компьютера.