如何从Windows服务运行excelvba代码

本文关键字:运行 excelvba 代码 服务 Windows | 更新日期: 2023-09-27 18:00:44

我想从我的Windows服务中运行一些excel vba代码。该服务正在使用fileSystemWatcher来监视要添加的xml文件的目录。添加文件后,xml文件的内容将反序列化为对象属性。在这个阶段,我想打开一个excel文件,将这些值传递到特定的单元格中,并运行该工作手册中的vba代码。我可以从windows窗体应用程序中完美地运行它,但我无法从windows服务应用程序中运行它。我在应用程序上附加了一个调试器,试图查看发生了什么,但没有抛出任何错误,所有步骤都成功完成。我知道Windows服务不支持打开MS Office文件,因为与UI及其用户权限的交互存在问题。但我正在寻找一种可以从服务中运行此vba代码的方法。我正在使用Windows 7 Home Premium 32位,我的服务帐户设置为LocalSystem。这是我正在使用的代码:

    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窗体?

如何从Windows服务运行excelvba代码

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

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

如果流程在交互式桌面上运行,则可以自动执行Excel。不支持尝试从非交互式桌面(例如,从会话)自动执行Excel,但会失败。

嗨,我设法以一种迂回的方式完成了这项工作。我基本上遵循了本教程和从服务启动交互式进程的代码,以允许服务作为SYSTEM用户运行,但采用第一个登录用户的会话ID,并授予用户运行交互式进程(如GUI应用程序)的管理权限。为了打开excel并通过Windows服务运行宏,我首先在Windows窗体应用程序中编写了所有代码,并首先在那里进行了测试。然后我更改了可执行文件,它运行得很好。我希望这能帮助其他有同样问题的人。

Excel在没有启用"桌面交互"的用户服务下运行良好
第一个,创建Excel COM的标准方法在服务下不起作用。您需要从程序启动Excel.exe进程-使用ShellExecuteEx(建议使用的方式)或CreateProcess(不建议使用)来执行此操作。
第二个阶段:使用GetActiveObject附加到Excel COM应用程序对象。现在,您可以正确访问所有Excel COM接口
此外,在几个操作系统中,Excel可能在LocalSystem帐户下工作不正确而崩溃-要更正此问题,请手动创建2个文件夹:C: ''Windows''system32''config''systemprofile''datadesk
C: ''Windows''SysWow64''config''systemprofile''sdesktop服务中的其他错误没有在第一次与Excel交互时降级,询问用户凭据并冻结在内存中。您可以在注册表或界面中禁用它(请参阅Excel帮助)。关于启动过程的其他信息也在那里。