C # SpreadSheetGear: #NAME?как текст, если формула применяется к ячейке - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь получить текст в ячейке через библиотеку электронных таблиц.

Существует формула, примененная к столбцу C1 =GETURL(I2), и он оценивает текст, который выглядит примерно так: "https://loremipsum.com/2345/view"

У меня есть другой столбец C2 с формулой, которая выводит'View' as Text

=HYPERLINK(CONCATENATE("https://loremipsum.com/",[@[Customer CID]],"/view"), "View")

Теперь, когда я пытаюсь получить текст с помощью кода C # для ячеек в столбце C2, я получаю "View", когда запускаю приведенный ниже оператор и "#Name?" Дляячеек в столбце C1.

worksheet.Cells[i, j].Text; //Outputs = "#NAME?"

Я пытался использовать =TEXT(GETURL(I2), "") в Excel, но он по-прежнему выводит #Name! Я также пытался сделать worksheet.Cells[i, j].Value //Output = Name

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

Function GETURL(cell As Range, Optional default_value As Variant)
  With cell.Range("A1")
    If .Hyperlinks.Count = 1 Then
      GETURL = .Hyperlinks(1).Address
    Else
      If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
        Dim indexFirstArgument As Long: indexFirstArgument = InStr(.Formula, "(") + 1
        GETURL = Application.Evaluate(Mid$(.Formula, indexFirstArgument, InStrRev(.Formula, ",") - indexFirstArgument))
      Else
        GETURL = default_value
      End If
    End If
  End With
End Function

1 Ответ

0 голосов
/ 12 июня 2018

Что касается стороны SpreadsheetGear, обратите внимание, что SpreadsheetGear не может выполнять код VBA (хотя он сохраняет VBA в существующих файлах XLS или XLSM).SpreadsheetGear поддерживает добавление ваших собственных пользовательских функций, но вы должны реализовать это через SpreadsheetGear. CustomFunctions API в вашем приложении .NET.Если пользовательская функция недоступна, SpreadsheetGear вернет #NAME!ошибки, когда он сталкивался с такими функциями, как GETURL, и я подозреваю, что это именно то, что происходит в вашем случае.

Чтобы реализовать пользовательскую функцию в SpreadsheetGear, вы в основном должны создать подкласс класса Function ипереопределите его Evaluate (...) метод, который вызывается всякий раз, когда SpreadsheetGear встречает вашу пользовательскую функцию в формуле.В документе есть образцы, но вы также можете найти полностью работающий образец ASP.NET здесь:

https://www.spreadsheetgear.com/support/samples/asp.net.sample.aspx?sample=customfunctions

ВАЖНО : пользовательские функции SpreadsheetGear имеют рядправила, которые вы должны соблюдать.Я настоятельно рекомендую ознакомиться с этими правилами, изложенными в разделе «Замечания» документации по методу Function.Evaluate (...), приведенному в приведенной выше ссылке.Одно из этих правил заключается в том, что весь доступ к ячейкам должен осуществляться через аргументы, предоставленные для Evaluate (...) через IArguments параметр .

Ваша функция GETURL, по-видимому, обращается к Range, ее коллекции гиперссылок, а также к Формуле и т. Д. Подобные действия недопустимы в API пользовательских функций SpreadsheetGear.Все, к чему у вас будет доступ, - это то, что предоставляется IArguments , который в случае передачи диапазона в вашу пользовательскую функцию будет лежать в основе вычисленных значений этих ячеек.Другими словами, ваша функция GETURL, как она реализована выше, не будет работать, перенесенная в пользовательскую функцию SpreadsheetGear.Вам нужно будет обновить его так, чтобы вы не обращались к IRange / IRange.Hyperlinks / etc.

...