16.04.2009, 17:31 | #19 |
Moderator
|
Тема, на самом деле, интересная и до конца не решенная.
В интернете ответа пока не нашёл, но нашёл достаточно подробное описание проблемы: http://www.gotdotnet.ru/Forums/Windows/107618.aspx Цитата:
Сообщение от туда
Проблема состоит в следующем. Мне надо сформировать из проекта на C# таблицу в Excel. В ней кроме данных должны присутствовать и формулы - самые простые - Сумма. Проблема в том, что в разных версиях Excel функции называются по разному - СУММ() в русской версии, и SUM() - в английской. Мне надо, чтобы выходная таблица корректно формировалась независимо от локализации Excel'я. Среди свойств ячейки (диапазона) есть Formula и FormulaLocal. Как я полагал, в свойстве FormulaLocal хранится локализованный вариант формулы ( например, СУММ(E2:E8) ), а в Formula - независимый от локализации (то есть - SUM(E2:E8) ). Но когда я присваиваю при формировании таблицы из моей программы свойству Formula нужной ячейки значение "=SUM(E2:E8)", Excel его не понимает (экспериментирую с русской версией). Понимает только "=СУММ(E2:E8)". С русской версией Excel моя программа будет работать нормально, а как быть, если на машине пользователя стоит английская версия?
.......... (вопрошающему отвечают, но, как оказывается, не совсем удачно): Используйте свойство Formula. Присваивайте ему формулу в АНГЛИЙСКОМ варианте. Пример: Range("A10").Formula = "=SUM(A1:A9)" В этом случае свойство FormulaLocal вернет правильную локализованную версию формулы: "=СУММ(A1:A9)" для русского офиса. .......... В том то и дело, что это не работает. Я это указал в начальном письме. Если я присваиваю свойству Formula значение "=SUM(A1:A9)", то в ячейке появляется сообщение "#ИМЯ?", т.е. - формула содержит нераспознанный текст. А если я пишу макрос напрямую на VBA, не через C#, то тогда все нормально. Этот глюк не изменился и после апдейта на Office XP. Вот я и задал этот вопрос - может дело еще в чем-то. X++: static void Job161_TestFormula(Args _args) { COM xlApp = new COM ('Excel.Application'); COM wbk; COM rng; COMVariant cv; ; wbk = xlApp.Workbooks(); wbk = wbk.Add(); rng = xlApp.Range('A1'); rng.Formula('=СУММ(1+1)'); cv = rng.Text(); // здесь ожидаются значения: #NAME? или #ИМЯ? или 2 box::info(cv.bStr()); wbk.Close(false); // чтобы не оставался скрытый экземпляр Excel xlApp.Quit(); } |
|