Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в формате ячейки (Excel), установка Range.NumberFormat 
V
    Опции темы
Лен
Дата 6.7.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Работаю с Excel через Microsoft.Office.Interop.Excel.

Возникла проблема: при вызове
Код

range.NumberFormat = decimalCellFormat; // decimalCellFormat = "0.00";

вываливается COMException с текстом "Нельзя установить свойство NumberFormat класса Range", InnerException - null. В то же время строка
Код

range.NumberFormat = "0";

отрабатывает корректно. Первый вариант (с ошибкой) должен устанавливать формат N2 для чисел, второй - N0. Строка "0.00" формируется так:
Код

string decimalCellFormat = "0" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "00";

На компе с установленной английской виндой при любых региональных настройках (NumberDecimalSeparator может быть и ".", и ",") оба варианта кода отрабатывают без ошибок - точка или запятая правильно определяются, и всё идёт без проблем. Но на компе с установленной русской виндой (в региональных настройках разделитель - точка, NumberDecimalSeparator = ".", CurrencyDecimalSeparator = ",") установка формата "0.00" приводит к ошибке.

У юзеров винды могут быть любые. Чем это лечится?

Это сообщение отредактировал(а) Лен - 6.7.2009, 14:44
PM MAIL   Вверх
shurokan
Дата 6.7.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.7.2007

Репутация: нет
Всего: нет



а если поставить проверку и потом если нужно Replase(',','.')
PM MAIL   Вверх
PashaPash
Дата 6.7.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Лен, у экселя есть странная "особеннось" - все данные ему надо отдавать в English (United States). По ссылке подробно расписано: http://msdn.microsoft.com/en-us/library/ms268748.aspx.


--------------------
PM MAIL WWW   Вверх
Лен
Дата 6.7.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Разобрался. Результаты следующие:
1) Для shurokanReplace и иже с ними делать нельзя, ибо если Excel уже бросил свой жирный COMException, то пока его не перезапустишь, он будет тебя игнорировать со всеми попытками что-то дописать в документ. (По специфике задачи - перезапускать нельзя).
2) Для PashaPash: несколькими строчками выше "на всякий пожарный" и так вызывается не один демон:
Код

        try
        {
          excel.DisplayAlerts = false;
          workbook = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
        }
        catch (COMException e)
        {
          switch (e.ErrorCode)
          {
            case COMConstants.Excel_InvalidTypeLibCulture:
              savedCulture = Thread.CurrentThread.CurrentCulture;
              Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
              excel.DisplayAlerts = false;
              workbook = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
              break;
            default:
              throw;
          }
        }
, только дело совсем не в этом, ибо юзеров много, винды у всех разные, офисы - тоже, региональные настройки - подавно.

3) На деле выяснилось следующее:
При отображении дробей (если в ячейку было передано decimal-значение) используется NumberDecimalSeparator, но при передаче Excel-ю в строке формата нужно использовать CurrencyDecimalSeparator! Т.е. изначально следовало писать так:
Код

string decimalCellFormat = "0" + CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator + "00";

PM MAIL   Вверх
PashaPash
Дата 6.7.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Лен, и работает после смены CurrencyDecimalSeparator в региональных настройках? smile


--------------------
PM MAIL WWW   Вверх
Лен
Дата 7.7.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Да, работает. Только если поменять оба - причём на всякие "левые" символы - тогда точно падает. Но если юзер такое сделает, это уже его глубокие проблемы с начальством, а не мои.
PM MAIL   Вверх
Jabmayday
Дата 31.10.2022, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.10.2022

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Nummorn
Дата 9.2.2023, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.2.2023

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Twininach
Дата 19.2.2023, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.2.2023

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Aviral20
Дата 24.3.2023, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.2.2023

Репутация: нет
Всего: нет



Цитата(Лен @ 6.7.2009,  14:42)
Работаю с Excel через Microsoft.Office.Interop.Excel.

Возникла проблема: при вызове
Код

range.NumberFormat = decimalCellFormat; // decimalCellFormat = "0.00";

вываливается COMException с текстом "Нельзя установить свойство NumberFormat класса Range", InnerException - null. В то же время строка
Код

range.NumberFormat = "0";

отрабатывает корректно. Первый вариант (с ошибкой) должен устанавливать формат N2 для чисел, второй - N0. Строка "0.00" формируется так:
Код

string decimalCellFormat = "0" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "00";

На компе с установленной английской виндой при любых региональных настройках (NumberDecimalSeparator может быть и ".", и ",") оба варианта кода отрабатывают без ошибок - точка или запятая правильно определяются, и всё идёт без проблем. Но на компе с установленной русской виндой (в региональных настройках разделитель - точка, NumberDecimalSeparator = ".", CurrencyDecimalSeparator = ",") установка формата "0.00" приводит к ошибке.

У юзеров винды могут быть любые. Чем это лечится?

The solution is to use a combination of the NumberFormat property and the CurrencyDecimalSeparator property. The code should look like this:
Код

Select allc# code
1:
range.NumberFormat =  "0" + CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator +  "00" ;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1416 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.