2009-08-20 17 views
6

Estoy usando Excel 2007. Tengo el código C# escrito en un binario por separado. El código usa clases estáticas y métodos estáticos en las clases. Tengo una referencia a la DLL en mi proyecto VSTO Excel Worksheet. ¿Qué debo agregar o modificar para que esto funcione?Métodos de llamada escritos en C# en Excel 2007 a partir de las fórmulas de celda

Mi C# código es el siguiente:

using System; 
using System.Collections.Generic; 
using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 

namespace FooStatistics 
{ 
    [ComVisible(true)] 
    public static class Statistics 
    { 
     public static int Count(Range range) 
     { 
      return range.Count; 
     } 

Quiero ser capaz de poner una fórmula en una celda de Excel que tiene este aspecto:

=FooStatistic.Statistic.Count(A1:A10) 

O lo que sea.

He visto this pero parece ser para clases no estáticas en Excel 2003. No puedo creer que la integración no sea mejor ahora.

He visto muchas preguntas de StackOverflow sobre esto. No parecen proporcionar integración nativa (muchos dicen, "Usar X biblioteca de código abierto") y, siniestramente, muchos no son aceptados por el OP. No estoy buscando, "Convertirlo en un objeto COM y llamarlo desde VBA".

Así que estoy buscando:

  • Excel código 2007
  • en C# DLL
  • llamada de celda de Excel como UDF
  • integración nativa

Así que aquí es another StackOverflow link, en el que dos respondedores dicen:

  • Hasta donde yo sé, no puede crear UDF directamente en VSTO.
  • VSTO no tiene soporte para crear UDF de Excel. Los complementos de automatización se pueden crear en .Net, y parecen ser la forma aprobada por Microsoft de hacerlo.

Esta es una pregunta de junio de 2009. ¿Es esto cierto - en el año 2009 tiene que exponer a sus componentes .NET como servidores COM para obtener UDF que se puede llamar para Excel?

Respuesta

2

Si estos son sus cuatro requisitos: (1) Excel 2007, (2) código en C# DLL, (3) llamada desde la celda de Excel como UDF, (4) integración nativa - entonces, sí, esto puede ser hecho, y bastante fácil. Uno de los mejores tutoriales sobre cómo hacer esto es el artículo de Eric Carter Writing user defined functions for Excel in .NET.

Si además desea que su código se aloje a través de VSTO, entonces estoy casi seguro de que debe usar un contenedor VBA en este caso. Consulte el artículo de Paul Stubbs How to create Excel UDFs in VSTO managed code donde usa un complemento de VBA para exponer las UDF de VBA, que a su vez llaman a sus UDF administradas escritas en VSTO.

Para ser sincero, para las UDF de Excel, simplemente evitaría el uso de VSTO. VSTO es un gran diseñador para complementos COM administrados, lo que le permite agregar fácilmente controles Ribbon y similares. Pero no es de ayuda para las UDF (y, de hecho, ni siquiera lo admite). Así que mi consejo es crear un complemento de automatización administrada, como por ejemplo Eric Carter's article, y eliminar el requisito de VSTO.

Si haces esto, no tendrás problemas, lo prometo.:-)

Mike

+0

Huh. Estoy pasando por todas las etapas del desarrollo de software: ira, negación, negociación, depresión y aceptación. – hughdbrown

+0

Entonces, cuando hago todo esto, recibo una advertencia en tiempo de compilación "... no contiene ningún tipo que pueda registrarse para COM Interop". Sospecho que esto es porque he usado una clase estática con métodos estáticos. ¿* Necesito * tener una clase pública no estática? O se trata de otra cosa? – hughdbrown

+0

Así puedo hacer que esto funcione, siempre que no utilice clases estáticas ni métodos estáticos. Termino con un objeto falso que no tiene propiedades o métodos reales pero al que puedo llamar. Suspiro. – hughdbrown

0

@ hughdbrown: sólo tiene que seguir el ejemplo en el artículo Eric. Si lo haces, funcionará. No, no puede usar la clase estática. instalando una clase .net con un contenedor COM (registrándolo para interoperabilidad de com).

1

Hugh,

entiendo su deseo de una solución de 'nativo', en lugar de "biblioteca de código abierto Uso X". Pero incluso VSTO no parece muy "nativo" para Excel.

Su requisito es exactamente lo que me llevó a desarrollar ExcelDna (http://exceldna.codeplex.com) después de encontrar los complementos de Automatización inadecuados. El soporte para complementos de automatización no ha mejorado en versiones recientes de Excel, mientras que la API de complemento .xll (que utiliza ExcelDna) ha visto soporte actualizado en versiones recientes, ahora admite el recálculo de subprocesos múltiples y con llamadas asíncronas en Excel 2010.

aunque ExcelDna es una parte adicional de introducir en su solución, usted estará satisfecho con el resultado. Lamentablemente, no ha habido una dirección clara de Microsoft sobre complementos de UDF administrados, ni ninguna señal de soporte para esto en VSTO, pero en la práctica hacerlo con ExcelDna es fácil, liviano y funciona muy bien.

Govert

+0

Me gusta ExcelDNA de la breve mirada que he tenido. El único problema es que el cliente quiere proteger su fuente. No me imagino que poner fuente en archivos .DNA para que todos lo lean sería aceptable. – hughdbrown

+0

Aquí hay un hilo convergente: http://stackoverflow.com/questions/1363171/vb-net-com-server-code-way-slower-than-excel-vba-code. Mi comentario fue: Su código fuente UDF puede estar en el archivo de texto .dna o en un archivo .NET externo .NET compilado. El tutorial Getting Started muestra cómo hacer referencia a una biblioteca externa. Si desea proteger su código, tiene los problemas habituales de ofuscación de .NET, y recomendaría al menos algo como DotFuscator. Pero esto no es diferente entre ExcelDna y otras soluciones .Net. – Govert

Cuestiones relacionadas