2013-02-24 2 views
0

내 Windows 서비스에서 일부 Excel vba 코드를 실행하고 싶습니다. 서비스는 fileSystemWatcher를 사용하여 추가 할 XML 파일의 디렉토리를 모니터링합니다. 파일이 추가되면 xml 파일의 내용이 개체 속성으로 deserialize됩니다. 이 단계에서 Excel 파일을 열고이 값을 특정 셀에 전달하고 해당 작업 책에서 vba 코드를 실행하려고합니다. Windows 양식 응용 프로그램에서 완벽하게 작동하지만 내 Windows 서비스 응용 프로그램에서 작동하지 않습니다. 디버거를 응용 프로그램에 연결하여 어떤 일이 있었는지 확인했지만 오류가 발생하지 않고 모든 단계가 성공적으로 완료되었습니다. UI 서비스 및 사용자 권한과 상호 작용하는 데 문제가 있으므로 Windows 서비스가 MS Office 파일을 열 수 없음을 알고 있습니다. 그러나이 vba 코드를 서비스에서 실행시킬 수있는 방법을 찾기위한 작업을 찾고 있습니다. 어떤 도움을 크게 감상 할 수Windows 서비스에서 vba 코드를 실행하는 방법

private void FSWatcherTest_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
      Trade t; 
      XmlSerializer serializer; 
      XmlReader reader; 
      XmlWriter writer; 

      string filePath = @"C:\Inbox\TradeInfo.xml"; 


      serializer = new XmlSerializer(typeof(Trade)); 
      reader = XmlReader.Create(filePath); 
      t = (Trade)serializer.Deserialize(reader); 
      reader.Close(); 



      string [email protected]"C:\Windows\System32\config\systemprofile\Desktop\TwsDde.xls"; 

      oXL = new Microsoft.Office.Interop.Excel.Application(); 

      oXL.Visible = true; 

      oXL.DisplayAlerts = false; 

      mWorkBook = oXL.Workbooks.Open(path,2, false, 5, "", "", true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true,false, false); 

      //Get all the sheets in the workbook 

      mWorkSheets = mWorkBook.Worksheets; 

      //Get the allready exists sheet 

      mWSheet1=(Microsoft.Office.Interop.Excel.Worksheet)mWorkSheets.get_Item("Basic Orders"); 

      // Microsoft.Office.Interop.Excel.Range range= mWSheet1.UsedRange; 

      mWSheet1.Cells[12, 1] = "GE"; 
      mWSheet1.Cells[12, 2] = "STK"; 
      mWSheet1.Cells[12, 7] = "SMART"; 
      mWSheet1.Cells[12, 9] = "USD"; 
      mWSheet1.Cells[12, 12] = "Buy"; 
      mWSheet1.Cells[12, 13] = "100"; 
      mWSheet1.Cells[12, 14] = "MKT"; 

      Excel.Range range; 
      Excel.Range row; 

      range = mWSheet1.get_Range("A12", "O12"); 
      range.EntireRow.Select(); 

      oXL.Run("TwsDde.xls!Sheet2.placeOrder"); 
     } 

: 나는 윈도우 7 홈 프리미엄 32 비트를 사용하고 내가 LocalSystem.This로 설정 내 서비스 내 계정을 가지고있는 것은 내가 사용하고있는 코드입니다. 또는이 코드가 포함 된 Windows 양식을 실행하는 것과 같은 일을하는 다른 방법일까요?

답변

1

안녕하세요. 저는 일종의 방법으로이 작업을 할 수있었습니다. 기본적으로이 자습서와 코드를 launch an interactive process from a service에 따라 수행하면 서비스가 SYSTEM 사용자로 실행되지만 처음 로그온 한 사용자의 세션 ID를 채택하고 사용자에게 GUI 응용 프로그램과 같은 대화식 프로세스를 실행하기위한 관리 권한을 부여 할 수 있습니다. Excel 서비스를 열고 Windows 서비스를 통해 매크로를 실행하려면 먼저 Windows Forms 응용 프로그램에서이 작업을 수행하기위한 모든 코드를 작성하고 먼저 테스트했습니다. 그런 다음 실행 파일을 변경하고 완벽하게 작동했습니다. 이 문제가 다른 사람에게 도움이되기를 바랍니다.

