1

我有这个 C# 控制台应用程序试图使用 Powerpoint 2013 将文件pptpdf. 从冷启动,它崩溃并出现错误:

    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 窗口。

4

2 回答 2

2

你有双重逃脱\sourceFilename?您需要将 替换\\\@sourceFilename.

这里

<<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需要是真实的,但您可以自己尝试。

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

于 2013-10-31T19:14:26.373 回答
0

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

此外,如果您没有安装 .NET 4.5,则尝试运行编译文件时会出现不同的错误

于 2013-10-30T23:07:15.237 回答