none
PowerPoint automation RRS feed

  • Вопрос

  • Всем привет!

    Есть приложение на c#, которое меняет данные графика в pptx файле под 2007 офис (Microsoft.Office.Interop.PowerPoint версии 12.0**).

    var pptApp = new Application();
                pptApp.Visible = MsoTriState.msoTrue;
                Loger.Log(pptPath);
                var ppt = pptApp.Presentations.Open(pptPath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoTrue);
                Loger.Log("ppt opened");
    
                try
                {
                    var templateSlide = ppt.Slides[1];
                    templateSlide.Copy();
    
                    Loger.Log("Копируем слайды");
                    for (int i = 0; i < _data.Count - 1; i++)
                        ppt.Slides.Paste();
    
                    for (int i = 1; i <= ppt.Slides.Count; i++)
                    {
                        var slide = ppt.Slides[i];
                        slide.SlideShowTransition.AdvanceOnClick = MsoTriState.msoFalse;
                        slide.SlideShowTransition.AdvanceOnTime = MsoTriState.msoTrue;
                        slide.SlideShowTransition.EntryEffect = PpEntryEffect.ppEffectFadeSmoothly;
                        slide.SlideShowTransition.AdvanceTime = 10;
                    }
    
                    for (int i = 1; i <= _data.Count; i++)
                    {
                        Loger.Log("Редактируем " + i + " слайд");
                        var slide = ppt.Slides[i];
                        var itemData = _data[i - 1];
    
                        Loger.Log("Изменяем заголовок");
                        // Заголовок
                        if (slide.Shapes[1].HasTextFrame == MsoTriState.msoTrue)
                            slide.Shapes[1].TextFrame.TextRange.Text = itemData.ParameterName;
    
                        Loger.Log("Изменяем данные столбчатой диаграммы 1");
                        // Столбчатые значения
                        if (slide.Shapes[2].HasChart == MsoTriState.msoTrue)
                        {
                            var ws = slide.Shapes[2].OLEFormat.Object.Sheets[1];
    
                            for (int index = 0; index < itemData.Values.Count; index++)
                            {
                                var value = itemData.Values[index];
                                ws.Range[string.Format("A{0}", index + 2)].Value = value.Name;
                                ws.Range[string.Format("B{0}", index + 2)].Value = value.Day;
                                ws.Range[string.Format("C{0}", index + 2)].Value = value.Night;
                                ws.Range[string.Format("D{0}", index + 2)].Value = value.AvDay;
                            }
                        }

    Строка slide.Shapes[3].OLEFormat. Object.Sheets[1];

    падает с исключением OLEFormat (unknown member) : Invalid request.  This property only applies to OLE objects.



Ответы

  • Вообще OleAutomation это такая странная штука, которая весьма странно работает и очень сильно зависит от версий библиотек и программ установленных на компьютере. Работайте с файлами Power Point (благо он у вас 2007) через OpenXML. Это в большинстве случаев правильнее.

    5 июня 2014 г. 10:03
    Отвечающий

Все ответы

  • Добрый день.

    Поставьте точку останова, скопируйте в Watch строку slide.Shapes[2]. Посмотрите что это за тип, какие у него есть свойства. Но обычно Visual Studio можно верить, и раз она говорит, что такого свойства нет, то его действительно нет... Вполне возможно, вы ошиблись с индексом.

    Отвечающий
  • Поставил. Вот что получилось:

    Если заглянуть дальше, то можно увидеть Chart, с которым работает 14 версия, но попытка вызвать slide.Shapes[2].Chart выдает "'Microsoft.Office.Interop.PowerPoint.Shape' does not contain a definition for 'Chart' and no extension method 'Chart' accepting a first argument of type 'Microsoft.Office.Interop.PowerPoint.Shape' could be found (are you missing a using directive or an assembly reference?)" при компиляции




  • Вообще OleAutomation это такая странная штука, которая весьма странно работает и очень сильно зависит от версий библиотек и программ установленных на компьютере. Работайте с файлами Power Point (благо он у вас 2007) через OpenXML. Это в большинстве случаев правильнее.

    5 июня 2014 г. 10:03
    Отвечающий