除非我手动启动Powerpoint,否则自动Powerpoint流程将无法运行?

时间:2013-10-29 23:17:08

标签: c# ms-office powerpoint office-interop

我有这个C#控制台应用程序尝试使用Powerpoint 2013将文件从ppt转换为pdf。从冷启动开始,它崩溃并出现错误:

    System.Runtime.InteropServices.ComException:Error HRESULT E_FAIL has been returned from a call to a COM component. 
    at Microsoft.Office.Interop.PowerPoint.Presentations.Open(String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow)
    at ConsoleApplication4.Program.Main(String[] args)
    --- End of inner exception stack trace ---
    at ConsoleApplication4.Program.Main(String[] args)

如果我只是将Powerpoint打开到一个新文件,它就不会工作。

我必须手动打开一个包含信息的ppt然后就可以了。

在我的控制台程序运行之前,有什么办法可以绕过手动打开ppt文件吗?我试图将其作为服务器上的自动进程实现,每次服务器重新启动时,我都无法手动打开文件。

代码:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            String sourceFilename = args[0];
            String destinationFileName = args[1];

            if (!File.Exists(sourceFilename))
            {
                throw new FileNotFoundException(string.Format("The specified file {0} does not exist.", sourceFilename), sourceFilename);
            }

            try
            {
                Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();

                app.Presentations.Open(sourceFilename,Microsoft.Office.Core.MsoTriState.msoFalse,Microsoft.Office.Core.MsoTriState.msoTrue,Microsoft.Office.Core.MsoTriState.msoFalse).SaveAs(destinationFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPNG);
                app.Quit();
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("Unable to convert {0} to {1}", sourceFilename, destinationFileName), e);
            }
        }
    }
}

我尝试添加此行:

app.Presentations.Open(sourceFilename, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse).Close();

SaveAs行之前,尝试打开和关闭演示文稿,但在重新启动时,这并不能解决问题。

我还尝试添加:app.Activate()app.Visible = MsoTriState.msoTrue,然后在崩溃之前打开一个空白的powerpoint窗口。

2 个答案:

答案 0 :(得分:2)

您是否双倍逃过\中的sourceFilename?您需要将\替换为\\,或在@的开头添加sourceFilename

来自here

<<ps.Open(@"D:\AQHA>>
  

C#中的反斜杠字符是一个所谓的&#34;转义字符&#34;,这意味着当它在某些其他字符之前时它具有特殊含义。例如,\ r \ n相当于&#34;回车&#34; (ANSI 13),\ t是一个选项卡(ANSI 9)。所以为了写一个反斜杠,传统上你必须加倍:\\

     

这可能是一个难以记住的问题,因此引入了几个版本@ @以告诉C#不将反斜杠解释为转义字符。把它放在开头引号之前,你可以像在Windows,VB等中一样编写路径。

修改

您可以在try内尝试以下操作,并查看崩溃的位置:

try
{
  Microsoft.Office.Core.MsoTriState ofalse = Microsoft.Office.Core.MsoTriState.msoFalse;
  Microsoft.Office.Core.MsoTriState otrue = Microsoft.Office.Core.MsoTriState.msoTrue;
  Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
  app.Visible = otrue
  app.Activate();
  Microsoft.Office.Interop.PowerPoint.Presentations ps = app.Presentations;
  Microsoft.Office.Interop.PowerPoint.Presentation p = ps.Open(sourceFilename,ofalse,otrue,otrue);
  p.SaveAs(destinationFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsPNG);
  app.Quit();
}

它仍会在open行崩溃吗?我用open中的参数玩了一下。我认为WithWindow必须是真实的,但你可以自己尝试。

您还可以尝试在文件名之前添加@而不转义转义字符,看看是否有帮助。

答案 1 :(得分:0)

我发现安装powerpoint时没有安装VBA(Visual Basic For Application),所以我回去做了,并且从命令行运行程序时清除了错误。我仍然遇到从C#运行它的问题。

此外,如果您未安装.NET 4.5,则尝试运行已编译的文件时会出现其他错误