+0

FWIW, 이것은 질문 된 질문에 대답하지 않습니다. 당신은 "내 Windows 서비스에서 Excel 매크로를 실행하고 싶습니다."라고 물어보고 대답으로 제안하고 Windows 서비스 외부에서 Excel 매크로를 실행했습니다. –

3

당신이 할하려는 것은 not supported입니다 :

마이크로 소프트는 현재 권장되지 않으며, 지원하지 않습니다 (ASP를 포함한 모든 대화 형이 아닌 무인 클라이언트 응용 프로그램이나 구성 요소에서 Microsoft Office 응용 프로그램의 자동화, ASP.NET, DCOM 및 NT 서비스), Office가이 환경에서 실행될 때 불안정한 동작 및/또는 교착 상태가 발생할 수 있기 때문입니다.

프로세스가 대화 형 데스크톱에서 실행되는 경우 Excel을 자동화 할 수 있습니다. 비 대화식 데스크톱 (예 : 세션)에서 Excel을 자동화하려는 시도는 지원되지 않으며 실패합니다.

+0

좋아요. 사용자 상호 작용없이 자동으로 매크로를 호출하는 이미 작성한 Windows 양식을 호출하면 어떨까요?아니면 엑셀 여전히 SYSTEM 계정 및 사용자 계정에 의해 호출되고 있다는 것을 깨닫게 여전히이 문제가 존재합니까? – user1948787

+0

대화 형 데스크톱에서 프로세스를 실행해야합니다. 그리고 그것은 서비스를 배제합니다. 로그인 한 사용자의 데스크톱에서 실행되는 데스크톱 응용 프로그램이라면 괜찮습니다. –

+0

확인. 기본적으로 파일 시스템 감시자가 감시하는 디렉토리에 XML 파일의 값을 읽은 다음이 값을 저장하고 대화식 중개인을 위해 사용중인 거래 API에 전달하면 XML 파일의 값을 읽습니다. 현재 Excel API를 사용하고 있지만 다른 API도 있습니다 : C++, Active X, Java 및 POSIX. 나는 프로그래밍에 익숙하지 않고 API가 내 C# Windows 서비스와 가장 잘 작동 할 것이라고 생각합니까? – user1948787

0

Excel은 "데스크톱 상호 작용"을 사용하지 않고 사용자 서비스에서 잘 작동합니다.
처음으로, Excel COM을 만드는 표준 방법은 작동하지 않습니다. 프로그램에서 Excel.exe 프로세스를 시작해야합니다. ShellExecuteEx (권장 방법) 또는 CreateProcess (권장되지 않음)를 사용하여 프로그램을 시작해야합니다.
두 번째 단계 : GetActiveObject를 사용하여 Excel COM 응용 프로그램 개체에 연결합니다. 이제 모든 Excel COM 인터페이스에 올바르게 액세스 할 수 있습니다. 엑셀 잘못 로컬 시스템 계정에서 충돌이 작업 할 수있는 몇 가지 운영 체제에서 또한
-이 수동으로 2 개 폴더를 생성 수정 : C : \ WINDOWS \ system32를 \ 설정 \ systemprofile \ 바탕 화면
C : \ WINDOWS \ SysWOW64와 \ 설정 \ systemprofile \ desktop 데 스크톱이없는 서비스중인 다른 버그가 처음으로 Excel과 상호 작용하여 사용자 자격 증명을 요청하고 메모리에 고정되었습니다. 레지스트리 또는 인터페이스에서 비활성화 할 수 있습니다 (Excel 도움말 참조). 프로세스 시작에 대한 기타 정보는 there입니다.

관련 문제