首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除非我手动启动Powerpoint,否则自动Powerpoint进程将无法工作?

除非我手动启动Powerpoint,否则自动Powerpoint进程将无法工作?
EN

Stack Overflow用户
提问于 2013-10-29 23:17:08
回答 2查看 1.8K关注 0票数 1

我让这个C#控制台应用程序尝试使用Powerpoint 2013将文件从ppt转换为pdf。从一个冷引导,它崩溃了一个错误:

代码语言:javascript
复制
    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文件吗?我试图将其实现为服务器上的一个自动进程,而且每次服务器重新启动时,我都不能手动打开文件。

守则:

代码语言:javascript
复制
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);
            }
        }
    }
}

我试着添加这一行:

代码语言:javascript
复制
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窗口。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-30 23:07:15

在安装powerpoint时,我发现没有安装VBA (),所以我返回并这样做,在从命令行运行程序时,它清除了错误。不过,从C#运行它仍然有问题。

此外,如果您没有安装.NET 4.5,尝试运行编译后的文件将得到不同的错误

票数 0
EN

Stack Overflow用户

发布于 2013-10-31 19:14:26

你是不是双倍逃离了\ in sourceFilename?您需要用\替换\\,或者在sourceFilename的开头添加一个@

来自这里

代码语言:javascript
复制
<<ps.Open(@"D:\AQHA>>

C#中的反斜杠字符是所谓的“转义字符”,意思是当它先于某些其他字符时,它有一个特殊的含义。例如,\r相当于“回车”(ANSI 13),\t是一个制表符(ANSI 9)。因此,为了编写反斜杠,传统上必须将其加倍:\ 这可能是一件很难记住的事情,所以引入了几个返回@的版本,告诉C#不要将反斜杠解释为转义字符。把它放在开首引号之前,你就可以像在Windows、VB等中那样写路径。

编辑

您是否可以在您的try中尝试以下内容并查看其崩溃的位置:

代码语言:javascript
复制
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必须是真实的,但你可以自己尝试。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19670929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档