我让这个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窗口。
发布于 2013-10-30 23:07:15
在安装powerpoint时,我发现没有安装VBA (),所以我返回并这样做,在从命令行运行程序时,它清除了错误。不过,从C#运行它仍然有问题。
此外,如果您没有安装.NET 4.5,尝试运行编译后的文件将得到不同的错误
发布于 2013-10-31 19:14:26
你是不是双倍逃离了\ in 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必须是真实的,但你可以自己尝试。
您还可以尝试在文件名之前添加该@,而不转义转义字符,并查看这是否有帮助。
https://stackoverflow.com/questions/19670929
复制相似问题