Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Загрузка результата селекта в Excel 


Pit   (2002-04-09 11:10) [0]

Господа!
Вопрос следующий ... есть результат селекта строк ... так эдак тыши 3 ... 4 ...
Нужно загрузить их в Excel файл ..
Если делать через OLE с заполнением конкретной ячейки, то получается очень долго.
Если в Range запихивать массив, то получается побыстрее но не на много.
Я сумел в Range передать только массив для одной строки.
Если делаю массив больше ... ну скажем все строки ... то получается что весь Range заполняется результатом первой строки :((
Для примера делаю массив V : Variant
V := VarArrayCreate([1,6], varVariant);
V[1]:=1 ......V[6]:=6;
Хочу что бы получилось в еxcel:
А1=1,В1=2,D1=3
А2=4,В2=5,D2=6
грю ....
.....Range["A1","D2"].Value := V;
а получается :
А1=1,В1=2,D1=3
А2=1,В2=2,D2=3
Есть ли способ сделать это быстрее?
Или может я не правильно ченить делаю ...
Пробовал двумерный массив ... но вроде как бы и не получилось :((
Заранее благодарен за ответ



Den_   (2002-04-09 17:04) [1]

Попробуй использовать XLReport



Oleon   (2002-04-09 17:19) [2]

var
XLApp : Variant;
Sheet : Variant;
RangeHeader : Variant;
RangeStr : String;
Begin
XLApp:= CreateOleObject("Excel.Application");
XLApp.Visible := True;
XLApp.Workbooks.Add(xlWBatWorkSheet);
XLApp.Workbooks[1].WorkSheets[1].Name := Title;

Sheet := XLApp.Workbooks[1].WorkSheets[Title];

for i := 1 to "кол-во столбцов d селекте" do
for j := 1 to "записей так эдак тыши 3 ... 4 ..." do
Sheet[i,j] := ....AsString;


End;

Good Luck!



Oleon   (2002-04-09 17:26) [3]

var
XLApp : Variant;
Sheet : Variant;
RangeHeader : Variant;
RangeStr :string;
Begin
XLApp:= CreateOleObject("Excel.Application");
XLApp.Visible := True;
XLApp.Workbooks.Add(xlWBatWorkSheet);
XLApp.Workbooks[1].WorkSheets[1].Name := Title;

Sheet := XLApp.Workbooks[1].WorkSheets[Title];

RangeStr := "A1:" + Char(Integer("A") + "кол-во колонок-1)+ "1"
// Ссылка на заголовок вообще
RangeHeader := XLApp.Workbooks1].WorkSheetsTitle].RangeRangeStr];
// жирный фонт
RangeHeader.Columns.Font.Bold := True;
// пишешь загловки
for i := 1 to GridColCount do begin
Sheet.Cells[1, i] := .....AsString


for i := 1 to "кол-во столбцов d селекте" do
for j := 1 to "записей так эдак тыши 3 ... 4 ..." do
Sheet[i,j] := ....AsString;


End;

Good Luck!



Alex_R   (2002-04-09 17:30) [4]

2Den_ (09.04.02 17:04)
>Попробуй использовать XLReport
А ты часом не знаешь где взеть не триал version?



vlv   (2002-04-09 18:17) [5]

А не проще ли подключить ODBC-DataSource к книге Excel и использовать BatchMove ?



Den_   (2002-04-09 18:19) [6]

> Alex_R ©
Часом нет к сожалению...я использую триал, единственный геморой - это печатается красная противная табличка в верхнем левом углу. Но для меня это вообщем не критично.



Fantasist   (2002-04-09 21:17) [7]

Есть хорошие компоненты DAO с ними это делается быстро и удобно. У меня есть, кажись.



Pit   (2002-04-15 08:58) [8]

:)) Спасибо конечно ребята за ответы.
Но я имел в виду другое ... то что вы посоветовали я знаю ...
Но это ДОЛГО!
Ну да ладно ...
Я решил эту проблемму ща поделюсь может кому пригодится!
Дело в том что вы предлагаете это заполнение каждой ячейки ...
Ну посудите сами на сколько это долго если взять во внимание .. ну к примеру экономичемкие отчеты ...
Можно заполнять строку ... но то же долго хотя быстрее чем ячейку :)
Но оказывается можно заполнить и весь лист целиком :))
ща напишу как!
procedure AddToExcel(Q: TQuery);
var StartRow, pRow: Integer;
mArray: Variant; //Переменная для Excel
begin
Q.First;
pRow := 0;
mArray := VarArrayCreate([0,Q.RecordCount, 1,13],varVariant); // Определение массива где 0,Q.RecordCount - количество строк 1,13 - количество столбцов
while not Q.Eof do
begin
Application.ProcessMessages;
mArray[pRow, 1] := "";
mArray[pRow, 2] := Q.FieldByname("Pole1").AsString;
mArray[pRow, 3] := Q.FieldByname("Pole2").AsString;
mArray[pRow, 4] := Q.FieldByname("Pole3").AsString;
mArray[pRow, 5] := Q.FieldByname("Pole4").AsDateTime;
mArray[pRow, 6] := Q.FieldByname("Pole5").AsFloat;
mArray[pRow, 7] := Q.FieldByname("Pole6").AsString;
mArray[pRow, 8] := Q.FieldByname("Pole7").AsDateTime;
mArray[pRow, 9] := Q.FieldByname("Pole8").AsDateTime;
mArray[pRow, 10] := Q.FieldByname("Pole9").AsFloat;
mArray[pRow, 11] := Q.FieldByname("Pole10").AsFloat;
mArray[pRow, 12] := Q.FieldByname("Pole11").AsFloat;
mArray[pRow, 13] := Q.FieldByname("Pole12").AsString;
Q.Next;
Inc(pRow);
end;
aSchet.Range["A1", "M" + IntToStr(Q.RecordCount)].EntireRow.Insert(xldown); // вставляем пустые строки для примера если у вас загрузка идет в шаблон ... как у меня
aSchet.Range["A1", "M" + IntToStr(Q.RecordCount)].Value := mArray; // ВО ... Вставляем полный массив :))
end;
Ну а дальше балуйтесь ... с фонтами ... форматированием ... и т.д.
Скорость ... ну с 30 минут ... на 2 минуты ... я думаю существенная :))
Надеюсь комунить пригодится ...



