![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
тонкости работы с excel
Arinyshka © (2008-08-05 19:28:00)подскажите, можно ли из кода программы организовать стандартную группировку данных при экспорте в excel?
Уточню: я скидываю в Excel данные из вирт. таблицы (заполнена запросом из БД, не суть важно). Первая колонка будет Подгруппа товара, данные в ней повторяются для многих из второй колонки Товар. Нужна автоматическая группировка по первой колонке... Данные отсортированы еще хранимой.
Можно ли это сделать напрямую в коде? спасибо
arinyshka (2008-08-07 11:48:00) [1]
> такая связка меня не подводила
Угу... а то только Quit не спас, как оказалось...
Игорь Шевченко (2008-08-06 23:11:00) [2]насчет того, как завершать работу с Excel
ExcelApplication.Quit;
ExcelApplication := Null;
такая связка меня не подводила
MsGuns (2008-08-06 20:09:00) [3]>Vlad Oshin © (06.08.08 17:48) [19]
>VBA
? Достаточно VBS
Vlad Oshin (2008-08-06 17:48:00) [4]VBA
+ http://www.delphikingdom.com/
arinyshka (2008-08-06 16:35:00) [5]
> а в программе просто выполнять его, предварительно проверив
> наличие его в книге или библиотеке макросов.
очень интересно... а как? как запустить макрос из кода?
arinyshka (2008-08-06 16:33:00) [6]Хммм... новая проблемка. Вот если взять такую последовательность:
Cell1 := oleExcelDocument.WorkSheets[1].Cells[BeginRow, BeginCol];
Cell2 := oleExcelDocument.WorkSheets[1].Cells[BeginRow + RowCount - 11, BeginCol];
oleExcelDocument.WorkSheets[1].Range[Cell1, Cell2].Rows.Group ;
Cell1 := oleExcelDocument.WorkSheets[1].Cells[BeginRow + RowCount - 10, BeginCol];
Cell2 := oleExcelDocument.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol];
oleExcelDocument.WorkSheets[1].Range[Cell1, Cell2].Rows.Group ;
то на мой взгяд, она должна группировать строки с первой до (последняя-11) и отдельно с (последняя-10) до конечной...
а в реале уровень группировки только 1, с первой по последнюю... Почему?
Можно ли сделать группировку как в Промежуточных итогах - но без подсчета итогов?
MsGuns (2008-08-06 16:23:00) [7]Не советую создание и редактирование макросов встромлять в делфу - намного удобнее (а главное, совершенно независимо от программы) создать и отладить макрос в самой книге экселя, ктороую сохранить как шаблон, а в программе просто выполнять его, предварительно проверив наличие его в книге или библиотеке макросов.
В шаблоне, кстати, удобно также выполнить и разметку документа (отчета): титул, заголовок, подвал и т.д. В дальнейшем при любом изменении в форме отчета достаточно поправить шаблон, что легко сделать даже непосредственно с ПК полдьзователя, не имею под рукою ни Делфи, ни исходника проекта.
Мы в последнее время вообще делаем так: из делфи просто перегоняем в шаблон данные (которые чаще всего получаются как результат работы хранимки на сервере), а потом запускаем макрос, который все оформление, включая разметку, группировки, итоги и т.д. делает самостоятельно.
По такому принципу у нас на разработку идет только время, требуемое для написания хранимки и макроса. Сама программа делфи, которая организует диалог с пользователем, запускает нужную хранимку, перегоняет результаты в нужный xls/xlt и запускает нужный макрос.
Все "нужное" легко укладывается в две таблички БД на сервере. для коррекции которой (добавления или удаления отчетов) есть еще одна программка. Сами шаблоны вместе с макросами также записаны в БД.
В результате при разработке подавляющего большинства отчетов мы вообще не используем делфу.
arinyshka (2008-08-06 14:37:00) [8]
> oleExcelDocument.quit во всех местах исключения
спасибо
Vlad Oshin (2008-08-06 14:31:00) [9]oleExcelDocument.quit во всех местах исключения
arinyshka (2008-08-06 14:21:00) [10]конструкция-то знакомая :) Я не совсем понимаю, как закрыть процесс. Вот тут:
function ExcelCreate: Boolean;
begin
Result := True;
try
oleExcelDocument := GetActiveOleObject('Excel.Application');
except
try
oleExcelDocument := CreateOleObject('Excel.Application');
except
MesDlg('Âîçìîæíî íå óñòàíîâëåí Excel!', mtWarning, [mbAbort], 0);
Result := False;
end;
end;
end;
Или тут:
function ExcelOpenWorkBook(APathTemplate, ATemplateFile: String): String;
var
szSourceFullName: String;
szFullName: String;
begin
try
szFullName := 'G:\Mercury\Templates\RepGoodsPrices.xls';
szSourceFullName := APathTemplate + ATemplateFile;
CopyFile(PAnsiChar(szSourceFullName), PAnsiChar(szFullName),False);
oleExcelDocument.WorkBooks.Open(szFullName);
Result := szFullName;
except
raise;
end;
end;
Павел Калугин (2008-08-06 13:41:00) [11]> [11] arinyshka (06.08.08 12:44)
почитайте про обработку исключений и в частности про конструкцию
try
except
end
arinyshka (2008-08-06 12:44:00) [12]И все-таки, если происходит ошибка при создании файла - почему excel остается в процессах в уверенности, что файл существует? как его разубедить?
arinyshka (2008-08-06 12:42:00) [13]Хи :) справилась...
oleExcelDocument.WorkSheets[1].Range[Cell1, Cell2].Rows.Group ;
то есть пришлось явно указывать ячейки, а не пользоваться Selection.Rows.Group
arinyshka (2008-08-06 12:39:00) [14]
> я на будущее тебе скажу (по сектрету), что один код (макрос)
> на одном языке, может сильно отличаться на другом (код,
> длина итд) )))) так что
да я догадываюсь :))) Уж очень хочется по пути наименьшего сопротивления :)))
arinyshka (2008-08-06 12:37:00) [15]Закрываю вот так:
var oleExcelDocument: OleVariant;
procedure ExcelSaveClose;
begin
oleExcelDocument.ActiveWorkbook.Close(True);
oleExcelDocument.Quit;
oleExcelDocument := UnAssigned;
end;
Процедура вызывается на Form.Close. В случае, когда файл открылся корректно - все работает. А вот когда он не создался из-за ошибки - excel провисает в процессах, почему-то считая файл созданным...
Вот я его создаю:
function ExcelCreate: Boolean;
begin
Result := True;
try
oleExcelDocument := GetActiveOleObject('Excel.Application');
except
try
oleExcelDocument := CreateOleObject('Excel.Application');
except
MesDlg('Âîçìîæíî íå óñòàíîâëåí Excel!', mtWarning, [mbAbort], 0);
Result := False;
end;
end;
end;
Вот открываю:
function ExcelOpenWorkBook(APathTemplate, ATemplateFile: String): String;
var
szSourceFullName: String;
szFullName: String;
begin
try
szFullName := 'G:\Mercury\Templates\RepGoodsPrices.xls';
szSourceFullName := APathTemplate + ATemplateFile;
CopyFile(PAnsiChar(szSourceFullName), PAnsiChar(szFullName),False);
oleExcelDocument.WorkBooks.Open(szFullName);
Result := szFullName;
except
raise;
end;
end;
brother (2008-08-06 12:35:00) [16]я на будущее тебе скажу (по сектрету), что один код (макрос) на одном языке, может сильно отличаться на другом (код, длина итд) )))) так что
> Мне нужно-топреобразовать
>
> Sub макрос1()
> Range("B9:B138").Select
> Selection.Rows.Group
> End Sub
>
> в код дельфи... и не получается :(
это звучит как-то не так)
arinyshka (2008-08-06 12:31:00) [17]Мне нужно-то преобразовать
Sub макрос1()
Range("B9:B138").Select
Selection.Rows.Group
End Sub
в код дельфи... и не получается :(
brother (2008-08-06 12:24:00) [18]> > brother © (06.08.08 12:01) [3]
> Закрывать правильно.
я про самый сложный случай )
Vlad (2008-08-06 12:22:00) [19]
> brother © (06.08.08 12:01) [3]
Закрывать правильно.
> arinyshka
Покажи код, где ты открываешь Excel и где закрываешь.
А по поводу сортировки... Palladin © (05.08.08 20:19) [1]все верно сказал. Лучшим пособием при работе с приложениями офиса являются сами эти приложения. Делаешь так, открываешь Excel,сервис->макрос->начать запись. Выполняешь все то, что бы ты хотел(а) сделать из своей программы. Стоп макрос. Сервис->макросы->выбираешь свой макрос->редактировать.
Вот там и смотри, что и как делается. По крайней мере основное поймешь, а дальше поиск в руки )))
brother (2008-08-06 12:01:00) [20]> Как убить?
послать ему terminate?