Форум: "Потрепаться";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизКто знает какие либо методы быстрого сброса данных В Эксель ? Найти похожие ветки
← →
Dmitriy O. © (2004-12-07 12:39) [0]Например нужно бросить 20 тыс Rows на 15 Col
Это получается 300 тысяч Cells. Если обходить их в цикле то долго. Я вот щас пробую через ADOTable. Мож еще кто знает как ?
← →
Суслик © (2004-12-07 12:44) [1]
> Мож еще кто знает как ?
в бинарный формат biff8.
У меня это заняло 1 месяц. Будешь писать - буду рад помочь.
10 страниц по полной (т.е. макс кол-во рядов и макс кол-вол колонок) генерится за 10 минут.
Твой случай - секунд 20 будет (зависимость нелинейная).
← →
}|{yk © (2004-12-07 12:45) [2]VarArray
← →
Суслик © (2004-12-07 12:53) [3]ексель умеет засасывать текстовые файлы. Если тебе не нужно форматирование, можешь воспользоваться этим методом.
biff8 я реализовывал, чтобы выдавать полноценный отчет.
← →
Dmitriy O. © (2004-12-07 13:07) [4]Вобщем мне надо передать набор записей из IBDataSet в таблицу Эксель. Гдет порядка не более 300 тысяч Cells.
Сейчас как я говорил эксперементирую с ADO table т.е. подключаюсь к Экселю как к базе данных и вношу туда записи.
Как бы еще научится вставлять туда записи через ADOQuery методом Insert. Но тут трудности т.к. придется конектится к базовой табле что на сервере.
> }|{yk © (07.12.04 12:45) [2]
> VarArray
А премер кода мож ? А то я ни как понять не могу этот метод. Хотя врод ехо рекомендуют.
← →
}|{yk © (2004-12-07 13:11) [5]Если поможет
{IFDEF UseExcel}
function TMyDBGrid.SaveToXLS(_FileName: TFileName; UseOnlyVisibleColumns: boolean = true): TFunctionResult;
var
XLSArray, XLSRow: Variant;
HighBound, IDX: integer;
book: TBookmark;
E: Exception;
FieldsList: TStringList;
ExcelApp: TOpExcel;
begin
Result.Successful := False;
Result.MessageOnError := "There is no data grid";
try
if Assigned(self) then
if Assigned(DataSource) then
if Assigned(DataSource.DataSet) then
begin
try
book := DataSource.DataSet.GetBookmark;
DataSource.DataSet.DisableControls;
if DataSource.DataSet.IsEmpty then
begin
Result.MessageOnError := "Dataset is empty"
end
else
{а тут власне виведення даних до варіантного масиву}
begin
FieldsList := TStringList.Create;
for Idx := 0 to self.Columns.Count - 1 do
begin
if self.Columns[Idx].Visible or not UseOnlyVisibleColumns then
FieldsList.Add(self.Columns[Idx].FieldName);
end;
with self.DataSource.DataSet do
begin
Last; {щоб відфетчити всі записи}
XLSArray := VarArrayCreate([0, RecordCount - 1], varVariant);
First;
while not Eof do
begin
XLSRow := VarArrayCreate([0, FieldsList.Count - 1], varVariant);
for IDX := 0 to FieldsList.Count - 1 do
XLSRow[IDX] := FindField(FieldsList.Strings[Idx]).Value;
XLSArray[RecNo - 1] := XLSRow;
Next;
end;
end;
Result.MessageOnError := "Data retrived from dataset, but not inserted into Excel";
{тепер грузимо Excel та кидаємо в нього масив}
try
ExcelApp := TOpExcel.Create(self);
ExcelApp.Visible := false;
ExcelApp.Connected := true;
with ExcelApp.Workbooks.Add do
begin
with Worksheets.Add do
with Ranges.Add do
begin
for IDX := VarArrayLowBound(XLSArray, 1) to VarArrayHighBound(XLSArray, 1)
do
begin
Address := GetCellDiapasoneName(1, FieldsList.Count, IDX + 1, IDX + 1);
Name := Format("Record No %d", [IDX]);
Value := XLSArray[IDX];
end;
end;
SaveAs(_FileName);
end;
Result.Successful := true;
Result.MessageOnError := "Succesfull transfered data";
finally
ExcelApp.Free;
end;
end;
finally
if Assigned(book) then
DataSource.DataSet.GotoBookmark(book);
DataSource.DataSet.EnableControls;
end;
end;
except on E: Exception do
begin
Result.MessageOnError := E.Message;
Exit;
end;
end;
end;
{ENDIF}
← →
GanibalLector © (2004-12-07 13:13) [6]2 }|{yk
Извини,а на кой писать комменты на украинском?Просто интересно...Ведь ты,как и я,живешь в русскоязычном регионе.
← →
Vovchik_A © (2004-12-07 13:19) [7]2GanibalLector © (07.12.04 13:13) [6]
А вдруг он пишет, на украиноязычную аудиторию ?
← →
}|{yk © (2004-12-07 13:20) [8]Как раз регион не русскоязычный. Харьков - русскоязычный, Харьковщина - украиноязычная (точне конечно же суржикоязычная, но не суть важно). А какое дело до того, как я пишу комментарии? Я разговариваю на украинском, вот и пишу комментарии на украинском.
← →
Игорь Шевченко © (2004-12-07 13:22) [9]
> FieldsList := TStringList.Create;
А где .Free ?
← →
Думкин © (2004-12-07 13:24) [10]
> GetCellDiapasoneName
А имена на английском суржике?
← →
GanibalLector © (2004-12-07 13:25) [11]
> Я разговариваю на украинском, вот и пишу комментарии
> на украинском.
Тогда понятно.
← →
}|{yk © (2004-12-07 13:25) [12]Спасибо, не заметил. Редко пользуюсь этой функцией.
← →
}|{yk © (2004-12-07 13:27) [13]
> А имена на английском суржике?
Если знаю точный перевод, пишу на английском, не знаю - на суржике. Что поделаешь, насколько знаю английский (надо будет подучить)
← →
Игорь Шевченко © (2004-12-07 13:32) [14]
> Если знаю точный перевод, пишу на английском, не знаю -
> на суржике. Что поделаешь, насколько знаю английский
Диапазон=Range
← →
Anatoly Podgoretsky © (2004-12-07 13:35) [15]}|{yk © (07.12.04 13:27) [13]
А зачем учить? Ведь есть же словари, даже электронные.
← →
Думкин © (2004-12-07 13:35) [16]> [13] }|{yk © (07.12.04 13:27)
У меня стоит переводчик. На всякий. Оно полезно. Ведь работая с Excel тем же - лучше знать английский вариант многих вещей. Без Range - куда в Экселе?
← →
GuAV © (2004-12-07 14:21) [17]}|{yk © (07.12.04 13:11) [5]
что то попридираться захотелось...
if Assigned(self) then
Когда Self бывает не Assigned ? (кроме cлучая прямого присвоения Self := nil внутри того же метода)
Почему бы не использовать обычную обработку ислючений зачем это вроде
> except on E: Exception do
> begin
> Result.MessageOnError := E.Message;
> Exit;
> end;
?
DataSource.DataSet.DisableControls; IMHO до try
чему равен Book если exception на GetBookmark ?
if Assigned(book) then
← →
SergP © (2004-12-07 14:41) [18]
> [6] GanibalLector © (07.12.04 13:13)
> 2 }|{yk
> Извини,а на кой писать комменты на украинском?Просто интересно...Ведь
> ты,как и я,живешь в русскоязычном регионе.
Скорее всего это связано с тем что сейчас происходит. Думаю я угадал.
← →
}|{yk © (2004-12-07 14:56) [19]
> Скорее всего это связано с тем что сейчас происходит.
> Думаю я угадал.
Поздравляю, Шарик, ты Балбес.
← →
wHammer © (2004-12-07 15:04) [20]vtkexport выгружает моментально
С наилучшими...
← →
Digitman © (2004-12-07 15:21) [21]
> Если обходить их в цикле то долго
а если почитать док-цию по ExcelVBA, то можно и быстрее. Значительно быстрее.
← →
Rule © (2004-12-07 15:49) [22]Digitman © (07.12.04 15:21) [21]
да но читать долго :)))
← →
VICTOR_ (2004-12-07 16:13) [23]Как вариант
Через OLE "Excel.Application";
Попробуй возпользоваться
Range, Rows, Copy
← →
Dmitriy O. © (2004-12-07 16:20) [24]Самое трудное то что надо массив скопировать в буфер а уже буфер кидать в эксель. Вот нашел способ сначала кидать данные в MEMO а потом брость их через буфер в Эксель. Надо попробовать.
Через ADO получается быстро тока всетаки для импорта в эксель уж больно избыточная вещь. Вот перекидывать данные из IB в DBF наверно пойдет.
← →
Digitman © (2004-12-07 16:52) [25]
> Dmitriy O. © (07.12.04 16:20) [24]
> надо массив скопировать в буфер а уже буфер кидать в эксель
> сначала кидать данные в MEMO а потом брость их через буфер
> в Эксель
боже, какую ты чушь прекрасную несешь
← →
DiamondShark © (2004-12-07 17:19) [26]Метод 1.
procedure TForm1.Button1Click(Sender: TObject);
var
A: variant;
W: variant;
V: variant;
i, j: integer;
begin
A := CreateOleObject("Excel.Application");
A.Visible := true;
W := A.Workbooks.Add;
V := VarArrayCreate([0,19999, 0,15], varVariant);
for i := 0 to 19999 do
for j := 0 to 15 do
V[i, j] := i + j;
W.ActiveSheet.Range["A1:P20000"].Value := V;
end;
Метод 2.
procedure TForm1.Button2Click(Sender: TObject);
var
A: variant;
W: variant;
V: variant;
i, j: integer;
S: string;
begin
A := CreateOleObject("Excel.Application");
A.Visible := true;
W := A.Workbooks.Add;
S := ...;
// здесь формируем строку
// ячейки разделяются табуляцией (#9)
// строки разделяются CRLF (#13#10)
Clipboard.Open;
Clipboard.AsText := S2;
Clipboard.Close;
W.Activesheet.Range["A1"].PasteSpecial();
end;
← →
Dmitriy O. © (2004-12-08 10:31) [27]
> DiamondShark © (07.12.04 17:19) [26
Большое спасибо ! все получилось работает быстро.
← →
VMcL © (2004-12-08 11:00) [28]>>GuAV © (07.12.04 14:21) [17]
>Когда Self бывает не Assigned ? (кроме cлучая прямого присвоения Self := nil внутри того же метода)
Когда объект, метод которого вызывается, не создан.
WBR.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.047 c