这可能是一个非常简单的问题,但我已经尝试过去4-5个小时没有成功。 :(
我有一个只打开excel文件的C#控制台应用程序。这个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
- 授予ExcelExxy访问“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
我仍然得到同样的错误 xecuted as user:CORP \ shress2。
未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel无法访问该文件 'E:\ data_extracts \ RenameSheets.xlsm'。 有几个可能的原因:
文件名或路径不存在 该文件正由另一个程序使用 您尝试保存的工作簿与当前打开的工作簿具有相同的名称。 at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename,Object UpdateLinks,Object ReadOnly,Object Format,Object Password,Object WriteResPassword,Object IgnoreReadOnlyRecommended,Object Origin,Object Delimiter,Object Editable,Object Notify,Object Converter,Object AddToMru,Object Local,Object CorruptLoad)位于C:\ Users \ shress2 \ documents \ visual studio 2010 \ projects \ T_OpenExcel \ T_OpenExcel \ Program.cs:第24行中的T_OpenExcel.Program.Main(String [] args)处理退出代码-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();
}
}
}
答案 0 :(得分:0)
您只需在新作业步骤编辑器中选择相应的作业类型即可。您可以使用 Powershell 或 CmdExec 。
在命令区域中,单击打开按钮以找到您的控制台应用程序编译的可执行文件(exe)。
如果您有任何参数,请在此处添加 - 否则请配置计划。
您可能必须使用提升的权限。要使用提升的权限,只需导航到SSMS中的安全性 - >凭据,然后右键单击新凭据。接下来,配置 Sql Server代理 - >代理下的代理帐户,然后右键单击新代理。为 CmdExec 配置代理,并使用之前设置的凭据。在SQL代理作业步骤中,您可以选择在运行命令时使用的凭据。
在SQL作业步骤命令区域中,您应键入以下内容:
excel E:\data_extracts\RenameSheets.xlsm
答案 1 :(得分:0)
只需要在``新作业步骤''编辑器中选择适当的作业类型即可。您可以使用Powershell或CmdExec。
在``命令''区域中,单击``打开''按钮以找到您的控制台应用程序编译的可执行文件(exe)。
如果有任何参数,请在此处添加它们-否则配置时间表。
您可能必须使用提升的权限。要使用提升的权限,只需导航到SSMS中的Security-> Credentials,然后右键单击New Credential。接下来,在Sql Server代理->代理下配置``代理帐户'',然后右键单击``新代理''。为CmdExec配置代理并使用您之前设置的凭据。在“ SQL代理作业”步骤中,您可以选择运行命令时要使用的凭据。
在“ SQL Job Step命令”区域中,您应该键入以下内容:
excel E:\ data_extracts \ RenameSheets.xlsm
答案 2 :(得分:0)
新工作
CmdExec
现在从中运行exe文件
它将给出异常。
更改exe代码。
您不能将远程服务器路径设置为同一SQL Server的本地路径 \\ 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 =新的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); < / p>
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;