2011-09-19 2 views
5

Dans un premier temps, je mis en œuvre une UDF qui appeler des méthodes Web Synchrone, mais il avait beaucoup de problèmes avec ça, surtout quand j'ai essayé de demander énorme quantité de données - En bref, Excel serait suspendu et geler jusqu'à ce que toutes les données ont été récupérées, ce qui compromet gravement l'expérience de l'utilisateur.Mettre en œuvre un fichier Excel UDF qui peut appeler des méthodes Web de manière asynchrone

Je suppose que consommer le service Web de manière synchrone est le véritable tueur ici. Donc, je me demande s'il y a un moyen que je peux le faire Asynchrone? Quelqu'un peut-il me donner quelques conseils? Tout outil ou plate-forme est plus préféré? (Personnellement, je préfère toujours utiliser C#)

+0

On dirait que le fichier udf devrait retourner deux fois pour que cela fonctionne: une fois après le coup d'envoi de l'appel Web, et encore une fois pour renvoyer le résultat quand il est arrivé. Peut-être préférable d'utiliser un événement de changement de feuille de calcul pour faire les appels à la place? –

+0

@Tim Pouvez-vous l'expliquer un peu plus en détail? Y a-t-il des exemples pour cela? – woodykiddy

Répondre

5

RTD fonctionnerait. Vous devez implémenter l'interface IRtdServer. Lorsque votre complément est démarré, Excel vous donne un pointeur de fonction. Pour chaque cellule, vous recevrez un "identifiant Excel" et une liste d'arguments. Envoyez votre demande Web asynchrone. Lorsque la réponse arrive, vous appelez la fonction notfiy qu'Excel vous a donnée. Lorsque Excel est prêt, il appelle votre méthode GetData pour obtenir les données.

Voir How do I create a real-time Excel automation add-in in C# using RtdServer? pour un exemple de procédure en C#. Une fois que vous avez compris le fonctionnement de RTD, Excel-DNA fait un bon travail d'abstraction de la plomberie COM ... fortement recommandé.

+0

Merci pour le lien. Je pense que ce serait utile. – woodykiddy

0

Je n'utilise pas C# avec Excel, juste VBA, mais j'imagine que des contraintes similaires s'appliquent. Le problème avec l'appel d'un objet distant via un fichier udf (en particulier lorsque vous le faites beaucoup) est que le classeur commence à ne plus répondre, et que vous n'avez aucun contrôle sur la façon dont le calcul se produit. Cependant, même si vous pouviez déterminer comment exécuter votre fichier uDF de manière asynchrone, cela perturberait probablement le suivi interne d'Excel sur la manière de calculer le classeur pour prendre en charge les dépendances de cellule.

Quels calculs sont effectués sur le serveur? Pourriez-vous simplement les déplacer dans un complément et ainsi améliorer les performances de l'UDF? Si vous ne pouvez pas faire cela, alors vous pouvez essayer une approche événementielle (par exemple en utilisant l'événement de changement de feuille de travail comme mentionné précédemment), mais vous avez toujours la difficulté que vous devez vous assurer que la feuille entière finit entièrement calculé, et faire cela pourrait être plus de travail que cela vaut la peine. N'oubliez pas non plus que même en mode asynchrone, il y a une limite au nombre de connexions que votre système d'exploitation peut ouvrir en une seule fois. Il n'est donc pas possible d'envoyer des dizaines de cellules simultanément ...

1

I n'ont aucune expérience avec la technologie, mais il semble que Excel RTD (données en temps réel) pourrait être une approche. Découvrez this thread liés à ExcelDNA qui décrit une approche. J'espère que cela t'aides!

0

Un excellent tutoriel avec des exemples est disponible here.

Questions connexes