我一直在尝试从最近3天读取.ppt文件。我在互联网上搜索了很多内容,然后想到了不同的源代码片段,但没有一个是完美的。现在,我尝试了此代码,由于“ Foreach”语句中存在一些无法识别的问题,因此未打印“ Check4”,并引发了异常。请指导我。我非常需要它。
public static void ppt2txt (String source)
{
string fileName = System.IO.Path.GetFileNameWithoutExtension(source);
string filePath = System.IO.Path.GetDirectoryName(source);
Console.Write("Check1");
Application pa = new Microsoft.Office.Interop.PowerPoint.ApplicationClass ();
Microsoft.Office.Interop.PowerPoint.Presentation pp = pa.Presentations.Open (source,
Microsoft.Office.Core.MsoTriState.msoTrue,
Microsoft.Office.Core.MsoTriState.msoFalse,
Microsoft.Office.Core.MsoTriState.msoFalse);
Console.Write("Check2");
String pps = "";
Console.Write("Check3");
foreach (Microsoft.Office.Interop.PowerPoint.Slide slide in pp.Slides)
{
foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in slide.Shapes)
pps += shape.TextFrame.TextRange.Text.ToString ();
}
Console.Write("Check4");
Console.WriteLine(pps);
}
被抛出的异常是
System.ArgumentException:指定的值超出范围。
在Microsoft.Office.Interop.PowerPoint.TextFrame.get_TextRange()
在c:\ Users \ Shahmeer \ Desktop \ New文件夹(2)\ KareneParser \ Program.cs:line 323中的KareneParser.Program.ppt2txt(字符串源)
在c:\ Users \ Shahmeer \ Desktop \ New文件夹(2)\ KareneParser \ Program.cs:line 150中的KareneParser.Program.Main(String [] args)
捕获异常的第323行
pps += shape.TextFrame.TextRange.Text.ToString ();
提前致谢。
最佳答案
看来您需要检查形状对象以查看它们是否具有TextFrame和Text。
在您的嵌套foreach循环中,尝试以下操作:
foreach (Microsoft.Office.Interop.PowerPoint.Slide slide in pp.Slides)
{
foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in slide.Shapes)
{
if(shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
{
var textFrame = shape.TextFrame;
if(textFrame.HasText == Microsoft.Office.Core.MsoTriState.msoTrue)
{
var textRange = textFrame.TextRange;
pps += textRange.Text.ToString ();
}
}
}
}
这当然是未经测试的,但在我看来,随着您的foreach循环,您正在尝试访问PowerPoint文档中一些没有文本的形状,因此超出范围。我添加了检查以确保它仅在文本存在的情况下才将文本追加到您的pps字符串中。
关于c# - Powerpoint文字C#-Microsoft.Interop,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30434684/