我在这里面临一种情况,希望得到一些反馈或建议。 我获得了一个作为服务运行的应用程序,具有特定的服务帐户(不是服务器上的管理员),并尝试打开Excel工作簿。
问题不在于初始应用程序,因为我可以使用下面的通用C#代码(嵌入在服务结构中)重现它:
try{
this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
this._exApp.Visible = false;
Log.Logger.Info("Opening workbook...");
Workbook workbook = this._exApp.Workbooks.Open(
thisFileName,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing
);
Log.Logger.Info("Workbook opened!");
//Do something with the result
Log.Logger.Info("Closing workbook...");
workbook.Close(false, thisFileName, null);
Marshal.ReleaseComObject(workbook);
this._exApp.Quit();
}
catch(Exception ex){
Log.Logger.Error(ex.Message);
}
(没有什么特别关于* this._exApp *和 thisFileName ,它们分别被转换为Microsoft.Office.Interop.Excel.Application,并且作为包含文件路径的字符串打开.Log.Logger是一个使用log4net的记录器类,可以让我看到问题发生的时间)
该服务作为服务帐户运行,该服务帐户是服务器上的用户,而不是管理员。它可以访问目标文件和服务器上的文件(作为读访问权限)。该服务器是Windows Server 2003 Standard Edition SP2(无法在2008 R2服务器上试用)。
我遇到的问题是它只是在尝试打开工作簿时挂起,所以在跟踪我的最后一行是“打开工作簿......”,从未到达“工作簿已打开”行。没有例外。
所以代码非常简单,它只是试图打开一个excel工作簿。我已经完成了一些调查,以下是我的调查结果:
基本上,情况是Workbooks.Open方法在作为服务运行时,在非管理员的服务帐户下以及访问远程文件时挂起。
我很感激有关此主题的任何意见或想法。
感谢。
乔纳森
编辑:根据下面Matt的解决方法,我们已经实现了远程文件的本地副本,所以我接受它作为答案,但我仍然对如何使其直接在远程文件上工作的任何建议感兴趣。答案 0 :(得分:2)
我会把它作为评论,但我还没有足够的代表,所以这更像是一种可能的解决方法,而不是一个完整的答案......
如果尝试打开的文件是本地文件,则该服务可以正常工作。不幸的是,我们尝试访问的文件位于远程文件服务器上,在那种情况下它不起作用。
您可以先将文件从远程服务器复制到本地临时位置吗?
this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
this._exApp.Visible = false;
string localFile = "local.xls";
System.IO.File.Copy(thisFileName, localFile);
Log.Logger.Info("Opening workbook...");
Workbook workbook = this._exApp.Workbooks.Open(localFile, ...);
Log.Logger.Info("Workbook opened!");
答案 1 :(得分:2)
疯狂与否,您需要创建以下文件夹
C:\ Windows \ System32 \ config \ systemprofile \ Desktop(32位) C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop(64bit)
通过使用系统帐户来运行通过Scheduler运行的Excel ....