Импорт данных из Excel в Сlarion

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Alexey5634888
Новичок
Сообщения: 7
Зарегистрирован: 06 Март 2008, 16:53

Импорт данных из Excel в Сlarion

Сообщение Alexey5634888 »

Добрый день!

Подскажите пожалуйста, где ошибка в следующем программном модуле? В СW 5.0 работает, а в CW 6.1 не работает?
Что я делаю не так?
!============================================================
ReadFromExcel PROCEDURE ! Declare Procedure
! Start of "Data Section"
! [Priority 4000]
XlsFEQ LONG

DataQueue Queue
A String(30)
B String(30)
End
! End of "Data Section"
CODE
! Start of "Processed Code"
! [Priority 4000]
XlsFEQ = CREATE(0, CREATE:OLE) ! создали OLE-контрол
XlsFEQ{PROP:Create} = 'Excel.Application' ! сказали, что будем юзать
XlsFEQ{'Application.Workbooks.Open(''C:\mon\zakaz_ostatki\temp.xls'')'} ! открыли, полный путь
XlsFEQ{'Application.Visible'} = TRUE ! показали Excel

free(DataQueue) ! чтение в очередь
loop row#=1 to 10 ! 10 рядов или строк
DataQueue.A=XlsFEQ{'Application.Cells(' & row# & ',1).Value'} ! два столбца считываем
DataQueue.B=XlsFEQ{'Application.Cells(' & row# & ',2).Value'}
add(DataQueue)

end

loop 3 times ! уничтожили контрол
destroy(XlsFEQ)
end

! End of "Processed Code"
!============================================================
Apron63
Новичок
Сообщения: 14
Зарегистрирован: 21 Октябрь 2007, 16:42
Откуда: Самара

Re: Импорт данных из Excel в Сlarion

Сообщение Apron63 »

Вот пример программы, которая запускается и работает под C6.3 9056

www program
map
ReadFromExcel Procedure
.
code
ReadFromExcel

ReadFromExcel PROCEDURE
XlsFEQ LONG

DataQueue Queue
A String(30)
B String(30)
End
QWindow window
.
CODE
open(QWindow)! Объект OLE должен открываться в ОТКРЫТОМ ОКОШКЕ
XlsFEQ = CREATE(0, CREATE:OLE)
XlsFEQ{PROP:Create} = 'Excel.Application'
XlsFEQ{'Application.Workbooks.Open("C:\temp.xls")'} !Здесь я поставил двойные кавычки вместо одинарных
XlsFEQ{'Application.Visible'} = TRUE
free(DataQueue)
loop row#=1 to 10
DataQueue.A=XlsFEQ{'Application.Cells(' & row# & ',1).Value'}
DataQueue.B=XlsFEQ{'Application.Cells(' & row# & ',2).Value'}
add(DataQueue)
end
get(DataQueue,1)!Позиционируем на первый элемент
stop(DataQueue.A)! и отобразим его - проверка того, что действительно работает
XlsFEQ{'PROP:Deactivate'}=True ! Уничтожить сам объект-не знаю точно, нужен ли этот код, ставлю для подстраховки
loop 3 times ! А вот это правильно
destroy(XlsFEQ)
end
Alexey5634888
Новичок
Сообщения: 7
Зарегистрирован: 06 Март 2008, 16:53

Re: Импорт данных из Excel в Сlarion

Сообщение Alexey5634888 »

Спасибо за совет, да действительно работает в CW6.1, но возникла другая проблема теперь Excel.Exe "висит" в диспетчере задач.
Alexey5634888
Новичок
Сообщения: 7
Зарегистрирован: 06 Март 2008, 16:53

Re: Импорт данных из Excel в Сlarion

Сообщение Alexey5634888 »

Спасибо за совет, да действительно работает в CW6.1, но возникла другая проблема теперь Excel.Exe "висит" в диспетчере задач в процессах или processes. Как можно убрать средствами Clarion Excel из процессов в сеансе работы CLARпрограммы, если из проги выходишь, то процессы сами по себе исчезают? Кто с этим сталкивался подскажите?
ABBASoft
Активист
Сообщения: 115
Зарегистрирован: 15 Май 2006, 18:08

Re: Импорт данных из Excel в Сlarion

Сообщение ABBASoft »

Может лучше продолжить дискусию по теме "Как закрыть OLE-обьект" в разделе, где все начиналось. То есть, проблема остается актуальной. Правда, прошло уже 4 года, поэтому может быть кто-то уже решил эту проблему: как теперь закрыть Exel после конца работы. Прошу откликнуться.
С уважением, ABBASoft.
ABBASoft
Активист
Сообщения: 115
Зарегистрирован: 15 Май 2006, 18:08

Re: Импорт данных из Excel в Сlarion

Сообщение ABBASoft »

Уважаемые коллеги, проблема решена! Необходимо поставить оператор XlsFEQ('Application.Quit') перед XlsFEQ('PROP:Deactivate')=true (прочитал в Интернете - работа OLE-обьектами).
Большое спасибо всем за помощь (особенно Kreator'у)!
С уважением, ABBASoft.
Аватара пользователя
vea
Бывалый
Сообщения: 51
Зарегистрирован: 01 Сентябрь 2005, 15:48
Откуда: Иваново
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение vea »

Clarion 8.5, WinXP, LibreOffice 4.1.02.
Небольшой пример экселевского файла (создан в LibreOffice, сохранен в xls, экспортирован в csv): одна строка из 5 столбцов. Наименование, Сумма, Значение1, Значение2, Значение3.
Сумма рассчитывается по формуле и получается в формате без разделителей сотен, т.е. 25632847,93. Это сумма трех Значений.
Все три Значения имеют формат с разделителем сотен, т.е. типа: 2 504 623,85.

Решил передать эту таблицу в tps через csv. Заткнулся на передаче выделенного строкового значения str1 = "2 504 623,85" в переменную Val1 формата @n_14.2. Просто равенство Val1 = Str1 не прокатывает. Решил разделить на 3 части, определяя позиции пробела. Например, получить: 2- это t1", 504 - это t2" и 623,85 - это t3". Не находит пробелы.

Код: Выделить всё

             Tmp104 - это "2 504 623,85"                        ! выделено ранее из записи в csv
             p1# = INSTRING(' ',Tmp104,0,1)                    ! определяю место пробела после первой части значения (после "2")
             t1" = Clip(Sub(Tmp104,0+1,p1#))                  ! пытаюсь выделить первую часть значения до пробела, 
!             чтобы также выделить, затем соединить все три строковые части без пробелов и потом перевести в нужный десятичный формат 
             v104 = Format((t1" & t2" & t3"),@n_14.2)           ! примерно так думаю соединить и перевести в нужный формат Значение1, но особо не задумывался пока, т.к. не решен вопрос выделения этих 3-х частей
Вопрос именно в определении позиции пробела. В чем проблема, почему не определяет место пробела? И может можно решить другим способом?
Кстати, есть локальные переменные и есть временные, т.е. знаки # и " записаны правильно. Насколько правильно применены - не знаю...
Спасибо заранее...
С уважением, vea
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Импорт данных из Excel в Сlarion

Сообщение kreator »

Надо, типа так: Val1 = deformat(Str1,@n12_'2). Для полноты посмотри в Хелпе Picture tokens.
We are hard at work… for you. :)
Аватара пользователя
vea
Бывалый
Сообщения: 51
Зарегистрирован: 01 Сентябрь 2005, 15:48
Откуда: Иваново
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение vea »

Спасибо. Завтра попробую...
С уважением, vea
Аватара пользователя
vea
Бывалый
Сообщения: 51
Зарегистрирован: 01 Сентябрь 2005, 15:48
Откуда: Иваново
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение vea »

Попробовал. Вроде, хорошо, но результат не получен.
1. Ругается на Picture tokens @n12_'2. В хелп смотрел, там есть такой формат. Но..., увы...
2. Если заменить на @n_12.2, работает, но не понимает запятую, как разделитель долей в строковом значении, если Picture tokens не описывает точно размерность значения, а оно в ячейке Экселя может быть разным (и 20 000,01 и 15 000 000,37).
Попробовал Val1 = deformat(Str1). При этом убираются и пробелы и запятая, величина понимается как целая и вместе с дробной частью записывается в 12 знаков с нулями в десятичной части...
Думаю, что с точкой в разделителе дробной части, вместо запятой, было бы обработано правильно. Но, в Экселе запятая (национальный стандарт).
Вообще, заметил, что запятая в Кларионе, воспринимается как-то особо.
Например, если определять позицию ";" в строке "Сумма, руб.;235,45; и т.д.", то определяется только "Сумма", а дальше как-будто и нет ничего...
С уважением, vea
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение Дед Пахом »

Если я правильно помню, в хелпе неверно указан символ для формата @n12_`2, там нужен то ли апостроф ' вместо `, то ли наоборот ` вместо апострофа '. Символ ` это то, что на клавише Ё.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Импорт данных из Excel в Сlarion

Сообщение kreator »

Да ну всё работает. ДП прав - символ, где "Ё". Я поэтому и дал ссылку на хелп, чтобы не на слово верил.
И ещё тонкий момент. Deformat'у надо подсовывать полную строку (т.е., если написано, что n12_`3, то нужно добить строку до 12 символов).
We are hard at work… for you. :)
Аватара пользователя
vea
Бывалый
Сообщения: 51
Зарегистрирован: 01 Сентябрь 2005, 15:48
Откуда: Иваново
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение vea »

Я и проверял, но там апостроф, а не тильда (знак, где Ё). Завтра, не работе, еще раз посмотрю... Спасибо.
С уважением, vea
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Импорт данных из Excel в Сlarion

Сообщение Дед Пахом »

один из этих апострофов имеет наклон вправо, а другой (над Ё) влево.
С уважением, ДП
Ответить