2010-03-26 3 views
3

Je travaille sur un plugin VSTO Excel 2007 qui lance des exceptions COM sur le client mais pas lors du débogage sur mon ordinateur de développement. Le plugin capture l'événement Startup d'Excel, définit un style spécialisé, puis ajoute un gestionnaire d'événements à l'événement SheetChange. Chaque fois qu'une valeur est modifiée dans la feuille, la cellule est définie sur le nouveau style. Tout cela pour fournir aux utilisateurs un moyen de voir les cellules qu'ils ont modifiées. Le code est le suivant:Excel 2007 Exception du plug-in VSTO lors du paramétrage de Font.Color

private void ThisWorkbook_Startup(object sender, System.EventArgs e) 
     { 
      this.BeforeSave += new Microsoft.Office.Interop.Excel.WorkbookEvents_BeforeSaveEventHandler(ThisWorkbook_BeforeSave); 

      this.SheetChange += new Microsoft.Office.Interop.Excel.WorkbookEvents_SheetChangeEventHandler(ThisWorkbook_SheetChange); 

      cfStyle = Globals.ThisWorkbook.Styles.Add("CFStyle", missing); 
      cfStyle.Font.Color = Excel.XlRgbColor.rgbOrange; 
      cfStyle.Font.Bold = true; 
      cfStyle.Interior.Color = Excel.XlRgbColor.rgbLightGray; 
      cfStyle.Interior.TintAndShade = 0.8; 

      cfStyle.Borders.LineStyle = Excel.XlLineStyle.xlContinuous; 
      cfStyle.Borders.Weight = Excel.XlBorderWeight.xlThin; 
      cfStyle.Borders.Color = Excel.XlRgbColor.rgbDarkSlateGray; 
      cfStyle.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlDiagonalDown].LineStyle = Excel.XlLineStyle.xlLineStyleNone; 
      cfStyle.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlDiagonalUp].LineStyle = Excel.XlLineStyle.xlLineStyleNone; 
     } 

Lorsque cela s'exécute dans dev, il fonctionne parfaitement. Cependant, quand il est exécuté sur une machine client, j'obtiens ce détail d'exception une fois que le plugin VSTO se charge. La partie intéressante est qu'il semble échouer sur la première interaction COM, qui se trouve être en train de définir une propriété Style.Font.Color.

Voici les détails d'exception:

System.Runtime.InteropServices.COMException (0x800A03EC): Exception de HRESULT: 0x800A03EC

pile de serveur trace:

Exception à relancée [ 0]:

à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)

à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & MSGDATA, le type Int32)

à Microsoft.Office.Interop.Excel.Font.set_Color (Object )

à TriQuint.DemandPlanning.Workbook.ThisWorkbook.ThisWorkbook_Startup (Object expéditeur, EventArgs e)

à Microsoft.Office.Tools.Excel.Workbook.OnStartup()

à TriQuint.DemandPlanning.Workbook.ThisWorkbook.FinishInitialization()

à Microsoft.VisualStudio.Tools.Office.EntryPointComponentBase.Microsoft (.VisualStudio.Tools.Applications.Runtime.IEntryPoint.FinishInitialization)

à Microsoft.VisualStudio.Tools.Applications.AddInAdapter.ExecutePhase (ExecutionPhases executionPhases)

à Microsoft.VisualStudio.Tools.Applications.AddInAdapter.CompleteInitialization()

à Microsoft.VisualStudio.Tools.Office.Internal.OfficeAddInAdapterBase.ExecuteEntryPointsHelper()

a-t-on jamais vu quelque chose comme ce? J'ai fait quelques validations, comme assurer les bonnes versions de .NET, VSTO Interop, Excel 2007, etc.

Merci d'avance pour tout conseil! Jim

Répondre

1

Pour potentiellement sauver les autres de la douleur de beaucoup d'heures perdues, j'ai pensé que je posterais ma solution à ceci. C'est si ridiculement simple que ça me fait repenser ma vie de développeur. Ok, pas vraiment, mais quand même ...

Donc pour ré-énoncer la fonctionnalité désirée: le but est de changer le style d'une cellule (arrière-plan, police, bordures, etc.) chaque fois qu'un utilisateur édite une cellule.

Voici le code qui fait l'affaire:

void ThisWorkbook_SheetChange(object Sh, Microsoft.Office.Interop.Excel.Range Target) 
     { 
      foreach (Excel.Range range in Target.Cells) 
      { 
       Excel.Range cellRange = range.Cells[1, 1] as Excel.Range; 

       cellRange.Borders.ColorIndex = 10; 
       cellRange.Interior.ColorIndex = 43; 
       cellRange.Font.Bold = true; 
      } 
     } 

ThisWorkbook_SheetChange est un gestionnaire d'événements de l'événement Workbook.SheetChange. Définissez simplement les propriétés de style qui existent sur l'objet Range. Ne définissez pas les propriétés de style sur l'objet Range.Style. Si vous le faites, cela modifiera le style par défaut dans Excel et entraînera également le changement de toutes les cellules qui utilisent ce style.

je l'imagine écrire de cette façon va aussi travailler, mais je n'ai pas testé sur:

void ThisWorkbook_SheetChange(object Sh, Microsoft.Office.Interop.Excel.Range Target) 
      { 
       Target.Cells.Borders.ColorIndex = 10; 
       Target.Cells.Interior.ColorIndex = 43; 
       Target.Cells.Font.Bold = true; 
      } 

Merci à code4life pour votre post sur ColorIndex. Votre info a aidé un peu.

0

Vous obtenez une palette de 56 couleurs dans Excel pour jouer avec. La palette de couleurs sera différente d'un bureau à l'autre, surtout si vous n'utilisez pas de modèle personnalisé pour baser vos feuilles de calcul (les modèles peuvent être distribués d'un ordinateur à l'autre, permettant ainsi de personnaliser les 56 couleurs sur une machine au modèle, et partagé les machines btw). Au lieu de définir la propriété Font.Color, définissez Font.ColorIndex sur un nombre compris dans cette plage. Cela devrait éliminer l'exception étant levée. Cependant, cela révélera probablement le problème suivant, à savoir que la palette de couleurs entre les machines client et votre bureau est différente. Pour résoudre ce problème, vous devez remplacer la palette de couleurs par défaut pour qu'elle corresponde à celle de votre bureau.

+0

Merci pour votre réponse. L'utilisation de Font.ColorIndex affiche cette fois la même exception pour le paramètre ColorIndex. Je suppose que c'est à cause de la deuxième question que vous mentionnez. Cependant, je ne suis pas tout à fait sûr de savoir comment remplacer la palette de couleurs. Une autre ride dans ce que j'ai découvert est que le plugin fonctionne avec une feuille blanche. Si la feuille est générée (j'utilise Aspose.Cells), l'exception est levée. – Aggnaught

Questions connexes