首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何隐藏ExportAsFixedFormat发布进度条

如何隐藏ExportAsFixedFormat发布进度条
EN

Stack Overflow用户
提问于 2014-09-12 08:13:09
回答 1查看 3.6K关注 0票数 1

我试图使用interop.excel将Excel文件转换为PDF,同时在站点上执行ExportAsFixedFormat‘发布’进度条显示。有办法把这个藏起来吗?对于大小超过300 for的Excel文件,我发现了这个问题。

守则如下:

代码语言:javascript
运行
复制
//(tried using Application instead of ApplicationClass)
Microsoft.Office.Interop.Excel.ApplicationClass excelApplication = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
excelApplication.ScreenUpdating = false;                                   
excelApplication.DisplayAlerts = false;                                     
excelApplication.Visible = false;

if (excelWorkbook == null)
{
    excelApplication.Quit();
    excelApplication = null;
    excelWorkbook = null;
    return false;
}
var exportSuccessful = true;
try
{
    excelApplication.AlertBeforeOverwriting = false;
    excelWorkbook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, outputPath);
}
catch (System.Exception ex)
{
    exportSuccessful = false;
}

我找不到任何解决办法。我的项目是一个C# web应用程序。

EN

回答 1

Stack Overflow用户

发布于 2015-03-17 14:32:47

我花了几天时间才弄清楚,但这里最后是一个使用一些WinAPI函数来观察windows事件的方法。当钩子处于活动状态时,将每个新窗口与其类是否与PDF保存对话框类相同进行比较。如果是这样的话,窗户就会被藏起来。

谢谢你的解决方案给一些中国人:http://www.itjie.wang/officebase/516998.html

使用要求:

由于WinAPI的使用,操作系统必须是Windows。

警告:

如果"SetWinEventHook“由于一些错误而再次停止,最好重新启动系统,否则您可能会遇到一些严重的问题。

注意:

默认情况下,PDF保存对话框不定期出现。这取决于保存PDF文件所需的时间。如果要花更长的时间,保存弹出就会出现。如果需要更短的时间,保存弹出就不会出现。无论如何,您不必担心保存对话框是否会出现,代码已经为您完成了这一任务。

指示:

在Excel工作簿中,如果还没有模块,则创建一个新模块(名称无关紧要)&粘贴以下代码:

代码语言:javascript
运行
复制
' WINDOWS API FUNCTIONS:
Private Declare Function SetWinEventHook Lib "user32" (ByVal eventMin As Long, ByVal eventMax As Long, ByVal hmodWinEventProc As Long, ByVal pfnWinEventProc As Long, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
Private Declare Function UnhookWinEvent Lib "user32" (ByVal hWinEventHook As Long) As Long
Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassname As String, ByVal nMaxCount As Long) As Long
Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

' CONSTANT VARIABLES:
Private Const SW_HIDE = 0
Private Const DLG_CLSID = "CMsoProgressBarWindow"
Private Const EVENT_SYSTEM_FOREGROUND = &H3&
Private Const WINEVENT_OUTOFCONTEXT = 0

' GLOBAL VARIABLES:
Dim long_WinEventHook As Long

Public Function StartEventHook() As Long
 long_WinEventHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0&, AddressOf WinEventFunc, 0, 0, WINEVENT_OUTOFCONTEXT)
 StartEventHook = long_WinEventHook
End Function

Public Sub StopEventHook()
 Dim b_unhooked As Boolean
 If long_WinEventHook = 0 Then
  MsgBox "WinEventHook couldn't be stopped! " & _
  "Variable 'long_WinEventHook' is empty! " & _
  "Better restart Windows now!"
  Exit Sub
 End If
 b_unhooked = UnhookWinEvent(long_WinEventHook)
 If b_unhooked = True Then
 Else
  MsgBox "WinEventHook couldn't be stopped! " & _
  "Variable 'b_unhooked' is false! " & _
  "Better restart Windows now!"
 End If
End Sub

' CALLBACK FUNC OF "SetWinEventHook" (DEFINE ACTIONS TO RUN ON THE EVENTS):
' http://stackoverflow.com/questions/20486944/detecting-in-vba-when-the-window-containing-an-excel-instance-becomes-active
Public Function WinEventFunc(ByVal HookHandle As Long, ByVal LEvent As Long, ByVal hWnd As Long, ByVal idObject As Long, ByVal idChild As Long, ByVal idEventThread As Long, ByVal dwmsEventTime As Long) As Long
 'This function is a callback passed to the win32 api
 'We CANNOT throw an error or break. Bad things will happen
 On Error Resume Next
 Dim l_handle As Long
 Dim s_buffer As String
 Dim b_visible As Boolean
 Dim i_bufferLength As Integer
 s_buffer = String$(32, 0)
 i_bufferLength = apiGetClassName(hWnd, s_buffer, Len(s_buffer))
 If Left(s_buffer, i_bufferLength) = DLG_CLSID Then
  b_visible = apiShowWindow(hWnd, SW_HIDE)
  WinEventFunc = hWnd
 End If
End Function

在您的VBA代码中,当您想将excel工作簿保存为PDF时,您可以像下面这样调用上面的宏:

代码语言:javascript
运行
复制
' ADD WINDOWS EVENT HOOK BEFORE SAVING:
Application.Run XL_WB.Name & "!StartEventHook"

' SAVE EXCEL AS PDF:
' https://msdn.microsoft.com/de-de/library/microsoft.office.tools.excel.worksheetbase.exportasfixedformat.aspx
XL_WB.ExportAsFixedFormat _
 Type:=xlTypePDF, _
 Filename:="C:\PDF.pdf", _
 Quality:=xlQualityStandard, _
 IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, _
 OpenAfterPublish:=False

' REMOVE WINDOWS EVENT HOOK AFTER SAVING:
Application.Run XL_WB.Name & "!StopEventHook"

在上面的VBA代码示例中,"XL_WB“是一个变量。你必须调整它以适应你的需要。例如,使用"ActiveSheet“代替。

通过以下其他网站,用户也请求帮助解决这个特定的问题:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25803707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档