Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.006 c