26.01.2004, 14:02 | #1 |
Участник
|
формат числа в Excel (+с условием)
Hello All!
Форматирование числа в ячейке Excel из Аксапты... 1-я проблема в том, что если в Regional Options "десятичная точка" - символ запятой, то не работает формат, к примеру, "###0.00"; если же символ точки, не работает, соответственно, "###0,00". Выяснить, что у пользователя в кач-ве десятичной точки - проблематично. Не знаю, есть ли соотв. API-ф-ция. Другого рода проблема - с условным форматированием. Надо, к примеру, скрыть нули. Пишем формат "[=0]#;###0.00". Прекрасно работает c Excel 2000 (с правильно установленной дес. точкой), но возвращает ошибку в Excel XP... Версию Excel у пользователя узнать могу через .version(). Но что толку, если в самом Excel'е XP такой формат работает, а из Аксапты - нет! Знание того, русская ОС или нет, не поможет, т. к. Reg. Options можно корёжить как угодно, создавая самые дикие сочетания дес. точек, разделителей и т. п. Для работы с Excel использую COMExcelDocument_RU. Формат посылаю так: COM comRange; comRange = this.findRange(ComExcelDocument_RU::numToNameCell(col, row)); if (comRange) { try { comRange.numberFormat("#0.00"); ........... --- Waiting for an answer like a nightingale for the summer... |
|
26.01.2004, 17:37 | #2 |
Участник
|
предложение..
Решение, корявое конечно, но все же:
Определяй, если случилась ошибка - то включай другой формат.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5 |
|
27.01.2004, 11:08 | #3 |
Участник
|
Это-то понятно... Если выдаётся ошибка, такой метод работает. Но если просто вставляются неправильно сформатированные значения, а ошибки нет...
Пример: отправляю число 10000.55, вставляется что-то вроде 100.00. Такие вещи не отловишь. Разве что, вставив, тут же считать и сравнить с тем, что отослал - но файл-то ещё не сохранён - возьмётся ли значение? Да и пока хотелось бы попроще метод найти. --- Ещё 10000 вёдер, и функциональный ключик у нас в кармане... (с) Дуремар |
|
27.01.2004, 16:53 | #4 |
Участник
|
Вроде бы нашёл решение...
Делается с использованием International - свойства приложения Excel. International(3) - это как раз десятичная точка. См. помощь по VB. Пришлось, правда, использовать дополнительный класс DVP_ComExcelDocument_RU, где есть соотв. метод, и открывать пустой файл (только на время определения локальных установок). Я-то работаю с ComExcelDocument_RU, мне вышеупомянутый класс больше ни для чего не нужен (там нет других, нужных мне методов). Вот такую ф-цию накропал: #define.xlDecimalSeparator(3) // somebody, 27.01.04 // возвращает символ десятичной точки из локальных настроек (обычно точка или запятая) str decimalPointChar() { DVP_ComExcelDocument_RU dVP_ComExcelDocument_RU; str ret; ; dVP_ComExcelDocument_RU = new DVP_ComExcelDocument_RU(); dVP_ComExcelDocument_RU.newFile(""); dVP_ComExcelDocument_RU.visible(false); ret = dVP_ComExcelDocument_RU.international(#xlDecimalSeparator).bstr(); dVP_ComExcelDocument_RU.closeDocument(); return ret; } В принципе так можно вытащить любую рег. настройку. DVP_ComExcelDocument_RU возвращает m_comApplication.International(_parameter), где m_comApplication - это COM родительского класса ComOfficeDocument_RU. Видимо, можно сделать и грамотнее, чтобы не пугать пользователя появившимся на долю секунды пустым XLS-файлом (visible до инициализации, к сожалению, не вызовешь)... 2-й вариант решения - просто вбить соотв. форматы в шаблон. Но опять же - не факт, что сложный шаблон (с условиями, например) будет работать в другой версии Office или с другими рег. настройками. --- Axapta is my friend, but truth is more of value... |
|
21.04.2004, 12:32 | #5 |
Участник
|
У меня нет такого класса DVP_ComExcelDocument_RU.
?? А нельзя этот десятичный разделитель брать прямо из самой аксапты? тут же они тоже используются, а значит и определяются. |
|
21.04.2004, 13:51 | #6 |
Участник
|
PHP код:
|
|
18.05.2004, 09:12 | #7 |
Участник
|
ОГРОМНОЕ СПАСИБО
за найденное решение.
было сэкономлено несколько часов работы |
|
18.05.2004, 11:33 | #8 |
Участник
|
Функция strFmt() конвертирует число в строку, используя региональные настройки операционной системы.
PHP код:
Если надо скрыть нули, то проще вообще не посылать значение в ячейку. Нет значения - нечего отображать. |
|