EasyExcel
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
EasyExcel
После вывода данных в Excel хотел бы туда сразу попадать.
Ставлю в конце кода Visible(True).
Иногда срабатывает - попадаю в Excel, а иногда не попадаю туда. Приходится
давить внизу кнопку чтобы в него попасть.
В чем дело?
			
			
									
						Ставлю в конце кода Visible(True).
Иногда срабатывает - попадаю в Excel, а иногда не попадаю туда. Приходится
давить внизу кнопку чтобы в него попасть.
В чем дело?
- Admin
- Администратор
- Сообщения: 4022
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 59 раз
- Поблагодарили: 42 раза
- Контактная информация:
Re: EasyExcel
У меня примерно такой код везде. И окончание везде одинаковое.
Вроде всегда в Excel прыгает.
			
			
									
						Вроде всегда в Excel прыгает.
Код: Выделить всё
  ! инициализация
  EE.Init(TRUE, FALSE, GLO:ExcelStartNew)
  EE.ScreenUpdating(FALSE)
  EE.AddWorkbook
  ! выводим заголовок
  EE.Write(1,2, 'Прайслист по Хабаровским подразделениям')
  !EE.Write(2,2, 'По виду остатка: ' & CLIP(RT:RestDescription))
  EE.Write(3,2, 'На дату: ' & FORMAT(TODAY(), @D6.b))
  ! заголовок при печати
  ! делим страницу
  EE.SelectRange(RowPos,RowPos,RowPos,RowPos)
  !--------------------------------------------------------
  ! вывод заголовков
  EE.Write(RowPos,ColPos,  '№№')
  EE.Write(RowPos,ColPos+1,'Наименование товара')
  EE.Write(RowPos,ColPos+2,'Цена')
  !--------------------------------------------------------
  ! выводим очередь
  EE.WriteQueue(RowPos+1,ColPos,ReportData,2)
  !--------------------------------------------------------
  ! форматируем столбцы
  EE.SelectRange(RowPos,ColPos+2,RowPos+Rows,ColPos+2)
  EE.SetFormat(CellFormat:Numeric,2,1)      
  !--------------------------------------------------------
  ! рисуем рамку
  EE.SelectRange(RowPos,ColPos,RowPos+Rows,ColPos+(Cols-1))
  EE.DrawTable(BoxMode:Table, LineStyle:Continuous, BorderWeight:Thin)
  ! объединяем ячейки заголовка
  EE.SelectRange(1,1,1,Cols)
  EE.MergeCells(CellAlign:Center,CellAlign:Center)
  ! установка шрифта всей таблице
  EE.SelectRange(1,1,RowPos+Rows,ColPos+(Cols-1))
  EE.SetFont('Arial', 8)
  EE.AutoFit(XlFit:Horiz)
  ! форматируем заголовок
  EE.SelectRange(1,1)
  EE.SetFont('Arial',12,,FONT:Bold)
  ! форматирование заголовка таблицы
  EE.SelectRange(RowPos,ColPos,RowPos,ColPos+(Cols-1))
  EE.DrawTable(BoxMode:Table, LineStyle:Continuous, BorderWeight:Thin)
  EE.SetHorizAlign(CellAlign:Center)
  EE.SetFont(,,,FONT:Bold)
  EE.SetColour(COLOR:Silver)
  !EE.SetTextWrap(TRUE)
  EE.SetVertAlign(CellAlign:Center)
  EE.AutoFit(XlFit:Vert)
  EE.SetPageZoom(100)
  EE.SelectRange(RowPos,ColPos,RowPos,ColPos)
  EE.ScreenUpdating(TRUE)
  EE.Kill
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						- StillZero
- Ветеран
- Сообщения: 460
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: EasyExcel
Я в конце кода обычно пишу .Kill 
У нас, ни юзеры ни я не заморачиваются на этот момент, т.е. тоже переходим потом сами. Никогда не думал, что это может быть проблемой.
По делу:
причина понятна, я думаю, если твой код, что то вроде
.Visible(TRUE)
Message('фокус теперь переключается в приложение')
то после отработки .Visible фокус вернется в твое приложение, а не останется в Excel, т.е. для того, чтобы фокус был в Excel, надо, как минимум, после вывода в Excel не выполнять кода, приводящего к переключению фокуса.
На практике это, скорее всего, трудно осуществимо. Потому, если так хочется, думаю, надо принудительно переключать фокус на Excel. Т.е. API.
			
			
									
						
У нас, ни юзеры ни я не заморачиваются на этот момент, т.е. тоже переходим потом сами. Никогда не думал, что это может быть проблемой.
По делу:
причина понятна, я думаю, если твой код, что то вроде
.Visible(TRUE)
Message('фокус теперь переключается в приложение')
то после отработки .Visible фокус вернется в твое приложение, а не останется в Excel, т.е. для того, чтобы фокус был в Excel, надо, как минимум, после вывода в Excel не выполнять кода, приводящего к переключению фокуса.
На практике это, скорее всего, трудно осуществимо. Потому, если так хочется, думаю, надо принудительно переключать фокус на Excel. Т.е. API.
по аэродрому...
			
						Re: EasyExcel
