【问题标题】:Automated Powerpoint process won't work unless I manually start up Powerpoint?除非我手动启动 Powerpoint,否则自动 Powerpoint 过程将不起作用?
【发布时间】:2013-11-01 08:32:13
【问题描述】:

我有这个 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 窗口。

【问题讨论】:

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


    【解决方案1】:

    您是否在sourceFilename 中双重转义了\?您需要将\ 替换为\\ 或在sourceFilename 的开头添加@

    来自here

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

    C# 中的反斜杠字符是所谓的“转义字符”,这意味着当它位于某些其他字符之前时,它具有特殊含义。例如,\r 相当于“回车”(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-line 上崩溃吗?我对open 中的参数进行了一些操作。我认为WithWindow 必须是真实的,但您可以自己尝试。

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

    【讨论】:

    • 是的,所有的转义字符都被正确转义了
    • 我发布的答案实际上解决了这个问题。只是我还不能接受。
    • 好吧,我以为你说你仍然有 C# 的问题,并认为这是同样的错误。很高兴你成功了。
    【解决方案2】:

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

    此外,如果您在未安装 .NET 4.5 的情况下尝试运行已编译的文件,则会收到不同的错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-02
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多