Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.042 c
6-1095686893
maxistent
2004-09-20 17:28
2004.12.26
TServerSocket в консольном приложении (типа, без форм)


3-1101538229
Black
2004-11-27 09:50
2004.12.26
Защита SocketConnection


1-1102714908
Larisa
2004-12-11 00:41
2004.12.26
По умолчанию, в Делфи используется MS San Serif,


8-1096484344
ser_ega
2004-09-29 22:59
2004.12.26
Картинка!


3-1101379348
Frozzen
2004-11-25 13:42
2004.12.26
Позиционирование в ДБГриде





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский