检查是否打印了Excel文件



我是一名 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:SAPZREIGNWOOD_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:SAPZREIGNWOOD_PO.xlsx'.
EXCEPTIONS
failed    = 1
OTHERS    = 2.

此内置文档属性应该有帮助:

ThisWorkbook.BuiltinDocumentProperties.Item(10)

此属性包含上次打印文档的日期/时间(如果有)。

您应该如何使用它取决于您对此信息的要求范围、您打算如何处理它以及其他考虑因素,例如"您将其与什么进行比较?您关心用户何时打印文档。而不是什么? 它也会自动打印吗?

如果想知道文档自打开以来是否已打印,可以使用Workbook_Open事件来存储此时的上次打印日期:

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

。然后将lastPrintedThisWorkbook.BuiltinDocumentProperties.Item(10)进行比较,以确定它是否从那时起就被印刷了。

或者,您可以使用Workbook_BeforePrint为变量赋值,这甚至允许您根据您的标准阻止打印,如果这是您的最终目标,或者您可以设置自定义文档属性,如果这会有所帮助。


更多信息:

  • MSDN :Workbook.BuiltinDocumentProperties属性(Excel)

  • MSDN :Workbook.CustomDocumentProperties属性(Excel)


其他内置文档属性

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模块标准模块中的位置,请参阅本指南。

相关内容

  • 没有找到相关文章

最新更新