Вызов методов, написанных на C # в Excel 2007, из формул ячеек - PullRequest
6 голосов
/ 20 августа 2009

Я использую Excel 2007. У меня есть код C #, написанный в отдельном двоичном файле. Код использует статические классы и статические методы для классов. У меня есть ссылка на DLL в моем проекте VSTO Excel Worksheet. Что мне нужно добавить или изменить, чтобы заставить это работать?

Мой код C # выглядит так:

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;
        }

Я хочу иметь возможность поместить формулу в ячейку Excel, которая выглядит следующим образом:

=FooStatistic.Statistic.Count(A1:A10)

Или что угодно.

Я видел это , но, похоже, это для нестатических классов в Excel 2003. Я не могу поверить, что интеграция уже не лучше.

Я рассмотрел множество вопросов StackOverflow по этому вопросу. Похоже, они не обеспечивают нативную интеграцию (многие говорят «Использовать библиотеку с открытым исходным кодом X»), и, к сожалению, многие из них не принимаются OP. Я не ищу «Сделать его объектом COM и вызывать его из VBA».

Итак, я ищу:

  • Excel 2007
  • код в C # DLL
  • вызов из ячейки Excel как UDF
  • встроенная интеграция

Итак, вот еще одна ссылка StackOverflow , в которой два респондента говорят:

  • Насколько я знаю, вы не можете напрямую создавать UDF в VSTO.
  • VSTO не поддерживает создание пользовательских функций Excel. Надстройки автоматизации можно создавать в .Net, и, похоже, это одобренный Microsoft способ сделать это.

Это вопрос с июня 2009 года. Верно ли это - в 2009 году вы должны представить свои компоненты .NET в качестве COM-серверов, чтобы получить вызываемые пользовательские функции для Excel?

Ответы [ 3 ]

2 голосов
/ 21 августа 2009

Если это ваши четыре требования - (1) Excel 2007, (2) код в C # DLL, (3) вызов из ячейки Excel как UDF, (4) встроенная интеграция - тогда да, это можно сделать и довольно легко. Одним из лучших руководств о том, как это сделать, является статья Эрика Картера Написание пользовательских функций для Excel в .NET .

Если вы дополнительно хотите, чтобы ваш код размещался через VSTO, то я практически уверен, что в этом случае вам необходимо использовать оболочку VBA. См. Статью Пола Стаббса Как создавать пользовательские функции Excel в управляемом коде VSTO , где он использует надстройку VBA для предоставления пользовательских функций VBA, которые в свою очередь вызывают его управляемые пользовательские функции, написанные на VSTO.

Если честно, для пользовательских функций Excel я бы просто избегал использования VSTO. VSTO - отличный дизайнер для управляемых надстроек COM, позволяющий легко добавлять элементы управления ленты и тому подобное. Но это не помогает UDF (и даже не поддерживает). Поэтому я советую создать надстройку управляемой автоматизации согласно статье Эрика Картера и отказаться от требования VSTO.

Если вы сделаете это, у вас не будет проблем, я обещаю. : -)

Mike

1 голос
/ 12 октября 2009

Хью,

Я понимаю ваше желание использовать «нативное» решение, а не «Использовать библиотеку с открытым исходным кодом X». Но даже VSTO не кажется очень «родным» для Excel.

Именно ваше требование и привело меня к разработке ExcelDna (http://exceldna.codeplex.com) после нахождения неадекватных надстроек Automation. Поддержка надстроек Automation не улучшилась в последних версиях Excel, тогда как надстройка .xll в API (который использует ExcelDna) видел обновленную поддержку в последних версиях, теперь поддерживает многопоточный пересчет и с асинхронными вызовами, поступающими в Excel 2010.

Несмотря на то, что ExcelDna является дополнительной частью для внедрения в ваше решение, вы будете довольны результатом. К сожалению, у Microsoft нет четких указаний относительно управляемых надстроек UDF или каких-либо признаков поддержки этого в VSTO, но на практике сделать это с ExcelDna легко, легко и очень хорошо.

Govert

0 голосов
/ 21 августа 2009

@ hughdbrown: просто следуйте примеру в статье Erics. Если вы это сделаете, это сработает. Нет, вы не можете использовать статический класс. создание экземпляра класса .net с помощью оболочки COM (регистрация его для com-взаимодействия).

...