1

我有一个简单的 excel 文件,其中包含以下代码:

Private Sub Workbook_Open()
   MsgBox "Hello World!"
End Sub

我试图运行一个 sql 作业来打开这个 excel 文件,但它失败了,变得没有响应。在谷歌搜索中,我发现“为什么”SQL 作业无法打开 Excel 文件的原因 Sql Server 代理上的作业未完成,但在 BIDS 中可以完成?

所以我想用 C# 创建一个简单的控制台应用程序,它可以简单地打开 excel 文件并运行我的宏。这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Threading;


namespace T_OpenExcel
{
class Program
{
    static void Main(string[] args)
    {

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        //Excel.Worksheet xlWorkSheet;

        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Open(@"E:\data_extracts\TestHelloWorld.xlsm", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
        RunMacro(xlWorkBook, new Object[] { "TestHello" });


        Thread.Sleep(5000);

        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
    }

    private static void RunMacro(Excel.Workbook xlWorkBook, object[] p)
    {
        //throw new NotImplementedException();
    }
}
}

我可以在 IDE 中成功运行此代码。现在我想从 SSMS 中的 SQL 作业运行它,sql server 2008。

我从我的 C# 项目中获取了 T_OpenExcel.exe 文件(T_OpenExcel-->bin-->Debug-->T_OpenExcel.exe)。我创建了一个 SQL 作业。以下是我的一些详细信息:

步骤名称:OpenHelloWorldExcel 类型:操作系统(CmdExec) 运行方式:SQL Server 代理服务帐户命令:C:\Users\shress2\Documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\bin\Debug\T_OpenExcel.exe

在运行此作业时,我得到以下状态 Start Job 'TestHelloWorld' Status Success Execute job 'TestHelloWorld' Status Error

在查看历史记录中,它显示:消息以用户身份执行:GSOPS4\SYSTEM。未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel 无法访问文件“E:\data_extracts\TestHelloWorld.xlsm”。有几个可能的原因:
文件名或路径不存在。该文件正被另一个程序使用。您尝试保存的工作簿与当前打开的工作簿同名。在 Microsoft.Office.Interop.Excel.Workbooks.Open(字符串文件名、对象 UpdateLinks、对象只读、对象格式、对象密码、对象 WriteResPassword、对象 IgnoreReadOnlyRecommended、对象来源、对象分隔符、对象可编辑、对象通知、对象转换器、对象AddToMru, Object Local, Object CorruptLoad) at T_OpenExcel.Program.Main(String[] args) in C:\Users\shress2\documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\Program.cs:line 23. 进程退出代码-532462766。步骤失败。

我检查了 E:\data_extracts\TestHelloWorld.xlsm 目录,发现它工作正常。我确保我的 xlsm 文件没有被任何人使用。我无法弄清楚为什么它无法运行它。任何帮助是极大的赞赏。谢谢你的建议!

4

1 回答 1

1

问题似乎是您试图在打开 Excel 文件时显示一个消息框,但您正在自动化它,因此没有人可以单击消息框上的按钮。其余代码无法执行,因为文件正坐在那里等待有人单击按钮。

在随后的运行中,服务器无法访问它,因为它仍然坐在那里,对普通用户不可见,等待单击按钮。因此错误。

简短版本:不要在无人看管的应用程序上提示用户输入。

于 2012-05-21T16:43:55.853 回答