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

Вниз

передача данных из БД в Microsoft Excel   Найти похожие ветки 

 
franchuk   (2006-01-11 18:20) [0]

Как из существующего(отображеного) набора данных передать данные в уже существующий(созданый шаблон) файл  Microsoft Excel.
погжайлуста по возможности отвветьте - очень срочно надо, но ответа нигде не могу найти!!!


 
mr.il ©   (2006-01-11 18:41) [1]

var
 XL_2 : Variant;
 _Rov : Integer;
begin with DM_Zakaz, AForm do begin

 XL_2 := CreateOleObject("Excel.Application");
 XL_2.Workbooks.Add("твой путь\ZakazBlank.XLT");

 XL_2.Range["A1"].Value := "Бланк-заказ № "+IntToStr(IBQ_Zakaz["ZAKAZ_ID"]);
 XL_2.Range["A4"].Value := "Дата составления: "+DateToStr(IBQ_Zakaz["Date_Doc"]);
 XL_2.Range["A5"].Value := "Поставщик: "+_NotNullStr(IBQ_ZakazZakazName.Value);
 IBQ_ZakazData.First; _Rov := 8;
 while not IBQ_ZakazData.Eof do begin
   if _NotNullCurr(IBQ_ZakazData["Quant_Z"]) > 0 then begin
     XL_2.Range["A"+IntToStr(_Rov)].Value := _Rov-7;
     XL_2.Range["B"+IntToStr(_Rov)].Value := _NotNullStr(IBQ_ZakazData["PROD_NAME"]);
     XL_2.Range["C"+IntToStr(_Rov)].Value := CurrToStr(IBQ_ZakazData["Quant_Z"]);
...
...
 XL_2.Run("myAutoFill");//запуск макроса если надо
 XL_2.Visible:=True;
{
визуализацию можешь сделать сразу после этого:
 XL_2.Workbooks.Add("твой путь\ZakazBlank.XLT");
тогда увидишь результаты вывода но будет тормознее
}


 
DimonS ©   (2006-01-12 02:45) [2]

Еще можно использовать ExcelApplication с закладки Servers дельфей. Я делал много выводов в Ексель, обычно приходится пользоваться и [1] и этим. Хотя бы для того, чтобы вставить формулы или прочертить границы.


 
mr.il ©   (2006-01-12 07:23) [3]

Я обычно "оформление" вешаю в макрос и запускаю его перед отображением.


 
DimonS ©   (2006-01-12 08:58) [4]

ТО mr.il ©
А если таблица неизвестного размера в высоту и ширину, то как это в макросе отразить?

Хотя идея неплохая, можно выходной файл в любом месте задавать по выбору юзера.


 
mr.il ©   (2006-01-12 10:25) [5]

Когда я незнаю точно как реализовать "оформление" эксэль документа, вывожу данные в пустой шаблон, а потом запускаю запись макроса и начинаю документ "оформлять" в ручную, затем смотрю макрос и переделываю его под себя.
Хочу уточнить. Под оформлением я понимаю разного рода дорасчеты (промежуточные итоги к примеру) или динамическую окантовку. Если-же документ статический (т.е. свойства ячеек не зависят от значений), то все настройки (ширин, фонтов, выравниваний, окантовок и т.д.) задаю в шаблоне изначально.
И еще. Довольно удобно бывает вынести отчет из приложения прямо в эксэль. Т.е. сам эксэль запрашивает НД и крутит его.


 
DimonS ©   (2006-01-12 11:20) [6]

Просто у меня сейчас выводятся табличные данные в ексель, в которых в конечном отчете может быть от 2 до 20 страниц. Тут уже макросом не особо справишься :)

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


 
mr.il ©   (2006-01-12 11:43) [7]


> ...Нужно следить,
>  чтобы он небыл запущен предварительно, чтобы не закрыл
> юзверь его при просмотре и т. д.

В моем варианте ничего подобного. 20 страниц это мелочь. Зато его легко и непринужденно можно отправить по электронке. И ваще потом из эксэля делай че хош. Да и дизайнить эксэлевский шаблон приятнее.


 
DimonS ©   (2006-01-12 12:04) [8]

Я про удобство ничего и не говорю. Я и в Ворд многое вывожу. Я про то, что для программера много камушков имеется. Вот и все. Да и довольно сильно тормозит Ексель. Особенно при выводе больших отчетеов. Много ресурсов кушает, тут уж никуда не денешься.


 
mr.il ©   (2006-01-12 12:11) [9]


> Да и довольно сильно тормозит Ексель.

Эта да.


 
DimonS ©   (2006-01-12 12:19) [10]

Кстати, я в данный момент пробовал перевести все отчеты в FastReport. И вот именно такие большие и не получается. Зато небольшие по сравнению с екселем "летают", доли секунды занимают времени. Так что если не решил еще в чем выводить отчеты, то посмотри на другие "отчетники", типа QuikReport, FastReport, и т. д. QReport, который встроенный, крайне не рекомендую.


 
sniknik ©   (2006-01-12 12:27) [11]

