28.04.2015, 13:23 | #1 |
Участник
|
Загрузка Excel через OXML (конвертация типов данных)
Всем привет .
Начинаю грузить выбранный файл, дело дошло до того, что я поимел нужную мне ячейку - тут вопросов нет. X++: OXMLCell_RU oxmlCell; ; oxmlCell.getValue(); Есть дата 26.03.2015, oxmlCell.getValue() мне даёт 42089. Вообще, тему можно было назвать конвертация из числа в дату)) но мне кажется, тут сама суть в oxml. Кто сталкивался, поделитесь. |
|
28.04.2015, 13:34 | #2 |
Участник
|
Стандартный способ хранения дат и времени в виде числа
Целая часть - количество дней, прошедших от некоторой фиксированной даты Дробная часть - отношение количества секунд, прошедших с полуночи к количеству секунд в сутках Если от 26.03.2015 вычесть 42089 дней, то получим дату 30.12.1899. Хотя, обычно, за точку отсчета берут дату 01.01.1900. Может быть у Вас все-таки дата 28.03.2015? Тогда конвертация в дату будет выглядеть так X++: TransDate transDate; transDate = dateNull() + oxmlCell.getValue();
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
28.04.2015, 14:08 | #3 |
Участник
|
Владимир спасибо, что разъяснил.
Но все равно странно , если в excel в ячейку вбить дату (формат ячейки дата) 25.03.2015, и указать формат ячейки общий - то число будет - 42088. dateNull() + oxmlCell.getValue() = число 27.03.2015 Конечно можно отнимать 2 дня ))) но мне кажется это не есть гуд ) |
|
28.04.2015, 14:20 | #4 |
Участник
|
Нормально это. Вы же пытаетесь выполнить конвертацию из одной системы в другую. Без констант здесь не обойтись.
Для Axapta даты меньше 01.01.1900 - не существует. А что есть "базовая дата" для Excel - не известно. Очень сложно найти информацию по системным ограничениям Excel. Как следствие, остается только подгонка через константы. Кстати, скорее всего, "базовая дата" - это все-таки 31.12.1899. А еще 1 день - это результат округления при "переводе" типа Real в строку. Я имею в виду, что в Excel хранится дата вместе со временем. И время здесь больше полудня, что при округлении дает еще один дополнительный день. Попробуйте все-таки прочитать не строковую величину, а числовую. Для проверки, настройте формат отображения в ячейке Excel, чтобы видеть еще часть со временем. Подозреваю, что реально в ячейке записано нечто вроде 42087,583333
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
29.04.2015, 06:10 | #6 |
Участник
|
Понял почему надо 2 дня отнимать. )))
1 день. datenull() - это 0, то есть первая дата 01.01.1900 будет 0 , в Excel - 1 2 день (тут интереснее) Оказалось - что в Excel 1900 год высокосный, (тут просто каждый четвертый год) Axapta берёт стандартный календарь, а там 1900 не высокосный. otvet.mail.ru - ))))) |
|
29.04.2015, 15:09 | #8 |
Участник
|
Есть еще одна подстава. Если файл был подготовлен на Apple, то там сдвиг еще на 4 года.
|
|