|
![]() |
#1 |
Moderator
|
Попробуйте аналогично проверить у себя языковые настройки. Что при английском и что при русском Excel'ях выдает?
|
|
![]() |
#2 |
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(); } ![]() |
|
![]() |
#3 |
Участник
|
Цитата:
Предлагаю Antoncheg'у и всем желающим поучаствовать в небольшом эксперименте, запустив следующий маленький джобик. Разыскиваются люди, у которых в боксе будет выдано значение 2.
русский офис 2007
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
![]() |
#4 |
Moderator
|
ivas, спасибо! Значит, всё-таки, это нам не снится, а происходит наяву... угу...
Что ж, можно попробовать поразбираться дальше, померяться региональными и иными настройками. Пока же предлагаю (надеюсь, как временное решение) написанный по горячим следам статический метод для определения языка формул: X++: // Определение языка формул Excel для свойства Range.Formula // (именно Formula, а не FormulaLocal !!!) // подробности см. здесь: // [noparse]http://www.axforum.info/forums/showthread.php?p=195646#post195646[/noparse] // СПОСОБ: // помещаем в "международное" свойство формулу на русском языке // и проверяем последующую реакцию Excel // по окончании проверки удаляем временные объекты static str excelFormulaLanguage(COM _excelApplication = null) { str ret; COM workbook; COM range; COMVariant rangeText; boolean separateSession = false; ; // если сессия не передается параметром... if (! _excelApplication) { // ...то пробуем прицепиться к существующей _excelApplication = COM::getObject('Excel.Application'); // если существующей тоже нет... if (! _excelApplication) { // то создаем отдельную - кратковременную - только лишь для определения языка _excelApplication = new COM('Excel.Application'); separateSession = true; } } workbook = _excelApplication.Workbooks(); workbook = workbook.Add(); range = _excelApplication.Range('A1'); // помещаем в "международное" свойство формулу на русском языке // и проверяем последующую реакцию Excel range.NumberFormat('0'); // на всякий случай range.Formula('=СУММ(1+1)'); range.Calculate(); // на всякий случай rangeText = range.Text(); if (rangeText.bStr()=='2') // здесь ожидаются значения: #NAME? или #ИМЯ? или 2 ret = 'Russian'; else ret = 'English'; workbook.Close(false); // закрываем без сохранения нашу временную книгу if (separateSession) _excelApplication.Quit(); return ret; } |
|
![]() |
#5 |
Axapta Retail User
|
|
|
Теги |
ado, excel, экспорт |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|