|
v7: Йоксель.КонвертерВТаблицуЗначений портит числовые значения | ☑ | ||
---|---|---|---|---|
0
АЛьФ
04.01.21
✎
17:25
|
Вроде как много лет пользуемся Йоксель.КонвертерВТаблицуЗначений для загрузки из Excel. Но тут обнаружилось, что для некоторых файлов, в некоторых ячейках возвращает странно преобразованные числа.
Например, есть отчет, выгруженных из восьмерки в xls, мы его загружаем с помощью компоненты 7.7 и вместо суммы "12345,67" неожиданно видим "12345,66999999999999". Пытался пофиксить округлением, но это очень некрасиво. Кто-нибудь сталкивался? Как решить? На родном форуме Йоксель подобную проблему не нашел. И, к сожалению, искать там помощи похоже бесполезно, ветки годами висят без ответа. |
|||
1
DJ Anthon
04.01.21
✎
21:54
|
Не знаю, я любые числовые данные при расчетах в 1Ске округляю. Даже сложению не доверяю.
|
|||
2
Злопчинский
04.01.21
✎
23:33
|
1. убедиться что в отчете Экселя в ячейке ЗНАЧЕНИЕ именно .67, а не форматное отображение с двумя знаками после запятой
2. смириться. 3. формировать в экселе значения не числами, а строками . я как-то достаточно часто йокселем гружу, на такое не напарывался. или может везло... ну и версия йокселя какая, на всяк случай |
|||
3
АЛьФ
05.01.21
✎
09:08
|
2(2)
1. Первым делом убедился. 2. Это не наш путь. 3. В принципе помогает, но это надо будет предварительно шерстить все входящие файлы. Не вариант :( Версия Йокселя последняя - 1.1.27 |
|||
4
Salimbek
05.01.21
✎
09:20
|
(3) Типа на это наступили?
https://habr.com/ru/post/337260/ Если да, то без округления никак. З.Ы. При написании курсовой на ТурбоПаскале напоролся как-то, что pi/2-pi/2<>0 |
|||
5
АЛьФ
05.01.21
✎
12:30
|
Чтобы не создавать новую тему попробую тут продолжить.
Решил переделать на запрос к файлу xls. Получается примерно такой код: База = СоздатьОбъект("ODBCDatabase"); Если База.Соединение("DRIVER=Microsoft Excel Driver (*.xls); DBQ=" + СокрЛП(ИмяФайла) + ";") = 0 Тогда Сообщить("Ошибка открытия файла"); Возврат 0; КонецЕсли; RecordSetXLS =СоздатьОбъект("ODBCRecordSet"); RecordSetXLS.УстБД(База); ТекстЗапроса = "SELECT * FROM [" + ИмяПервогоЛиста + "]"; RecordSetXLS.Отладка(1); тзРезультат = RecordSetXLS.ВыполнитьИнструкцию(ТекстЗапроса); Естественно, в колонках данные разнотипные. И если в колонке сначала идет текстовое значение, а потом числовое, то числовое тупо получается пустым. Можно как-то типизировать эту выборку? Или сделать CAST выбираемым значениям? Пробовал для начала вот так: SELECT CAST([F1] AS VARCHAR(100)),CAST([F2] AS VARCHAR(100)),CAST([F3] AS VARCHAR(100)),CAST([F4] AS VARCHAR(100)),CAST([F5] AS VARCHAR(100)),CAST([F6] AS VARCHAR(100)) FROM [Sheet1$] Получил ошибку: State 42000, native 4294964196, message [Microsoft][Драйвер ODBC Excel] Ошибка синтаксиса (пропущен оператор) в выражении запроса 'CAST([F1] AS VARCHAR(100))'. |
|||
6
mistеr
05.01.21
✎
12:51
|
(2) 4. Перейти наконец на нормальные форматы для транспорта данных, вместо гребаного Экселя.
|
|||
7
АЛьФ
05.01.21
✎
12:56
|
2(6) Гениально! И как это я раньше-то не додумался?! Осталось поставить об этом в известность китайцев и финнов, который нам 10 лет вообще в PDF слали.
|
|||
8
mistеr
05.01.21
✎
13:05
|
(7) >отчет, выгруженных из восьмерки в xls
О, постановка расширяется по ходу пьесы. Ну, хотя бы попросите китайцев в xlsx выгружать. |
|||
9
Salimbek
05.01.21
✎
13:10
|
(5) Тут: https://stackoverflow.com/questions/10587993/cast-or-convert-in-excel-query
советуют Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"; |
|||
10
АЛьФ
05.01.21
✎
13:11
|
2(9) Спасибо.
|
|||
11
АЛьФ
05.01.21
✎
13:12
|
2(8) А, точно! Надо еще 1С и Сбер поставить в известность о принятом решении. Пусть поправят у себя.
|
|||
12
Salimbek
05.01.21
✎
13:13
|
+(8) А тут: https://stackoverflow.com/questions/4900418/cast-a-data-type-with-the-odbc-excel-driver
советуют для вашего драйвера так: Try: rs.Open("SELECT CStr([Code]), Description FROM [sheet1$]", sconn) Cast is not available in Jet/ACE SQL. |
|||
13
Salimbek
05.01.21
✎
13:14
|
||||
14
АЛьФ
05.01.21
✎
13:32
|
2(12) И еще раз спасибо.
Пишет: "Недопустимое использование Null". ISNULL не удалось туда вписать. Еще одна проблема нарисовалась. "DRIVER=Microsoft Excel Driver (*.xls);" не воспринимает "HDR=NO;" и постоянно по первой строке именует колонки. Пока это проблем не создает, но в общем решении это будет проблемой :( |
|||
15
Salimbek
05.01.21
✎
13:42
|
(14) А так? IIF(IsNull(Value),0,CStr(Value))
|
|||
16
Злопчинский
05.01.21
✎
13:51
|
(7) Ты их заборол и начали слать в экселе!? ;-)
|
|||
17
Злопчинский
05.01.21
✎
13:52
|
А нельзя тупо из экселя не запросом а через объект эксель? и тащить не value, а text?
|
|||
18
АЛьФ
05.01.21
✎
14:00
|
2(15) Ошибку выдавать перестало, но все равно числовые данные пустыми выдает.
Подсказка в (9) натолкнула на мысль. Числовые данные получил, но пропали некоторые текстовые... Ы... :) |
|||
19
АЛьФ
05.01.21
✎
14:01
|
2(17) Можно. А потом что? До безалкогольного пива и резиновой женщины скатимся?
|
|||
20
Djelf
05.01.21
✎
14:08
|
(0) Да есть тема на сайте Йокселя: http://yoksel.net.ru/forum/topic.php?id=171
А в чем проблема типизировать ТЗ через УстановитьПараметрыКолонки? Со сложным форматированием так не получится, но с ним и КонвертерВТаблицуЗначений в принципе бесполезен... |
|||
21
АЛьФ
05.01.21
✎
14:20
|
2(20) Спасибо. Сложность в том, что в общем случае неизвестно какая там размерность у числа.
|
|||
22
АЛьФ
05.01.21
✎
14:39
|
Всем огромное спасибо. Поставил округление и пусть весь мир подождет.
|
|||
23
alyuev
05.01.21
✎
15:40
|
А если через ВК OLEExSup грузить в ТЗ?
OLEExSup=СоздатьОбъект("OLEExSup"); Массив = СоздатьОбъект("OleSafeArray"); ... Область = Лист.Range(Лист.Cells(НомерПервойСтроки,НомерПервойКолонки), Лист.Cells(ПослСтрока,ПослКолонка)); Массив=OLEExSup.ПолучитьСвойство(Область,"Value"); Для нСтроки=Массив.GetLBound(1) По Массив.GetUBound(1) Цикл Для нКолонки=Массив.GetLBound(2) По Массив.GetUBound(2) Цикл ЗнЯч=Массив.GetValue(нСтроки,нКолонки); ТЗ.УстановитьЗначение(нСтроки,нКолонки,ЗнЯч); КонецЦикла; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |