2017-02-21 36 views
1

Я понимаю, как это сделать на C#, и я могу создавать AddIns с помощью Excel DNA. Я не могу понять синтаксис F #, чтобы включить функцию f, которая для простоты делает что-то вроде f (x) = 2D массива измерения [2,2], содержащего x при всех 4 значениях. Поэтому я бы назвал f из excel, беря вход из ячейки, и он вернет массив 2x2. (Здесь я буду делать более сложные вещи, но если я пойму этот простой случай, все будет в порядке). Помощь очень ценится!Как написать функцию в F #, которую можно вызывать из Excel, и которая будет принимать диапазон в качестве входных данных и выводить массив в ssheet?

Моя попытка создания F # функция выглядит следующим образом:

let array2D : int [,] = Array2D.zeroCreate 20 20 
let g x = array2D 

Проблема у меня в том, что это не представляется в виде функции в раскрывающемся списке первенствовать под названием XLA.

Рабочая C# Пример:

public static double[,] arraytoexcel(int N) 
{ 
    double[,] RetArray = new double[N, N]; 
    for (int i = 0; i < N; i++) { 
     for (int j = 0; j < N; j++) { 
      RetArray[i, j] = N; 
     } 
    } 
    return RetArray; 
} 
+4

Можете ли вы сказать немного больше, где вы боретесь? На главной странице ExcelDNA есть несколько примеров F #. –

+0

спасибо, что ответили. Я очень новичок в F #. Я написал: let gx = array2D, где array2D: int [,] = Array2D.zeroCreate 20 20 как попытка получить вывод массива в excel – henjo

+1

И это не работает, потому что? .. –

ответ

2

Вы, вероятно, хотите что-то вроде этого:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need 

let mkArray size = Array2D.init size size (calculateCellContents size) 

Обратите внимание, что calculateCellContents возвращает поплавка (на F # имя для C# double), не ИНТ , Ваш пример C# имел функцию, возвращающую массив значений double, и если XLA ищет функции с этой сигнатурой (возвращающей массив поплавков), то это может быть одной из возможных причин, по которой она не появляется.

Теперь, если это не решит проблему «это не отображается как функция в выпадающем списке Excel», есть две другие возможности, о которых я думал. Во-первых, если вы должны установить атрибут функции для раскрывающегося списка Excel, чтобы найти его, то синтаксис равен [<AttributeName>]. Например:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need 

[<ExcelFunction(Description="Make a simple array")>] 
let mkArray size = Array2D.init size size (calculateCellContents size) 

Во-вторых, возможно, вам необходимо изменить тип функции. Функции F # имеют тип FSharpFunc, и вполне возможно, что XLA ищет Func, а не FSharpFunc. Вы можете конвертировать между ними путем создания нового объекта System.Func из функции F #:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need 

let mkArray size = Array2D.init size size (calculateCellContents size) 

let mkArrayVisibleFromExcel = new System.Func<int,float>(mkArray) 

Или возможно:

[<ExcelFunction(Description="Make a simple array")>] 
let mkArrayVisibleFromExcel = new System.Func<int,float>(mkArray) 

Если это не сработает, попробуйте изменить mkArray взять float аргумент, и изменение вызова Array2D.init соответственно:

let calculateCellContents sizeF x y = float y * sizeF + float x // Whatever math you need 

let mkArray (sizeF:float) = 
    Array2D.init (int sizeF) (int sizeF) (calculateCellContents sizeF) 

[<ExcelFunction(Description="Make a simple array")>] 
let mkArrayVisibleFromExcel = new System.Func<float,float>(mkArray) 

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

+0

Кстати, теперь, когда я видел [домашнюю страницу ExcelDNA] (https://excel-dna.net/) и примеры там, я думаю, что вам нужно добавить атрибут 'ExcelFunction' к вашему коду и что * может быть все, что отсутствовало. Я соответствующим образом обновлю ответ. – rmunn

+0

Атрибуты являются необязательными. Ваша начальная функция 'mkArray' имеет странную подпись - вы хотите, чтобы она была' int -> float [,] '(вычислениеCellContents не является хорошим инициализатором для Array2D.init), как и во втором фрагменте. Значение, которое вы хотите экспортировать в Excel, должно быть обычным .NET-методом, а не делегатом 'Func' или' FastFunc' (указателем функции). Поэтому все после «Второго, ...» просто вызовет путаницу. – Govert

+0

@ Govert - Спасибо за комментарий о первой функции 'mkArray': это была случайная ошибка при редактировании (у меня были все примеры, кроме первого), которые я исправил благодаря тому, что вы указали это. Что касается остальных, я никогда не использовал ExcelDNA, поэтому я просто догадываюсь о ответах. Вероятно, вы можете объяснить это лучше, чем я, поэтому я был бы признателен, если бы вы могли опубликовать свой собственный ответ, чтобы показать OP (и мне, если на то пошло), как делать то, что ожидает ExcelDNA в F #. Потому что из того, что вы сказали об этом, ожидая обычного метода .Net, я бы подумал, что исходное купе OP будет работать. – rmunn

 Смежные вопросы

  • Нет связанных вопросов^_^