我正在开发一个创建PowerPoint演示文稿的C#程序。但是,我遇到了以下说明的问题:
Presentation pres = pres_set.Open(path,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoTrue,
Microsoft.Office.Core.MsoTriState.msoTrue);
此说明仅在某些情况下有效。如果没有,则会抛出“PowerPoint无法打开文件”消息的异常。然后,当我手动打开模板文件时,关闭它并再次执行该函数,大部分时间它将正确执行。
我使用过Microsoft Powerpoint 14.0和Microsoft Powerpoint 12.0库,但两者都存在同样的问题。
有没有办法避免这个奇怪的问题?
答案 0 :(得分:6)
答案要简单得多:Powerpoint应用程序需要现有文件。
我只是遇到了相同的异常,因为我使用了相对路径,而PowerPoint试图打开相对于PowerPoint.exe而不是Program.exe的文件。
通过在调用open-method之前添加类似的内容,可以快速解决此问题:
// Start Powerpoint
var powerpointApp = new Microsoft.Office.Interop.PowerPoint.Application();
// Get a fileInfo object to generate the full path
FileInfo fileInfo = new FileInfo(@"RelativeDir\YourPresentation.pptx");
// Use the full path
powerpointApp.Presentations.Open(fileInfo.FullName, MsoTriState.msoTrue, WithWindow: MsoTriState.msoFalse);
答案 1 :(得分:1)
你有没有试过像这样设置TriState?
Object oMiss = System.Reflection.Missing.Value;
Presentation pres = pres_set.Open(ref path, ref oMiss, ref oMiss, ref oMiss);
答案 2 :(得分:1)
我遇到了与PowerPoint类似的问题。我发现我的Presentations.Open方法失败,除非我打开PowerPoint。
一个可能的解决方案是设置PowerPointApplication.Visible = MsoTriState.msoTrue
但是,这会导致PowerPoint在物理上打开,这可能是不受欢迎的。
我通过将Open方法的最后一个参数设置为msoFalse解决了我的问题,它指定不应该在服务器上打开PowerPoint窗口,这是更理想的。
Presentations.Open(inputFileName,
MsoTriState.msoFalse,
MsoTriState.msoTrue,
MsoTriState.msoFalse);
请查看this MSDN KB article以获取有关Open方法的不同参数的更多信息。
答案 3 :(得分:1)
我在尝试打开现有的PowerPoint演示文稿时遇到了同样的问题,直到我发现我的Office安装选项中没有安装Visual Basic for Applications(VBA),如下所述:
http://www.debugging.com/bug/22261
显然,只有在使用PowerPoint时才会出现此问题,因为我在操作Excel和Word文件时没有任何问题。
一旦我修复了Office,问题就消失了,包括VBA到安装。
希望它有所帮助!
答案 4 :(得分:1)
ProcessStartInfo ten_ct = new ProcessStartInfo();
ten_ct.FileName = "POWERPNT.EXE";
ten_ct.Arguments = @"D:\project\GiaoAn\GiaoAn\MyPpt.pptx";
Process.Start(ten_ct);
答案 5 :(得分:0)
我已经在Excel中看到过这样的问题,即使我尝试以具有要打开的命令行文件的用户身份启动它。所以你的程序可能没有任何问题。当我以用户身份执行此操作时,通常它会第二次运行。
所以我的建议是
1)为了让您的程序在没有文件的情况下首先尝试打开Power Point,请等待(以5秒开始),然后让它尝试加载文件。
或
2)你的程序可以捕获异常,只是尝试再次打开文件如果失败(如果你发现它有效,你应该添加最大尝试次数,所以程序不会循环尝试这样做一整天)。您也可以选择检查文件是否存在(如果您的方案中存在这种情况 - 但听起来这不是您目前面临的问题)。
答案 6 :(得分:0)
试试这个:
Presentation pres = pres_set.Open(path,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoTrue,
Microsoft.Office.Core.MsoTriState.msoFalse);
答案 7 :(得分:-2)
我使用以下方法解决了这个问题:
var app = new PP.Application();
PP.Presentation pres = null;
try
{
Process.Start(inputFile);
var presCol = app.Presentations;
// Waiting for loading
Thread.Sleep(2000);
pres = presCol[inputFile];
// Your code there
// ...............
}
catch (System.Exception ex)
{
Log.Error(ex.Message);
throw;
}
finally
{
if (pres != null)
{
pres.Close();
}
if (app != null)
{
app.Quit();
}
pres = null;
app = null;
}