Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Ошибка в формате ячейки (Excel)


Автор: Лен 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" приводит к ошибке.

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

Автор: shurokan 6.7.2009, 15:31
а если поставить проверку и потом если нужно Replase(',','.')

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

Автор: Лен 6.7.2009, 16:13
Разобрался. Результаты следующие:
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";

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

Автор: Лен 7.7.2009, 12:37
Да, работает. Только если поменять оба - причём на всякие "левые" символы - тогда точно падает. Но если юзер такое сделает, это уже его глубокие проблемы с начальством, а не мои.

Автор: Jabmayday 31.10.2022, 03:59
Модератор: Сообщение скрыто.

Автор: Nummorn 9.2.2023, 00:26
Модератор: Сообщение скрыто.

Автор: Twininach 19.2.2023, 18:22
Модератор: Сообщение скрыто.

Автор: Aviral20 24.3.2023, 11:51
Цитата(Лен @ 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" ;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)