#c# #excel #vsto
#c# #excel #vsto
Вопрос:
У меня есть таблица:
Приложение должно распознавать формулы и обрабатывать их особым образом (например, не переопределять их). Каждая строка читается следующим образом:
object[,] formulas = (object[,])worksheet.Range["A2:C2"].Formula;
if (((string)formulas[1,3]).StartsWith("="))
{
//handle formula
}
В этом решении есть важная ошибка. Кажется, он не может «видеть» знак одинарной кавычки, то есть:
"=A1"
считывается свойством формулы как"=A1"
и распознавание работает"'=A1"
считывается свойством Formula как"=A1"
, поэтому оно распознается как формула, даже если это не так
Существует еще одно решение, которое я исследовал, явное свойство диапазона HasFormula .
if ((bool)worksheet.Range["C5"].HasFormula == true)
{
//handle formula
}
HasFormula не возвращает массив, поэтому вам нужно проверять каждую ячейку. Это имеет огромный недостаток производительности и является основной причиной, по которой я читаю целые строки, а не отдельные ячейки.
Итак, первое решение ненадежно, второе неэффективно, и теперь у меня нет вариантов.
Есть ли что-нибудь еще, что я могу попробовать?
Комментарии:
1. Может
SpecialCells
быть, иxlCellTypeFormulas
?2. Хорошо, я проверяю это. Специальные ячейки могут генерировать непрямоугольный диапазон, содержащий только ячейки, содержимое которых является формулами, и это делается одним вызовом COM. Затем я должен проверить, включена ли каждая из моих ячеек в возвращаемый диапазон SpecialCells. Это должно быть сделано без использования функций Excel, таких как Intersect, потому что это будет вызов COM для каждой ячейки, и таким образом мы вернемся к большой проблеме с производительностью. Я думаю, что это решение не очень простое, но выполнимо, я пытаюсь реализовать что-то подобное сейчас. Надеюсь, что есть лучшее решение.
Ответ №1:
Начальная одинарная кавычка — это устаревшее сокращение для перевода ячейки в текстовый режим.
Вы можете получить к ней доступ как к свойству отдельной ячейки в VBA / C с помощью метода .PrefixCharacter, который возвращает строку из одного символа или значение null, если префикс существует.
HasPrefixString = Range("B2").PrefixCharacter
C # должен иметь аналогичный метод (или лучше), чем VBA или аналогичный C .
Комментарии:
1. Это интересно, к сожалению, это невозможно сделать для диапазонов, а только по ячейкам, то есть вызов COM для каждой ячейки и большая неэффективность. Таблица, скажем, из 10 * 1000 ячеек, может быть прочитана за доли секунды в целом, в то время как чтение ячейки за ячейкой может занять до 15 секунд.