Библиотека .NET с открытым исходным кодом для обработки электронных таблиц Excel  

ExcelDNA позволяет создавать и развертывать надстройки Excel с помощью C#, F# или VB .NET.

Excel-DNA — это API с открытым исходным кодом для интеграции .NET в Excel. API позволяет создавать высокопроизводительные пользовательские функции (UDF) и многое другое в собственных надстройках (.xll) для Excel. Вам не нужна никакая установка или регистрация, вся ваша надстройка может быть упакована в один .xll.

Среда выполнения Excel-DNA бесплатна для любого использования и распространяется по разрешающей лицензии с открытым исходным кодом, которая также разрешает коммерческое использование. Он разработан с использованием .NET, и пользователям необходимо установить среду выполнения .NET Framework. Код Excel и .NET интегрируются друг с другом с помощью надстройки (.xll), которая предоставляет код .NET для Excel. Вы можете писать свой код в текстовых (.dna) файлах сценариев (C#, Visual Basic или F#) или скомпилированных библиотеках .NET (.dll).

Previous Next

Начало работы с Excel-ДНК

Рекомендуемый способ установки ExcelDNA - NuGet, пожалуйста, используйте следующую команду для более быстрой установки.

Установите ExcelDNA из NuGet

 Install-Package ExcelDna.AddIn

Создание функций Excel через .NET API

ExcelDNA дает программистам C# .NET возможность создавать функции Excel с помощью C#. Вы также можете использовать атрибуты ExcelFunctionAttributes, такие как Name, Description, Category, IsHidden, IsExceptionSafe и другие. Атрибут IsMacroType изменяет параметры, используемые Excel-DNA при регистрации функции.

Как создавать и использовать функции Excel через .NET API

public class GetInfoFunctions
{
    [ExcelFunction(Description = "Returns the result of xlfGetCell.", IsMacroType = true)]
    public static object GetCell(int type_num, [ExcelArgument(AllowReference = true)] object reference)
    {
        return XlCall.Excel(XlCall.xlfGetCell, type_num, reference);
    }
    [ExcelFunction(Description = "Returns the result of xlfGetWorkspace.", IsMacroType = true)]
    public static object GetWorkspace(int type_num)
    {
        return XlCall.Excel(XlCall.xlfGetWorkspace, type_num);
    }
    [ExcelFunction(Description = "Returns the current list separator.", IsMacroType = true)]
    public static string GetListSeparator(int type_num)
    {
        object[,] workspaceSettings = (object[,])XlCall.Excel(XlCall.xlfGetWorkspace, 37);
        string listSeparator = (string)workspaceSettings[0, 4];
        return listSeparator;
    }
}

Поддержка динамических массивов

.NET API Excel-DNA с открытым исходным кодом также поддерживает использование динамических массивов внутри Excel. Когда вы пишете формулу динамического массива, она определяет, может ли формула вернуть несколько значений.

Как заставить Array & Auto изменить результат через C# API

public static object dnaMakeArrayAndResize(int rows, int columns, string unused, string unusedtoo)
        {
            object[,] result = dnaMakeArray(rows, columns);
            return ArrayResizer.dnaResize(result);
            // Can also call Resize via Excel - so if the Resize add-in is not part of this code, it should still work
            // (though calling direct is better for large arrays - it prevents extra marshaling).
            // return XlCall.Excel(XlCall.xlUDF, "Resize", result);
        }
        public static double[,] dnaMakeArrayAndResizeDoubles(int rows, int columns)
        {
            double[,] result = dnaMakeArrayDoubles(rows, columns);
            return ArrayResizer.dnaResizeDoubles(result);
        }
    }

Поддержка диагностики

API ExcelDNA позволяет разработчикам .NET использовать ведение журнала диагностики при работе с надстройкой Excel. Excel-DNA использует стандартные механизмы .NET System.Diagnostics.Trace для ведения журналов диагностики.

Предупреждения и ошибки внутри добавления

public void AutoOpen()
{
    // Log warnings and errors to the Excel-DNA LogDisplay
    Trace.Listeners.Add(new LogDisplayTraceListener());
}
...
Trace.TraceInformation("Trace information!");
Trace.TraceWarning("Trace warning!");
Trace.TraceError("Trace error!");
 Русский