Fantasist   (2002-04-15 09:26) [9]

Нифига. Я имел ввиду совсем другое. Через DAO можно открыть как таблицу, и работать с ней как с таблицей. Думаю скорость возрастет существенно.



koks   (2002-04-15 09:53) [10]

Долгое время решал вопрос с экспортом данных в Excel.
Перепробовал все возможные вещи, в том числе и использовал компоненты, которые напрямую генерят *.xls - файлы. (Кстати, некоторые из них весьма удобны - однако у меня возникала пробелема передачи русскоязычных сток поэтому я от них отказался.) В результате я остановилися на способе подробно описанном в статье "По волнам интеграции" на сайте "Королевство Дельфи" (ч.2). Для 7 - 8 тыс. записей экспорт работает максимум 20 сек.
P.S. Насколько я понимаю, этот способ используется и в XLReport.



esVer   (2002-04-15 10:05) [11]

Сохранить выборку во временный текстовый файл, поля разделить ";". Натравить на этот файл Excel, а потом уже можно
раскрашивать как угодно. Работает не в разы, а в десятки раз быстрее. Проверено на выборках в 30-40 тыс. записей.



Andrey Shakula   (2002-04-15 12:10) [12]

Есть компонент для прямой генерации .xls файлов в формате 4 или 5 точно не помню. С исходниками, вроде работает с русским тоже,
пробовал на WIN2000 + Office2000 - понимают. Называется XLSFile. Работает безусловно быстрей Excela.



KSergey   (2002-04-15 12:13) [13]

В солдидарносить koks:
Друзья! прочитайте статьи из раздела "Hello, World!" с сайта "Королевство дельфи"! Желательно все! Они очень хороши, поверьте!
И по поводу интеграции с Excel там народ не один год бился. И спасибо, что с нами делятся! (эти же статьи (в смысле по поводу интеграции с MS Excel) есть и на сайте XL Reports)



Дмитрий Баранов   (2002-04-15 12:14) [14]

>esVer (дополнение)

Можно писать в текстовой файл с расширением .xls, поля делить табуляцией (#9), строки - #13#10. Ексель откроет такой файл без вопросов.



Smithson   (2002-04-15 12:15) [15]

Еще проще. Мечешь результаты селекта в строку (разделяя поля ; и строки #13#10),
потом копируешь эту строку в клипбоард и даешь Excel`ю команду "пасте". Это точно быстрее, чем через файл.



vuk   (2002-04-15 12:17) [16]

Я тоже с этим боролся. От использования самого Excel пришлось отказаться - слишком уж падуч оказался, а приложение должно было работать без контроля пользователя. В результате написал экспорт в формат Excel... Правда вот, формат использую от Excel4 и выделение цветом не поддерживается (очень-то оно надо было), но тем не менее все работает.



aus   (2002-04-15 23:20) [17]

Многие ругают VBA, но я ничего быстрее не придумал, чем
Range("A1").CopyFromRecordset(myRS)где myRS - заранее приготовленный набор данных,
и вообще удобно использовать макросы, которые потом просто запускать из приложения. Да и на машине пользователя потом подправить шаблон можно, при необходимости.



sergey32   (2002-04-16 12:44) [18]

У Excel есть свой текстовый формат с расширением "CSV" разделители в нем ";"




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.029 c
14-94537          VictorT               2002-03-21 15:36  2002.04.29  
програма примерки причёсок


14-94570          Почемучка             2002-03-20 12:33  2002.04.29  
QReport в Delphi 5.0


1-94394           SPeller               2002-04-16 11:59  2002.04.29  
Асинхронные процедуры


4-94618           Serg001               2002-02-23 16:02  2002.04.29  
Время запуска Windows.


1-94412           Beast                 2002-04-18 03:06  2002.04.29  
Form