2014-09-12 1 views
1

'게시'진행률 표시 줄을 실행하는 동안 Excel 파일을 interop.excel을 사용하여 PDF로 변환하려고합니다. 이것을 숨길 방법이 있습니까? 300KB 이상의 크기를 가진 Excel 파일에 대해이 문제를 발견했습니다.ExportAsFixedFormat의 게시 진행률 막대를 숨기는 방법

코드는 아래와 같습니다 :

//(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# 웹 응용 프로그램입니다.

답변

1

알아 내기 위해 며칠이 걸렸지 만 마침내 여기에 Windows 이벤트를 관찰하기 위해 WinAPI 함수를 사용하는 작업 영역이 있습니다. 후크가 활성 상태 인 동안 모든 새 창은 해당 클래스가 PDF 저장 대화 상자 클래스와 동일한 것인지 여부와 비교됩니다. 이 경우 창이 닫힙니다. 솔루션 아이디어에 대한

덕분에 일부 중국 남자로 이동 : 이 http://www.itjie.wang/officebase/516998.html

사용 요구 사항 :
OS (= 운영 체제) 때문에 WinAPI를 사용의 윈도우를해야합니다.

경고 :
일부 오류로 인해 "SetWinEventHook"가 다시 중지되지 않으면 시스템을 다시 시작하는 것이 좋습니다. 그렇지 않으면 Windows에서 심각한 문제가 발생할 수 있습니다.

참고 :
기본적으로 PDF 저장 대화 상자는 정기적으로 나타나지 않습니다. PDF 파일을 저장하는 데 필요한 시간에 따라 다릅니다. 시간이 오래 걸리면 저장 팝업이 나타납니다. 저장 팝업이 짧아지면 저장 팝업이 나타나지 않습니다. 어쨌든 저장 대화 상자가 나타나는지 여부에 대해 걱정할 필요가 없습니다. 코드가 이미이 작업을 수행합니다.

명령 : 당신의 VBA 코드에서

' 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 

: & 붙여 넣기 다음 코드를 이미 모듈이없는 경우 Excel 통합 문서에서
는, 새로 생성 (이름은 중요하지 않음) 당신이 PDF로 엑셀 통합 문서를 저장할 때,이 같은 매크로 위에 부를 것이다 :

' 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"를 대신 사용하십시오.

또한 특정 문제에 도움을 요청 다음 다른 웹 사이트 사용자의

: