如何从Windows服务运行Excel VBA代码

我想从我的Windows服务运行一些Excel VBA代码。 该服务正在使用fileSystemWatcher来监视要添加的xml文件的目录。 一旦添加了一个文件,xml文件的内容被反序列化为对象属性。 在这个阶段,我想打开一个excel文件,并将这些值传递给某些单元格,并从该工作簿中运行vba代码。 我从Windows窗体应用程序完美的工作,但我不能从我的Windows服务应用程序工作。 我附加了一个debugging器到应用程序来试着看看发生了什么,但没有错误抛出,所有的步骤都成功完成。 我知道Windows服务不支持打开MS Office文件,因为与用户界面和用户权限进行交互时存在问题。 但我正在寻找任何方式来获得这个vba代码从服务运行的工作。 我正在使用Windows 7家庭高级版32位,我有我的帐户我的服务设置为LocalSystem.This是我使用的代码:

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 path=@"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"); } 

任何帮助将不胜感激。 或者做同样的事情的替代方法,即运行包含此代码的Windows窗体可能?

您正在尝试执行的操作不受支持 :

Microsoft目前不推荐并不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office可能会出现不稳定的行为和/或在此环境中运行Office时发生死锁。

如果stream程在交互式桌面中运行,您可以自动运行Excel。 尝试从非交互式桌面(例如来自会话)自动运行Excel不受支持,并且失败。

嗨,我设法让这个工作在一种方式周围。 我基本上按照本教程和代码启动服务的交互式过程,以允许服务以SYSTEM用户身份运行,但为第一个login用户采用会话ID,并授予用户pipe理权限以运行交互式进程,如GUI应用程序。 打开Excel并通过Windows服务运行macros我首先编写了所有代码,在Windows窗体应用程序中执行此操作,并首先对其进行了testing。 然后,我改变了可执行文件,并完美运行。 我希望这可以帮助有相同问题的其他人。

如果没有启用“桌面交互”function,Excel在用户服务下运行良好。
首先 ,创buildExcel COM的标准方法不能在服务下工作。 你需要从你的程序启动Excel.exe进程 – 使用ShellExecuteEx(build议的方式)或CreateProcess(不build议)做到这一点。
第二阶段:使用GetActiveObject附加到Excel COM应用程序对象。 现在您可以正确访问所有Excel COM接口。
同样在几个操作系统中,Excel可能会在本地系统帐户下正常工作 – 手动更正这个文件创build2个文件夹:C:\ Windows \ system32 \ config \ systemprofile \ desktop
C:\ Windows \ SysWow64 \ config \ systemprofile \ desktop在第一次与Excel交互的情况下服务的其他bug第一次询问用户凭证并冻结在内存中。 您可以在registry或界面中禁用它(请参阅Excel帮助)。 有关启动过程的其他信息在那里 。