Спасибо за ответы.
Заменил конец кода:
.Select(1,1)
.Visible(true)
поставил:
.Visible(true)
.Select(1,1)
Пока устойчиво попадаю в Excel.
			
			
									
						Заменил конец кода:
.Select(1,1)
.Visible(true)
поставил:
.Visible(true)
.Select(1,1)
Пока устойчиво попадаю в Excel.
- 
				kreator
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
EasyExcel
Есть не самая новая версия EasyExcel. Проблема в том, что метод OpenWorkbook открывает файл (ну и сам Excel) в свёрнутом виде. Как развернуть? Метод OpenWorkbook параметров насчёт открытия не имеет.
			
			
									
						We are hard at work… for you.   
			
						
- Игорь Столяров
- Ветеран движения
- Сообщения: 8268
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
EasyExcel
C этим прибамбасом никогда не работал, но была аналогичная проблема с отчётами Microsoft Excel через ActiveX.
Попробуйте перед запуском OpenWorkbook открывать пустое окно, что-то вроде:
Код: Выделить всё
ProgWindow    WINDOW(''),AT(,,1,1).
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- 
				kreator
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
EasyExcel
А какая-то научная основа есть под этим?Игорь Столяров писал(а): 26 Сентябрь 2024, 23:24C этим прибамбасом никогда не работал, но была аналогичная проблема с отчётами Microsoft Excel через ActiveX.
Попробуйте перед запуском OpenWorkbook открывать пустое окно, что-то вроде:
Код: Выделить всё
ProgWindow WINDOW(''),AT(,,1,1).

We are hard at work… for you.   
			
						
- Игорь Столяров
- Ветеран движения
- Сообщения: 8268
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
EasyExcel
Нет. Подобрано эмпирически, когда лет 15 назад, после обновления, Microsoft Excel перестал разворачиваться.
По научному - нужно конечно через WinApi получать заголовок процесса и посылать в него событие ...
Можно пойти иным путём - выгрузить отчёт в XLSX в режиме SILENT и закрыть подключение через OLE.
После этого через ShellExecute() тупо открыть XLSX файл в штатной программе Windows для этого расширения.
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- 
				kreator
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
EasyExcel
Вот это точно не годится, потому что открывается не уже сделанный отчёт, а шаблон, с которым идёт работа через данную библиотеку. С окном попробую. Хотя не верю в такие костыли.Игорь Столяров писал(а): 28 Сентябрь 2024, 18:50 Можно пойти иным путём - выгрузить отчёт в XLSX в режиме SILENT и закрыть подключение через OLE.
После этого через ShellExecute() тупо открыть XLSX файл в штатной программе Windows для этого расширения.
We are hard at work… for you.   
			
						
- Игорь Столяров
- Ветеран движения
- Сообщения: 8268
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
EasyExcel
Т.е. всё не просто.

Всегда есть классический вариант с получением заголовка приложения и отправки ему события.
Будет ли приложение его обрабатывать и разворачиваться в полноэкранный режим - надо пробовать.
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						EasyExcel
В подобной же ситуации помогла вот такая комбинация WinApi:Игорь Столяров писал(а): 28 Сентябрь 2024, 18:50...
По научному - нужно конечно через WinApi получать заголовок процесса и посылать в него событие ...
...
FindWindow
SetForegroundWindow



 Отдал на тестирование. С меня стакан.
 Отдал на тестирование. С меня стакан.