2017-10-13 50 views
0

Ceci est irritant. J'ai créé une méthode pour copier tous les graphiques Excel dans un classeur vers des diapositives PowerPoint.L'importation de diagrammes Excel d'Excel vers PowerPoint provoque l'apparition de `RPC_E_SERVERFAULT` sur certaines machines

public int ImportExcelChartsFromWorkbookToSlides(int startingSlideIndex, string workbookPath, string[] slideTitles, int chartPosTop, int chartPosLeft = 10, int titleWidth = 680, int titleHeight = 20, int titlePosTop = 90, int titlePosLeft = 20, int titleFontSize = 18) 
{ 
    int slideIndex = startingSlideIndex; 
    int titleIndex = 0; 
    EXCL.Application objExclApp = new EXCL.Application(); 
    EXCL.Workbook objWorkbook = objExclApp.Workbooks.Open(workbookPath, Editable: false); 
    foreach (EXCL.Worksheet objSheet in objWorkbook.Worksheets) 
    { 
     foreach (EXCL.ChartObject objChart in objSheet.ChartObjects()) 
     { 
      AddBlankSlide(slideIndex); 
      AddTextBox(titleWidth.ToString(), titleHeight.ToString(), titlePosTop.ToString(), titlePosLeft.ToString()); 
      AddTextBoxParagraph(slideTitles[titleIndex], fontSize: titleFontSize.ToString(), useThemeFont: true); 

      // Copy Chart from Sheet to Slide 
      objChart.CopyPicture(); 

      PPT.ShapeRange objShapeRange = objSlide.Shapes.Paste(); 

      objShapeRange.Left = chartPosLeft; 
      objShapeRange.Top = chartPosTop; 

      slideIndex++; 
      titleIndex++; 

      Marshal.ReleaseComObject(objChart); 
      Marshal.ReleaseComObject(objShapeRange); 
     } 
     Marshal.ReleaseComObject(objSheet); 
    } 
    objWorkbook.Close(); 
    objExclApp.Quit(); 
    Marshal.ReleaseComObject(objWorkbook); 
    Marshal.ReleaseComObject(objExclApp); 
    objWorkbook = null; 
    objExclApp = null; 
    return slideIndex; 
} 

Comme est généralement le cas, cela fonctionne parfaitement sur ma machine, mais certains utilisateurs font état d'une RPC_E_SERVERFAULT de cette méthode. (HRESULT: 0x80010105)

Quelque part dans cette méthode est à l'origine du problème. Soit cela ou c'est un problème avec différentes installations de bureau, un problème de mémoire ou un complément causant le problème. J'ai essayé ceci sur quelques autres machines mais elles fonctionnent toujours.

Répondre

1

RPC_E_SERVERFAULT est méchant et difficile à diagnostiquer. Vous obtenez cette erreur lorsque Excel s'est écrasé. Sans aucun détail, ce genre de crash est supposé être rapporté par l'application elle-même. Ce qui ne se passe pas, pire, c'est qu'Excel continue de fonctionner même si quelque chose de plutôt mauvais s'est produit. Vous ne pouvez pas faire de véritable progrès sur une telle mésaventure tant que vous n'avez pas mis la main sur une machine qui présente ce problème.

Il n'est cependant pas si difficile de trouver d'autres victimes, juste Google "chartobject rpc_e_serverfault". Ils ressemblent tous à la vôtre. Moins une bonne solution. J'ai une assez bonne théorie pour le problème sous-jacent. En cause est que Microsoft a réussi à maintenir les interfaces d'interopérabilité Office déjà depuis 19 ans. Plutôt une réalisation étonnante, et quelque chose que tout le monde prend pour acquis même si il n'y a rien trivial à ce sujet, mais il a été à court d'essence. Les graphiques sont remarquables comme un fauteur de troubles commun.

Jetez un oeil-voir à la définition du IChartObject interface. Basculer entre les définitions Office 2013 et 2003. Et notez la mystérieuse addition de méthode _Copy(). Apparemment entièrement inutile puisqu'il existe déjà une méthode Copy(). Et sans papiers.

C'est un problème. Si vous regardez la définition de l'interface avec GoTo Definition dans VS, notez que c'est la méthode seconde dans la table d'interface. C'est un gros, gros problème. Il rompt la compatibilité binaire de l'interface. Conséquences sont désastreuses, si vous avez utilisé la bibliothèque interop pour Office 2013 pour construire votre programme et l'utilisateur a Office 2003 sur sa machine (ou 2007, ne peut pas dire) alors l'appel CopyPicture() dans votre programme appelle le méthode d'implémentation complètement erronée. Probablement Cut(), une méthode qui ne prend aucun argument. C'est très mauvais, si la méthode elle-même n'implose pas, le déséquilibre de la pile peut causer toutes sortes de dégâts. RPC_E_SERVERFAULT est le résultat attendu. Donc, une théorie réalisable est que cela bombarde sur les machines qui ont une ancienne version Office. Peu vous pouvez faire à ce sujet sur votre fin, autre que la construction d'une autre version de votre programme qui utilise les bibliothèques interopérationnelles 2003 et qui demande au personnel informatique de faire attention quand ils le distribuent. Mise à niveau de la machine est de loin la solution de contournement simple.

+0

Merci pour l'info Hans. Tous nos utilisateurs sont sur Office 2013, cependant la configuration est toujours différente pour les différents utilisateurs ce qui est toujours difficile à diagnostiquer – Timmo

+0

Pensez-vous qu'une bonne solution consiste à enregistrer les graphiques sous forme d'images, puis à importer les images? Je sais que c'est un moyen long de faire cela, mais il supprime l'élément de presse-papiers – Timmo

+0

Pas vraiment d'idée comment vous faites cela. Gardez juste à l'esprit que si ma théorie est correcte, cela n'a rien à voir avec le presse-papier et * tous * les membres d'IChartObject sont en difficulté. Sauf le premier. –