Форум: "Базы";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Внизпередача данных из БД в 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.012 c