>> Да и довольно сильно тормозит Ексель.
> Эта да.

надо пакетные обработки делать, а не позаписьно с каждой ячейкой. будет быстрей
к примеру у меня отчет на 1,5тыс строк. 8 полей в таблице (даных в сумме на ширину листа), на 2000гц селероне. в эксель выводится за 5-8сек. по моему нормально.


 
mr.il ©   (2006-01-12 12:36) [12]


> надо пакетные обработки делать, а не позаписьно с каждой
> ячейкой. будет быстрей

2 sniknik.  А по подробнее???? PLZ.


 
DimonS ©   (2006-01-12 12:40) [13]

Хм...
Интересно.
Даже не встречал про пакетные обработки.
Поподробнее можно?


 
sniknik ©   (2006-01-12 13:51) [14]

ну это "образно", может термина такого и нет по отношению к excel. смысл в чем, надо тебе к примеру данные вставить, всталяеш одной командой уже подготовленные из рекордсета или вариантного массива, а не в цикле поячеечно множество раз "дергая" ecxel. (эти вызовы самое длительное и есть. т.е. вставить 500 позиций (примерно) из вариантного массива и одну неважно как по времени будет одно и тоже (на фоне вызова внос что 1 что 500 не различим))
точно также с оформлением, не применять к каждой ячейки, а определять ... (как это по русски ;) range и применять стиль к группам ячеек.
в обшем минимизировать как только можно сами вызовы, обращения к excel-ю.

вот к примеру в mr.il ©   (11.01.06 18:41) [1] есть цикл, перебор таблици, а в нем обращения к XL_2 (Excel.Application), если его убрать сначала подготовив вариантный массив а после сделать загрузку в excel одной командой copy, (или CopyFromRecordset как обычно сам делаю) и время сократится намного.


 
mr.il ©   (2006-01-12 13:57) [15]

Ну
1. XL_2 := CreateOleObject("Excel.Application"); выполняется не в цикле
2. Запости пожалуйста код, а то недоврубаюсь. :(


 
DimonS ©   (2006-01-12 14:15) [16]

то sniknik ©

Насчет Екселя.
Я так и делаю, но ТОЛЬКО! для оформления (типа границ ячеек) и для формул (их, конечно, проще вставить на всю таблицу или нужный диапазон). А вот насчет перенесения данных из массива... Покажите, плз, пример, просто не понял, как это можно к екселю применить НЕ в цикле.


 
sniknik ©   (2006-01-12 16:02) [17]

> 1. XL_2 := CreateOleObject("Excel.Application"); выполняется не в цикле
имею ввиду любое последующее обращение к XL_2, это же запрос к екселю как серверу автоматизации (вот именно их и надо минимизировать. эти обращения )

> 2. Запости пожалуйста код, а то недоврубаюсь. :(
код постить опасно... сам смотри
http://delphimaster.net/view/2-1136805696/

там как раз пример, вместо цикла один вызов функции.


 
DimonS ©   (2006-01-12 16:23) [18]

Не нашел.

Или я тупой, или....

Объясни, плз, как можно во во время расчета в сводной таблице, в смысле после расчета каждой ячейки, выдать их сразу одной функцией в Ексель? Причем, КАЖДАЯ ячейка расчитывается по-своему.


 
sniknik ©   (2006-01-12 17:19) [19]

> ADODataSet.CommandText:= "SELECT f_key FROM TC_ROUTE_STRING_IZV WHERE izv=:obozn ORDER BY f_key";
> ADODataSet.Parameters.ParamByName("obozn").Value:="31.0001-05";
> ADODataSet.Open;

> ExcelApplication1.Workbooks.Add(EmptyParam,0);
> ExcelApplication1.Cells[1,1].CopyFromRecordset(ADODataSet.Recordset);

весь рекордсет зараз... но только ADO-шный понимает (как раз по мне, только с ADO и работаю практически). а у вас там вроде с закладки InterBase используется... тут или перекладывать в ADO-шный, либо в вариантный массив (и использовать тогда функцию Copy), заодно и условие обработаеш (подготовить надо только то что требуется для "заливки"), все одно быстрее будет, и намного, т.к. всю подготовку ты у себя в программе сделаеш. (пример с массивом навскидку написать не могу, т.к. не пользуюсь, а тест делать времени нет(ломает). поищи. или сам попробуй, там просто все)


 
sniknik ©   (2006-01-12 17:35) [20]

с массивом
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=502


 
mr.il ©   (2006-01-12 18:13) [21]

Ну спасибо.



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

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.054 c
2-1139988070
ZeFiR
2006-02-15 10:21
2006.03.05
Эмулирование классов...


4-1134571727
Хинт
2005-12-14 17:48
2006.03.05
Offset библиотеки в чужом процессе


15-1139810310
PARUS
2006-02-13 08:58
2006.03.05
Com


15-1139389168
seg
2006-02-08 11:59
2006.03.05
Когда же перестанут издеваться над автомобилистами?


3-1136463543
Нютик
2006-01-05 15:19
2006.03.05
Дроби в Аксесе!!!!