Как проверить выражение Excel программно
Я занимался разработкой приложения, одним из направлений которого является предоставление пользователю страницы, на которой можно написать математическое выражение в EXCEL WAY.
Это приложение в ASP.NET MVC, и оно использует библиотеку SpreadSheetGear для ВЫПОЛНЕНИЯ выражения Excel.
Как показано ниже, на странице есть текстовое поле для написания выражения и две кнопки справа. Зеленый - для подтверждения выражения, а красный - для чистой текстовой области.
A,B,C - это параметр, который приложение заменит на значения. Обратите внимание, что невозможно узнать тип данных параметра. Я имею в виду, что если я пишу объединенную функцию, необходимо, чтобы пользователь использовал двойные кавычки (") для разделения строки. Например, CONCATENATE("A","B"), таким образом, необходимо, чтобы пользователь ЗНАЛ параметры функций и их коррелирующие данные. типы.
Моя главная проблема заключается в том, как проверить выражение? SpreadSheetGear нет никакого метода для выполнения этой проверки.
Метод spreadsheetgear обеспечивает выполнение формулы:
string formula = "{formula from textarea}"
worksheet.EvaluateValue(formula)
и это ожидание и строка.
Поскольку я не знаю, какую формулу пользователь напишет, или сколько параметров имеет эта формула, и каков тип данных параметров, это довольно сложно проверить.
Теперь мой вопрос?
Как я могу проверить выражение?
Я думаю, в качестве альтернативы: предоставить пользователю и страницу с текстовым полем для каждого параметра в выражении. Пользователь сможет предоставить некоторые данные и подтвердить РЕЗУЛЬТАТ формулы. Если синтаксис формулы неверен, приложение выдает исключение.
Это было бы хорошим решением, но для каждого "ПРОЦЕССА", с которым пользователь будет взаимодействовать, он напишет 10, 15 формул, и, возможно, это будет немного болезненно.
Кто-нибудь может дать мне хорошее решение для этого?
Спасибо!
2 ответа
https://sites.google.com/site/akshatsharma80/home/data-structures/validate-an-arithmetic-expression
обратитесь на этот сайт для проверки
Это очень поздний ответ, но я некоторое время работал над оценщиками выражений в Excel с VBA, и я мог бы пролить немного света. У меня есть три решения, но у всех есть ограничения.
1) Попросите пользователя поставить "$" после имени переменной для обозначения строки (или другого уникального символа). Недостатком является то, что это не так просто, как набрать одну букву для переменной.
2) Предположим, что все введенные переменные имеют двойную точность. Затем измените переменную на строки во всех комбинациях, пока не сработает одна комбинация. Испытание всех комбинаций может занять очень много времени, если пользователь вводит множество отдельных переменных.
3) Предположим, что все введенные переменные имеют двойную точность. Но тогда есть список в вашей программе функций, которые требуют строки для параметров. Затем вы можете проанализировать выражение, найти функции в вашем списке и затем назначить параметры, требующие ввода строки, с помощью строкового обозначения (как в шаге 1). Это не будет учитывать пользовательские функции.
Теперь, чтобы проверить функцию, замените все числовые переменные на "1" и все строковые переменные на "a", затем EvaluateValue. Если вы получите результат или ошибку, означающую ошибку вычисления, это хорошо.
Кстати, чтобы разобрать выражение, я предлагаю следующий метод. Я не знаю C#, только VB, поэтому я буду говорить только в общих чертах.
1) Возьмите строку выражения и выполните поиск и замену всех типичных операторов тем же оператором, но с обратной косой чертой ("\"
) перед оператором и позади него (при желании вы можете использовать любой другой символ, который обычно не используется в формулах Excel). Это разграничит эти операторы, так что вы сможете легко их игнорировать и разбить свое выражение на куски. Как правило, нужно только выделить +, -, /, *, ^,<,>, = и {запятая}. Так что ищите "+"
и заменить его на "\+\"
и так далее. В скобках заменить "("
а также ")"
с "(\\"
а также "\\)"
соответственно.
Итак, ваш образец формулы "SUM(A, SQRT(B, C)) * PI()"
будет выглядеть так: "SUM(\\A\,\ SQRT(\\B\,\ C\\)\\) \*\ PI(\\\\)"
Вы также можете очистить строку немного больше, исключив пробелы и удалив избыточные обратные слэши, заменив каждые три последовательных обратных слэша одним (замените "\\" на "\").
2) В Visual Basic есть команда Split, которая может взять строку, подобную этой, и разделить ее на одномерный массив с помощью разделителя (в данном случае, обратной косой черты). В C# должен быть эквивалент, или вы можете просто сделать его. Ваш массив будет выглядеть так: "SUM(", "", "A", ",", "SQRT(", "", "B", etc.
Теперь итерируйте ваш массив, начиная с первого элемента, а затем пропуская каждый второй элемент. Этими элементами будут либо число (числовой тест), переменная, функция (с "("
в конце) скобка или пробел.
Теперь вы можете выполнять другие проверки по мере необходимости и заменять переменные фактическими значениями.
3) Когда вы закончите, объедините массив обратно в строку без разделителей и попробуйте функцию Evaluate.