7

这可能是一个非常简单的问题,但我一直在尝试过去 4-5 小时,但没有成功。:(

我有一个 C# 控制台应用程序,它只打开一个 excel 文件。这个 excel 文件有 Workbook_Open() 事件,它运行我的宏。我的宏只是在活动工作表中将 sheet1 重命名为 RenameSheet1。

我可以从 IDE 运行我的 C# 项目。我想从 SQL 作业(SQL server 2008)运行这个项目。我该怎么做?请帮我完成这项工作。谢谢。

根据 SilverNinnjas 创建代理帐户的建议:

-- 创建包含域帐户 CORP\PowerUser1 及其密码的凭据

CREATE CREDENTIAL PowerUser1 WITH IDENTITY = N'CORP\shress2', SECRET = N'P@ssw0rd'
GO
USE [msdb]
GO

-- 创建一个名为 ExcelProxy 的新代理并为其分配 PowerUser 凭据

EXEC msdb.dbo.sp_add_proxy 
@proxy_name=N'ExcelProxy',
@credential_name=N'PowerUser1',
@enabled=1

-- 授予 ExcelProxy 访问“CmdExec”子系统的权限

EXEC msdb.dbo.sp_grant_proxy_to_subsystem 
@proxy_name=N'ExcelProxy', 
@subsystem_name =N'CmdExec'

-- 授予登录testUser使用ExcelProxy的权限

EXEC msdb.dbo.sp_grant_login_to_proxy 
@login_name = N'shress2', 
@proxy_name=N'ExcelProxy'
GO

我仍然遇到与用户相同的错误:CORP\shress2。

未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel 无法访问文件“E:\data_extracts\RenameSheets.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 24. 进程退出代码-532462766。步骤失败。

有什么理由吗?我急切地等待任何反馈。非常感谢。

@SilverNinja,这是我的 C# 代码:

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();
        xlApp.Visible = true;
        xlWorkBook = xlApp.Workbooks.Open("\\\\myserver\\data_extracts\\RenameSheets.xlsm", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

       xlApp.DisplayAlerts = false;
       xlWorkBook.SaveAs("\\\\myserver\\data_extracts\\RenameSheets.xlsm", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


                  xlWorkBook.Close(true, misValue, misValue);
        xlApp.DisplayAlerts = true;

        xlApp.Quit();
    }

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

3 回答 3

1

您只需要在New Job Step编辑器中选择适当的Job Type 。您可以使用PowershellCmdExec

在命令区域中,单击打开按钮以找到您的控制台应用程序编译的可执行文件 (exe)。

如果您有任何参数,请在此处添加它们 - 否则配置计划。

您可能必须使用提升的权限。要使用提升的权限,只需导航到SSMS 中的Security->Credentials并右键单击New Credential。接下来,在Sql Server Agent->Proxies下配置Proxy Account并右键单击New Proxy为CmdExec配置代理并使用您之前设置的凭据。在您的 SQL 代理作业步骤中,您可以选择在运行命令时使用此凭据。

在 SQL 作业步骤命令区域中,您应该键入如下内容:

excel E:\data_extracts\RenameSheets.xlsm
于 2012-05-21T19:34:47.403 回答
0

新工作

命令执行

现在从中运行exe文件

它会给出异常。

更改exe代码。

您不能将远程服务器路径设为本地到同一 sql 服务器 \\myserver\data_extracts\RenameSheets.xlsm 到 d:\data_extracts\RenameSheets.xlsm 或使用复制 bin exe 文件路径的文件路径。Path.GetDirectoryName(Application.ExecutablePath) 例如。值:C:\Projects\ConsoleApplication1\bin\Debug\RenameSheets.xlsm

确保只有一个 exe 正在运行,否则会出现错误文件已打开

运行exe代码它会工作。命令提示符无法访问网络路径。

xlApp = new Excel.Application(); xlApp.Visible = true; xlWorkBook = xlApp.Workbooks.Open("C:\Projects\ConsoleApplication1\bin\Debug\RenameSheets.xlsm

", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

   xlApp.DisplayAlerts = false;
   xlWorkBook.SaveAs("C:\Projects\ConsoleApplication1\bin\Debug\RenameSheets.xlsm", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);


              xlWorkBook.Close(true, misValue, misValue);
    xlApp.DisplayAlerts = true;
于 2018-09-19T19:13:33.760 回答
-3

只需在 New Job Step 编辑器中选择适当的 Job Type。您可以使用 Powershell 或 CmdExec。

在命令区域中,单击打开按钮以找到您的控制台应用程序编译的可执行文件 (exe)。

如果您有任何参数,请在此处添加它们 - 否则配置计划。

您可能必须使用提升的权限。要使用提升的权限,只需导航到 SSMS 中的 Security->Credentials 并右键单击 New Credential。接下来,在 Sql Server Agent->Proxies 下配置 Proxy Account 并右键单击 New Proxy。为 CmdExec 配置代理并使用您之前设置的凭据。在您的 SQL 代理作业步骤中,您可以选择在运行命令时使用此凭据。

在 SQL 作业步骤命令区域中,您应该键入如下内容:

excel E:\data_extracts\RenameSheets.xlsm

于 2018-07-18T10:00:37.513 回答