Проверьте, напечатан ли файл Excel или нет

avatar
CruelMoon
8 апреля 2018 в 09:36
960
1
0

Я программист abap и печатаю документы, используя OLE для вывода файлов Excel. Программа вызывает метод рабочей книги «Предварительный просмотр», чтобы отобразить интерфейс предварительного просмотра для пользователей.

Я хочу проверить, нажимают ли пользователи кнопку "печать" или нет. Если документ печатается (нажата кнопка печати), программа блокирует связанные данные. Если пользователи просматривают документ только в режиме предварительного просмотра, программа не будет блокировать связанные данные.

Я посмотрел в MSDN, кажется, что объект рабочей книги имеет только свойство "сохранено", но не свойство "напечатано".

Можно ли реализовать это с помощью ABAP или VBA?


Пример программы показан ниже. С помощью OLE он открывает файл EXCEL, созданный другими кодами, вызывает метод PrintPreview, затем закрывает и завершает работу.

Я хочу определить, печатается ли он между «Предварительный просмотр» и «Закрыть». После закрытия объекта Excel программа будет что-то делать в зависимости от того, напечатан ли он.


CREATE OBJECT excelobj 'Excel.Application'.

* Set excel visible
SET PROPERTY OF excelobj 'Visible' = 1.

* Create workbook object
CALL METHOD OF excelobj 'Workbooks' = workbooks.

CALL METHOD OF workbooks 'Open' = wbookobj
  EXPORTING
    #1 = 'C:\SAP\ZREIGNWOOD_PO.xlsx'.

CALL METHOD OF  excelobj  'Worksheets' = wsheetobj
  EXPORTING
    #1           = 'Sheet1'.

CALL METHOD OF wsheetobj 'Activate'.

CALL METHOD OF wsheetobj 'Printpreview'.

WAIT UP TO '0.1' SECONDS.
*determine whether it is printed

CALL METHOD OF wbookobj 'Close'.

CALL METHOD OF excelobj 'Quit'.

CALL FUNCTION 'GUI_DELETE_FILE'
  EXPORTING
    file_name = 'C:\SAP\ZREIGNWOOD_PO.xlsx'.
  EXCEPTIONS
    failed    = 1
    OTHERS    = 2.
Источник
QHarr
8 апреля 2018 в 09:51
0

Событие перед печатью? Возможно, msdn.microsoft.com/en-us/vba/excel-vba/articles/… webcache.googleusercontent.com/search?q=cache:http://…

ashleedawg
8 апреля 2018 в 09:57
0

В каком объеме вам необходимо иметь эту информацию? т.е. нужно ли его сохранять после закрытия книги?

CruelMoon
9 апреля 2018 в 02:35
0

Событие BeforePrint будет вызвано методом PrintPreview, а не только методом PrintOut. И программа вызывает PrintPreview, чтобы запретить пользователям редактировать файл Excel.

Ответы (1)

avatar
ashleedawg
8 апреля 2018 в 10:10
0

Это встроенное свойство документа должно помочь:

ThisWorkbook.BuiltinDocumentProperties.Item(10)

Это свойство содержит дату/время последней печати документа, если вообще когда-либо было.

Как вы должны это использовать, зависит от объема ваших требований к этой информации, того, что вы собираетесь с ней делать, и других соображений, таких как "с чем вы ее сравниваете?" .... Вас беспокоит, когда пользователь печатает документ... а не что? Он также автоматически печатает?

Если вы хотите узнать, распечатывался ли документ с момента его открытия, вы можете использовать событие Workbook_Open для сохранения даты последней печати в этот момент:

Public lastPrinted As Date

Private Sub Workbook_Open()
    lastPrinted = ThisWorkbook.BuiltinDocumentProperties.Item(10)
End Sub

... и позже сравните lastPrinted с ThisWorkbook.BuiltinDocumentProperties.Item(10), чтобы определить, был ли он напечатан с тех пор.

В качестве альтернативы вы можете присвоить значение переменной с помощью Workbook_BeforePrint, что даже позволит вам предотвратить печать в зависимости от ваших критериев, если это ваша конечная цель, или вы можете установите настраиваемое свойство документа, если это поможет.


Дополнительная информация:


Другие встроенные свойства документа

 1  :  Title
 2  :  Subject
 3  :  Author
 4  :  Keywords
 5  :  Comments
 6  :  Template
 7  :  Last author
 8  :  Revision number
 9  :  Application name
