Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

тонкости работы с excel


Страницы:   1 2

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
+ google
+ 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?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо