C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
появление окна Excel
Коля
Отправлено: 13.03.2006, 12:09


Не зарегистрирован







Работаю с Excel как показано в уроках, с этого сайта. Вообщем проблема в след.: если тыркаем по кнопочке, где у меня идёт работа с екселем первый раз, то окно екселя показывается, со всеми данными, какие я туда экспортировал всё ок. Но, если я не закрывая Excel, нажму по кнопке ещё раз, то экспорт происходит, окно не появлется! Приходится тыркать в панель задач, чтобы открыть окно екселя... но мне так не канает, мне нужно чтобы он тоже сразу открывался...
открытие делаю так:
до обработки:

CODE

 OleObject.OlePropertySet("Visible", false);

после обработки:
CODE

 OleObject.OlePropertySet("Visible", true);

 OleObject.Clear();


могет.... там какая нить процедура типа "show", чтобы показать excel, или чёль
AVC
Отправлено: 14.03.2006, 08:54


Ветеран

Группа: Модератор
Сообщений: 1583



Обычно хватает именно этого
MSExcel.OlePropertySet("Visible", true / false);
может применяете не к тому объекту?
Коля
  Отправлено: 15.03.2006, 07:46


Не зарегистрирован







Да у меня он один... ошибаться то негде smile.gif
Вообщем, спас тока вот такой код, может это громоздко и не совсем корректно зато воркат:

CODE

BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
{
 if (lParam)
 {
   TWindowSearchInfo* pSI = static_cast <TWindowSearchInfo*>((void*)lParam);
   DWORD dwPID;
   char szBufferCaption[100];
   GetWindowThreadProcessId(hwnd, &dwPID);
   GetWindowText(hwnd, szBufferCaption, sizeof(szBufferCaption));

   if (dwPID == pSI->dwPID && !strcmp(szBufferCaption, pSI->strCaption.c_str()))
     pSI->hWnd = hwnd;
 }
 return TRUE;
}
//---------------------------------------------------------------------------
void __fastcall showExcelWindow(String strCaption)
{
 HWND hSearchWnd = NULL;
 HANDLE         hProcessSnap = NULL;
 PROCESSENTRY32 pe32      = {0};

 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hProcessSnap == INVALID_HANDLE_VALUE)
   return;

 pe32.dwSize = sizeof(PROCESSENTRY32);

 if (Process32First(hProcessSnap, &pe32))
   do
   {
     if (UpperCase(pe32.szExeFile) == "EXCEL.EXE")
     {
       TWindowSearchInfo strSI;
       strSI.dwPID = pe32.th32ProcessID;
       strSI.strCaption = strCaption;
       strSI.hWnd = 0;        
               
       EnumWindows((WNDENUMPROC )EnumWndProc, (int)&strSI);

       if (strSI.hWnd > 0)
       {
         hSearchWnd = strSI.hWnd;
         break;
       }
     }
   }
   while (Process32Next(hProcessSnap, &pe32));

 CloseHandle(hProcessSnap);

 if (hSearchWnd)
   ShowWindow(hSearchWnd, SW_SHOWMAXIMIZED);
}


после того, как данные экспортировались проюзываю

CODE

 showExcelWindow(String("Microsoft Excel — " + OleObject.OlePropertyGet("ActiveWorkbook").OlePropertyGet("Name")));

 OleObject.OlePropertySet("Visible", true);


Может всё что я выложил лишнее... но тем не менее, у меня встала такая трабла, авось ещё у каво нить будет...
AVC
Отправлено: 15.03.2006, 09:30


Ветеран

Группа: Модератор
Сообщений: 1583



Выгрузка листа из Excel. Посмотрите — может найдете что полезное. Функция достаточно автономна. Этот кусок понадобился для использования в независимом проекте (без подключения моих библиотек). Пользуюсь оригиналом уже не один год — проблем не возникало.
Основное по этому вопросу
CODE

Variant MSExcel  = Null;
Variant XLWBooks = Null;
Variant XLWBook  = Null;

try { MSExcel = Variant::GetActiveObject("Excel.Application"); }
catch (...) { MSExcel = Null; }

if (MSExcel.IsNull())
{  try { MSExcel = Variant::CreateObject("Excel.Application"); }
   catch (Exception &xcp)
    {  MSExcel = Null;
       throw Exception("Не могу запустить приложение MSExcel\n" + xcp.Message);
    }
}

try { // Workbooks
   XLWBooks = MSExcel.OlePropertyGet("Workbooks");
   try { XLWBook = XLWBooks.OleFunction("Open", xfile); }
   catch (...) { XLWBook = Null; }


 if (XLWBook.IsNull())  // Попытка создать новый сервер
  {  try
      {  MSExcel  = Variant::CreateObject ("Excel.Application");
//        MSExcel.OlePropertySet ("Visible", false);
         XLWBooks = MSExcel.OlePropertyGet ("Workbooks");
         XLWBook  = XLWBooks.OleFunction   ("Open", xfile);
      }
     catch (Exception &xcp)
      {  MSExcel = Null;
         throw Exception (AnsiString("") +
           "Не могу запустить приложение MSExcel.\n" +
           "Если оно у Вас уже запущено закройте его и повторите попытку."
     );
      }
 } // new Excel.Application

} // try Workbooks




User Attached Image Скачать файл
xlsfun.rar



Вернуться в Вопросы программирования в C++Builder