Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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" разделители в нем ";"



Страницы: 1 вся ветка

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

Наверх









Память: 0.63 MB
Время: 0.027 c
3-94264
Konuhov Sergey
2002-04-02 18:07
2002.04.29
Как заблокировать несколько записей в InterBase


4-94612
Grim Rider
2002-02-22 06:24
2002.04.29
PostMessage или приказано


1-94502
Alexander Vasjuk
2002-04-16 11:46
2002.04.29
Условная компиляция. Приглашение к разговору.


1-94379
inko
2002-04-13 15:15
2002.04.29
Почему не работает CheckBox2 ?


4-94613
Dimitriy
2002-02-22 17:38
2002.04.29
Ctrl + Alt + Del





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский