Я играл с базовой автоматизацией Excel, используя интерфейс COM, в основном используя IDispatch::Invoke
.
Мой тест включал добавление формулы в только что созданный документ Excel. Используя разработанную библиотеку-оболочку, это выглядит так:
sheet.getObject( "Range", "A1" ).set( "Value", 23 );
sheet.getObject( "Range", "A2" ).set( "Value", 42 );
sheet.getObject( "Range", "A3" ).set( "Formula", "=SUMME(A1:A2)" ); // WTF?
Обратите внимание: я использую (немецкое) локализованное имя формулы SUMME
здесь вместо идентификатора SUM
как и ожидалось. Когда вы делаете то же самое с устройством записи макросов в Excel, сгенерированный код VBA содержит SUM
, С помощью SUM
в моем коде C ++, я в конечном итоге с #NAME?
ошибка в Excel.
от Microsoft документация для Range.FormulaLocal
Имущество говорит следующее:
Возвращает или задает формулу для объекта, используя ссылки в стиле A1
на языке пользователя.
(акцент был сделан мной).
Поэтому я надеялся, что с помощью Formula
вместо FormulaLocal
Я мог бы обойти эти проблемы локализации, но, видимо, это не так.
Можно ли как-нибудь использовать нелокализованные формулы? Я предполагаю, что есть некоторые хорошо скрытые настройки.
Добавление ответа к документу, что я узнал:
Обходной путь для Formula
Чтобы установить Formula
собственность, в конечном счете, есть вызов IDispatch::Invoke
, который был реализован как
object->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT, // <-- "locale context"DISPATCH_PROPERTYPUT,
&dispparams,
NULL,
&excepinfo,
&argerr ) );
изменения LOCALE_USER_DEFAULT
в LOCALE_NEUTRAL
имеет эффект, что свойства Formula
а также FormulaLocal
начать вести себя по-другому. В моей немецкой локализованной установке Excel два вызова
sheet.getObject( "Range", "A3" ).set( "FormulaLocal", "=SUMME(A1:A2)" );
sheet.getObject( "Range", "B3" ).set( "Formula", "=SUM(A1:A2)" );
сделай то же самое сейчас.
В настоящее время это не реальное решение моей проблемы, так как я обычно ожидаю, что вещи, которые не работают, как описано в документации, будут молча ломаться за моей спиной. Доказательство: NumberFormat
а также NumberFormatLocal
делать то же самое (!), это означает, что я должен использовать локализованные коды формата даты (например, "JJJJ-MM-TT"
для ISO 8601) с обоими свойствами.
Обходной путь для NumberFormat
Чтобы создать строку формата: используйте Применение.Международная недвижимость.
Других решений пока нет …