10  :  Last print date
11  :  Creation date
12  :  Last save time
13  :  Total editing time
14  :  Number of pages
15  :  Number of words
16  :  Number of characters
17  :  Security
18  :  Category
19  :  Format
20  :  Manager
21  :  Company
22  :  Number of bytes
23  :  Number of lines
24  :  Number of paragraphs
25  :  Number of slides
26  :  Number of notes
27  :  Number of hidden Slides
28  :  Number of multimedia clips
29  :  Hyperlink base
30  :  Number of characters (with spaces)
31  :  Content type
32  :  Content status
33  :  Language
34  :  Document version

Немного не по теме, но пока я на этом, я мог бы также включить код, который вернет список всех встроенных и пользовательских свойств документа:

Sub listDocumentProperties()
'lists all built-in and custom document properties for the active Office document
    On Error Resume Next
    Dim p As DocumentProperty, x As Long

    With ActiveWorkbook ' ...or ActiveDocument or ActivePresentation etc.

        'list built-in properties
        Debug.Print "Built-in Document Properties for " & .Name
        For Each p In .BuiltinDocumentProperties
            x = x + 1
            Debug.Print Format(x, "\#00\: ") & p.Name & String(35 - Len(p.Name), " "), ;
            Debug.Print p.Value
            If Err Then
                Debug.Print "<N/A>"
                Err.Clear
            End If
        Next

        'list custom properties
        Debug.Print vbLf & "Custom Document Properties for " & .Name
        x = 0
        For Each p In .CustomDocumentProperties
            x = x + 1
            Debug.Print Format(x, "\#00\: ") & p.Name & String(35 - Len(p.Name), " "), ;
            Debug.Print p.Value
            If Err Then
                Debug.Print "<N/A>"
                Err.Clear
            End If
        Next
        If x = 0 Then Debug.Print "(No Custom Properties Found)"
    End With
End Sub

Это будет работать в любом приложении Office; вам просто нужно изменить строку With на соответствующий тип документа.


Альтернативное решение:

Другое возможное решение — использовать событие Workbook_BeforePrint для заполнения общедоступной переменной.

Поместите это в верхнюю часть стандартного модуля:

Option Explicit
Public lastPrinted As Date

... и поместите это в модуль ThisWorkbook:

Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    lastPrinted = Now()
End Sub

... и тогда вы сможете определить, действительно ли документ был отправлен на принтер (в отличие от предварительного просмотра), проверив значение lastPrinted. Если он не был распечатан (поскольку документ был открыт), он должен содержать ноль, иначе он будет содержать дату/время отправки документа на принтер. Обратите внимание, что невозможно определить, успешно ли принтер напечатал его.

Обратите внимание, что вы также можете запретить печать, используя вместо этого в модуле ThisWorkbook:

Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Cancel = True
End Sub

Если вы не уверены, куда разместить код в ThisWorkbook Модуль <56> Стандартный модуль , см. Это руководство.

QHarr
8 апреля 2018 в 10:16
0

Мне было интересно, можно ли вернуть общедоступное логическое значение до печати, тем самым указав, сохранено ли

QHarr
8 апреля 2018 в 10:23
0

ооо.... звучит интересно.... как обновить его значение?

QHarr
8 апреля 2018 в 10:35
0

Наверное. Мне интересно, используете ли вы сценарий для получения значения, а переменная среды указывает на сценарий? Не хочу захватывать этот пост, извините.

CruelMoon
9 апреля 2018 в 02:29
0

Спасибо за ваш ответ. Прочитав ваше сообщение, я попробовал свойство «Дата последней печати» и упомянул, что когда-то вызванный метод «PrintPreview», свойство было обновлено. Но на самом деле документ не печатался, а только просматривался в режиме предварительного просмотра. Так вот, похоже, я не могу определить, действительно ли документ был напечатан к этой «дате последней печати».

ashleedawg
9 апреля 2018 в 03:25
0

@CruelMoon Если вы объясните почему вам нужно знать, когда это было напечатано, это может помочь. Вы пытаетесь предотвратить его печать? Что именно имеется в виду под «блокировкой связанных данных»? Что он будет делать в зависимости от того, напечатано ли оно?

CruelMoon
9 апреля 2018 в 03:56
0

Хорошо, позвольте мне попробовать.... В нашем бизнесе документ представляет собой «Заказ на поставку», который создается в системе ERP, все данные заказа сохраняются в системе ERP. Пользователи могут распечатать заказ на бумаге и выполнять свою работу на этой бумаге. Чтобы избежать несоответствия данных, после печати система ERP заблокирует заказ. Поэтому мне нужно знать, напечатан ли документ или нет.