我有可以将幻灯片导出到PowerPoint的应用程序。我正在使用Microsoft.Office.Interop.PowerPoint.dll。这是装配的第11版。我今天运行了应用程序,似乎应用程序抛出异常(来自HRESULT的异常:0x80070057(E_INVALIDARG))。它只会在我点击导出按钮之前在系统中打开powerpoint应用程序时抛出此异常。我正在向Powerpoint演示文稿的CustomDocumentProperties添加自定义属性,以便识别应用程序创建的演示文稿。这是我第一次看到这个例外。我有Windows 7 Ultimate x64系统与visual studio 2008和2010,当然还有Office 2007。
导致异常的代码部分:
oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
BindingFlags.Default |
BindingFlags.GetProperty,
null, oDocBuiltInProps,
new object[] { strIndex });
怎么了? 我遵循了Microsoft的这篇文章:http://support.microsoft.com/kb/303296
一年多来,应用程序一直没有任何问题。出了什么问题?花了10个小时在互联网上寻找我放弃的答案。
这是Export2Powerpoint方法的代码:
public static void Export(List<ChartObject> chartObjects)
{
Application ppApp = new Application();
foreach (ChartObject chartObject in chartObjects)
{
chartObject.Chart.BorderLineStyle = ChartDashStyle.NotSet;
}
Presentation ppPress = null;
int i;
object oDocBuiltInProps;
string strValue = string.Empty;
if(ppApp.Presentations.Count == 0)
{
ppPress = AddPresentation(ppApp, ppPress);
}
else
{
i = 0;
object oDocAuthorProp = null;
foreach (Presentation presentation in ppApp.Presentations)
{
oDocBuiltInProps = presentation.CustomDocumentProperties;
Type typeDocBuiltInProps = oDocBuiltInProps.GetType();
string strIndex = "Browser";
try{
oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
BindingFlags.Default |
BindingFlags.GetProperty,
null, oDocBuiltInProps,
new object[] { strIndex }); ======>> here is the line that generates the exception
}
catch(Exception e)
{
//ErrorHandling.LogErrorToFile(e.Message, e.StackTrace);
}
if (oDocAuthorProp != null)
{
Type typeDocAuthorProp = oDocAuthorProp.GetType();
strValue = typeDocAuthorProp.InvokeMember("Value",
BindingFlags.Default |
BindingFlags.GetProperty,
null, oDocAuthorProp,
new object[] {}).ToString();
}
i++;
if(strValue == "true")
{
break;
}
}
if (strValue != string.Empty)
{
ppPress = ppApp.Presentations[i];
}
else
{
ppPress = AddPresentation(ppApp, ppPress);
}
}
i = ppPress.Slides.Count + 1;
int j = 0;
chartObjects.Reverse();
chartObjects.ForEach(chartObject =>
{
string directory = Path.Combine(System.Windows.Forms.Application.StartupPath, (i) + ".png");
PowerPoint.Slide actSlide = ppPress.Slides.Add(i, PpSlideLayout.ppLayoutBlank);
actSlide = ppPress.Slides[i];
Size size = chartObject.Chart.Size;
chartObject.Chart.ChartAreas[0].AxisX.LabelsAutoFitMinFontSize = 14;
chartObject.Chart.Size = new Size(RunTime.Configuration.ImageXSize,RunTime.Configuration.ImageYSize);
chartObject.Chart.SaveAsImage(directory, ChartImageFormat.Png);
chartObject.Chart.Size = size;
Image image = Image.FromFile(directory);
actSlide.Shapes.AddPicture(directory, MsoTriState.msoFalse,
MsoTriState.msoTrue, 0, 0, (int)ppPress.SlideMaster.Width, (int)ppPress.SlideMaster.Height);
image.Dispose();
File.Delete(directory);
j++;
});
chartObjects.Reverse();
ppApp.Visible = MsoTriState.msoTrue;
foreach (ChartObject chartObject in chartObjects)
{
chartObject.Chart.BorderLineStyle = ChartDashStyle.Solid;
}
}
编辑: 只有当打开至少一个powerpoint窗口并且该窗口中的演示文稿尚未保存到磁盘时,才会抛出此类异常。当打开至少一个带有演示文稿的powerpoint窗口已保存到磁盘时,应用程序运行正常。
答案 0 :(得分:1)
当我使用嵌入式字体时,我遇到了我怀疑可能是类似的问题(当时,代码上无法解释的例外,但我们确实跟踪了它)。事实证明,这是一个无法解决的,不可见的对话框阻止了应用程序,互操作库变成了一个例外。本质上,我们的经验是,PowerPoint应用程序的许多功能对于互操作类不可用,如果在正常操作中达到它们,则互操作代码会挂起或中断(通常会中断)。所以,在我们的例子中,没有互操作标志允许使用嵌入字体(在PowerPoint应用程序中,当文件嵌入字体时,它强制提示(你想以只读模式打开它,还是根本不打开) ?))必须回答,并且由于互操作库中没有能力指定您的选择,互操作调用会抛出异常。所以,我的猜测是这里有一些东西,互操作库无法回答PowerPoint应用程序提出的“阻塞”问题。
当然,我们遇到此问题的最常见原因都是由Windows Update提供Office更新引起的,这些更新更新了PowerPoint的安全默认值。您可能想先检查一下。
如果您要在普通的PowerPoint应用程序窗口中执行相同的操作(将该字段更改为“浏览器”,我认为您似乎正在执行此操作),在尚未保存的演示文稿中,它是否会呈现给您用对话框?