尝试以编程方式打开PowerPoint时出错

时间:2012-11-16 22:52:16

标签: c# asp.net office-interop

我有一个方法,它使用Microsoft.Office.Interop.PowerPoint.Application接口将PowerPoint演示文稿幻灯片转换为jpeg文件。在Windows 2008服务器上运行的服务应用程序中,它可以正常运行。

然而,现在,我正在编写一个新的Web应用程序,它使用相同的进程,并在Presentation.Open调用上使用debubber choke错误:“PowerPoint无法打开文件”。

我的环境是Win 7,VS 2010.我正在使用具有管理员权限的域帐户进行模拟。我正在尝试打开的PowePoint文件位于c:\ temp文件夹中,其中“everyone”的NTFS权限设置为full;文件不是只读的,我可以使用与我用于模拟的域帐户类似的帐户手动打开文件。我不知道问题是什么。有人可以建议发生了什么吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using AjaxControlToolkit;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;
using System.Threading;


public partial class _Default : System.Web.UI.Page
{
  private static int folderExtension;
  private static string tempSavePath,
                        fileName;

  protected void Page_Load(object sender, EventArgs e)
  {

  }

  private void Page_Error(object sender, EventArgs e)
  {
    Random r = new Random();
    int eventID = r.Next(1, 65535);
    Exception objErr = Server.GetLastError().GetBaseException();
    string err = "\nPage_Error Event" +
            "\n\nError in: " + Request.Url.ToString() +
            "\n\nError Message:" + objErr.Message.ToString() +
            "\n\nStack Trace:" + objErr.StackTrace.ToString() +
            "\n";
    uploadResult.Text = err.ToString();        
  }

  protected void AsyncFileUpload1_click(object sender, AsyncFileUploadEventArgs e)
  {
     // Temporary folder where the presentation file is uploaded.
     tempSavePath = @"c:\temp\";

     // Checks if there is a file present for uploading.
     if (AsyncFileUpload1.HasFile)
     {
        fileName = AsyncFileUpload1.FileName;

        try
        {
            AsyncFileUpload1.SaveAs(tempSavePath + fileName);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            ConvertToJpegs();
        }
     }
     else
     {
        uploadResult.Text = "No file to upload.";
     }
 }

 // Converts the presentation slides into individual jpeg files.
 protected void ConvertToJpegs()
 {
    Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
    Microsoft.Office.Core.MsoTriState ofalse = Microsoft.Office.Core.MsoTriState.msoFalse;
    Microsoft.Office.Core.MsoTriState otrue = Microsoft.Office.Core.MsoTriState.msoTrue;

    Presentation pptPresentation = null;

    try
    {
     **>>> It break here with the ".Open" call <<<**   
        pptPresentation = app.Presentations.Open(tempSavePath + fileName, ofalse, ofalse, ofalse);
        pptPresentation.SaveAs(tempSavePath + ".", PpSaveAsFileType.ppSaveAsJPG, ofalse);
        Thread.Sleep(500);
    }
    catch (Exception ex1)
    {
        throw ex1;
    }
    finally
    {
        pptPresentation.Close();
    }
  }
}

2 个答案:

答案 0 :(得分:1)

首先,您尝试实现的目标似乎不受Microsoft支持/不推荐:

  

所有当前版本的Microsoft Office都经过设计,测试和管理   配置为在客户端工作站上作为最终用户产品运行。他们   假设交互式桌面和用户配置文件。 他们不提供   达到目标所必需的重入或安全水平   设计为无人值守的服务器端组件的需求。

     

Microsoft 目前不推荐不支持,   来自任何无人值守的Microsoft Office应用程序的自动化   非交互式客户端应用程序或组件(包括ASP,   ASP.NET,DCOM和NT服务),因为Office可能会出现不稳定   Office在此环境中运行时的行为和/或死锁。

     

如果您正在构建在服务器端上下文中运行的解决方案,那么您   应该尝试使用已经无人看管的安全组件   执行。或者,您应该尝试找到至少允许的替代方案   运行客户端的部分代码。如果您使用Office应用程序   从服务器端解决方案来看,应用程序将缺少许多   成功运行所需的功能。另外,你会   承担整体解决方案稳定性的风险。

来源:http://support.microsoft.com/kb/257757

话虽如此,似乎有其他几个人在这些设置下经历过类似的行为,所以我建议你看看:

此外,要检查您是否打开了.pptx权限,我只是使用PowerPoint Interop v.15(适用于Office 2013)在C#.NET 4.5控制台应用程序中尝试了代码示例的PowerPoint Interop位。标准台式电脑。这开箱即用。

答案 1 :(得分:0)

你如何运行web应用程序?是IIS 7.5还是Asp.Ne开发服务器? 如果是asp.net开发服务器,则应以管理员身份启动它。 如果那是IIS,我将需要IIS的版本。