• Разбираем и вычисляем формулы MS Excel
    +3
    Да, Вы правы, ширина меряется в «символах». В спецификации OpenXML приведен алгоритм пересчета.
    По поводу локализации имен функции есть ответ чуть выше.
  • Разбираем и вычисляем формулы MS Excel
    +3
    Мы не используем сторонние утилиты для проверки вычислений. Мы сравниваем результаты расчета каждой ячейки со значением, прочитанным из исходного файла. Большинство этих файлов рассчитано и записано Excel'ем. Встречались файлы с неверными значениями, но их было не много. Все такие файлы мы проверяли вручную и добавляли при необходимости исключения, чтобы в следующий раз конкретная ячейка не проверялась.
  • Разбираем и вычисляем формулы MS Excel
    +3
    Это название опять же из документации по xls. Там, правда, в основном используется сокращение Ptg.
  • Разбираем и вычисляем формулы MS Excel
    +4
    Большая часть этой информации получена в ходе изучения документации по бинарному формату xls. В него выражения записываются в RPN.
  • Разбираем и вычисляем формулы MS Excel
    +3
    Количество преобразований типов данных в формуле — не критичный параметр с точки зрения производительности. Самая большая потеря производительности происходит при вычислении функций, просматривающих большой диапазон ячеек(например, LOOKUP, SUMIF и т.д.) — их периодически пробуем ускорить.
    Из общего набора файлов выделили те, что содержат большое количество формул. На этих файлах ежедневно запускается анализ производительности. По результатам делаем выводы.
    Кроме тестов на вычисление тестируем построение дерева зависимостей между ячейками, импорт файлов, конвертируем документ из одного формата в другой. Тестируем записанные нами файлы при помощи Excel и сторонних утилит.
    Все это делается одним приложением, которое запускается на тестовой ферме с разными параметрами.
  • Разбираем и вычисляем формулы MS Excel
    +3
    Да, именованные формулы тоже поддерживаются.
  • Разбираем и вычисляем формулы MS Excel
    +4
    При установке текущей локали в настройках контрола мы заполняем словарики с локализованными именами функций и ошибок.
    А так же берем текущие ListSeparator и DecimalSeparator.
    Сканер и парсер изначально настроены на дефолтные настройки. При инициализации сканера подсовываем разделители в карту начальных состояний и в читающий автомат.
    Парсер на этапе разбора выражения выделяет имена функций и по имени ищет экземпляр класса функции в локализованном списке. В модели данных хранится не уже не имя функции, а ее код. При необходимости построить выражение в строку из RPN, имя функции берется из локализованного словаря уже по коду.
    На данный момент есть локализации имен функций и ошибок для 20 языков. Если контрол еще не переведен на нужный язык, пользователи пользуются сервисом localization.devexpress.com, где могут добавить собственный перевод.
  • Разбираем и вычисляем формулы MS Excel
    +3
    Мы как раз сейчас занимаемся улучшением этого механизма.
    Зависимости между диапазонами ячеек хранятся в нескольких R-деревьях(для каждого листа), а так же дополнительных деревьях для отдельных ячеек.
    При изменении значения ячейки находим по дереву и помечаем на вычисление все зависимые. В памяти так же хранится последовательность ячеек, содержащих формулы. Эта последовательность может меняться при вычислении и со временем приобретает упорядоченный вид(каждая ячейка зависит только от уже посчитанных предыдущих). Во время вычисления отслеживаем перемещения ячейки по списку. Если ячейке пришлось переместиться более одного раза — то в этой ячейке содержится циклическая ссылка. Такие ячейки пропускаем и считаем дальше до конца списка. Затем, если включены итеративные вычисления, отдельно считаем все выделенные ячейки требуемое количество раз.
    Возможно со временем напишу отдельную статью про это — там много интересного, на мой взгляд.