我一直在尝试从最近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/

10-15 17:02