Pull to refresh
24
0
Алексей Лебедев @Goodwill

User

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

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity