Сегодня будем рассматривать пример формирования презентации PowerPoint из QlikView документа по преднастроенному сценарию. Конечно, дело не обойдется без макросов VBA. Поехали!

QlikView и режим презентации

Для начала нам нужно создать дэшборд QlikView с настроенным режимом презентации.

Режим презентации – это преднастроенная последовательность слоёв, вкладок, информационных блоков дэшборда, управляемый значениями полей и переменных.

Основное назначение – возможность выстраивать порядок появления вкладок/объектов согласно заданному сценарию.

Итак, для старта формирования презентации PPT из QlikView по сценарию нам нужны:

• Исходный файл со сценарием, подготовленный по заданному шаблону

•Триггеры смены слайдов, привязанные к уровням меню

Основные поля сценария для презентационного режима:

  1. [№ сценария]
  2. [Уровень N] (Поле модели данных)
  3. [Уровень N значение] (Значение поля модели данных)
  4. [Переменная N] (Переменная для состояний отображения объектов)
  5. [Переменная N значение] (Значение переменной)

Пример:

Триггеры: принцип работы и пример создания

Триггеры выполняют очень важную функцию при создании презентации из QlikView: Они устанавливают значения полей и переменных, тем самым меняя состояние объектов (из активного в скрытое и наоборот). При этом, число триггеров в элементах управления должно совпадать с числом уровней меню, включая переменные.

Соответственно, если меню содержит 3 пункта и 2 переменных, нам нужно создать 5 триггеров. Таким образом создаётся иллюзия переключения слайдов.

Рассмотрим пример создания триггера Select in field:

Выражение для Field: =MaxString({<_СЦЕНАРИИ_НОМЕР_СЛАЙДА={‘$(vSlideShow_count)’}>}_СЦЕНАРИИ_УРОВЕНЬ_1)

Выражение для Search string: =MaxString({<_СЦЕНАРИИ_НОМЕР_СЛАЙДА={‘$(vSlideShow_count)’}>}_СЦЕНАРИИ_УРОВЕНЬ_1_ЗНАЧЕНИЕ)

Поля «Уровень» и «Уровень значение» используются триггером «Select in field», аналогичная связка полей с переменными передается в триггер «Set variable».

Результат

При нажатии кнопки «вперед» отрабатывается последовательность триггеров «Select in field»и «Set variable» согласно текущему значению переменной с номером слайда.

Примечание: Переключение номера слайда производится в конце цепочки триггеров, т. к. триггер Select in field не воспринимает результат Set Variable в пределах одной последовательности событий.

Немного VBA по шагам

Далее, для создания PPT можно использовать декларированные функции классической библиотеки VBE “user32.dll”, с помощью которых можно получить координаты мыши, имитировать передвижение курсора и нажатие клавиши PrintScreen.

Private Declare Sub keybd_event Lib “user32.dll” (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Declare Function SetCursorPos Lib “user32” (ByVal x As Long, ByVal y As Long) As Long

Public Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Declare Function GetInputState Lib “user32” () As Long

Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As POINTAPI) As Long

  1. Первым шагом мы просим пользователя позиционировать курсор и передаем в VBA координаты мыши с помощью GetCursorPos с параметром POINTAPI двумя числами Long.

Type POINTAPI

x As Long

y As Long

End Type

Private m_UserCancel As Boolean

Private Sub cmdCancel_Click()

m_UserCancel = True

End Sub

MsgBox “Наведите курсор мыши на кнопку далее. После наведения курсора нажмите Enter. Не двигайте мышь после наведения и не нажимайте мышью на кнопку ОК. Внимание! Координаты мыши будут записаны в тот момент, когда вы нажмёте Enter”

GetCursorPos a

DoEvents

MsgBox “Координты ” & a.x & ” ” & a.y & ” записаны на первый лист таблицы”

  1. Далее прописываем Private-процедуру SingleClick, использующую эти же параметры для позиционирования курсора (SetCursorPos) и две константы для осуществления события однократного нажатия левой кнопкой мыши (mouse_event MOUSEEVENTF_LEFTDOWN и mouse_event MOUSEEVENTF_LEFTUP).

Declare Function GetCursorPos Lib “user32” (lpPoint As POINTAPI) As Long

Public Const MOUSEEVENTF_LEFTDOWN = &H2

Public Const MOUSEEVENTF_LEFTUP = &H4

Private Sub SingleClick(n1 As Long, n2 As Long)

SetCursorPos n1, n2

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0

mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

End Sub

  1. Имеет смысл прописать процедуру Wait с числовым целым параметром, отражающим секунды, и таймером. С помощью Wait мы дадим Qlik прогрузиться перед скриншотом.

Sub wait(n As Long)

Start = Timer

While Timer < Start + n

DoEvents

Wend

End Sub

  1. В процедуре PasteScreen имитируется нажатие на кнопку PrintScreen событием: keybd_event &H2C, &H2.

Sub PasteScreen(pr As Object)

Dim pptLayout As CustomLayout

Set pptLayout = ActivePresentation.Slides(1).CustomLayout

keybd_event &H2C, &H2, 0, 0

pr.Slides.AddSlide pr.Slides.Count + 1, pptLayout

pr.Slides(pr.Slides.Count).Shapes.Paste

End Sub

  1. Ну и самое интересное – создание нового слайда, вставка скриншота, позиционирование изображения на слайде, выгрузка в PPT осуществляется стандартной библиотекой PowerPoint Object Library.

Sub myMacro()

Command1_Click (1)

Dim i As Integer

Set pr = ActivePresentation

For i = 1 91

SingleClick a.x, a.y

wait (5)

pr.Application.Activate

PasteScreen pr

CutOnePicturePr

Next i

End Sub

Sub CutOnePicture()

Dim pr As Presentation, i As Integer

Set pr = ActivePresentation

i = ActiveWindow.Selection.SlideRange.SlideIndex

Dim shp As Shape

For Each shp In pr.Slides(i).Shapes

If shp.Type = msoPicture Then

shp.Name = “Рисунок”

End If

Next shp

With pr.Slides(i).Shapes(“Рисунок”).

.PictureFormat.CropRight = 310 ‘обрезка справа

.PictureFormat.CropBottom = 170 ‘обрезка снизу

.PictureFormat.CropTop = 45 ‘обрезка по высоте

.Top = 0 ‘позиционирование сверху

.Left = 0 ‘позиционирование сверху

End With

End Sub

Далее возможно сохранение в любом формате (*.ppt / pdf / jpg и т.д.)

With ActivePresentation

.SaveCopyAs .Path & .Name & “.pdf”, ppSaveAsPDF

End With

Ложка дегтя: недостатки решения

Конечно, не бывает решений без недостатков, поэтому расскажу и о них:

1. “user32.dll” будет иметь доступ только к пространству VBA, соответственно, процесс записи координат не совсем удобен для пользователя из-за того, что user32.dll не может отловить нажатие мыши в тонком клиенте QlikView. Поэтому для передачи координат пользователю придётся нажать на кнопку Enter, а объект Presentation должен быть всегда переведён в состояние Activate перед обращением к нему.

2. Первоначальный подбор параметров презентации (размер слайдов, позиционирование изображения, определение количества шагов в цикле) пользователю придётся подобрать вручную, что может занять 3-10 минут.

3. PPT формируется из изображений (скриншотов), что ведёт сразу к 2-м неудобствам: невозможно скопировать текст и цифры с презентации, а сама презентация имеет значительный объём.

Поэтому лучше использовать Qlik NPrinting, но за неимением описанный подход – хороший выход =)