Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Кто знает какие либо методы быстрого сброса данных В Эксель ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.037 c
1-1103007006
NeyroSpace
2004-12-14 09:50
2004.12.26
Как оптимальнее всего хранить список из пар число - строка?


1-1103025651
User1
2004-12-14 15:00
2004.12.26
ООП. [Warning] при использовании класса в классе


6-1097632292
tatyana
2004-10-13 05:51
2004.12.26
webbrouser


14-1102414857
Kerk
2004-12-07 13:20
2004.12.26
Защита от копирования


14-1102189823
vecna
2004-12-04 22:50
2004.12.26
педали