Импорт данных из Excel в Сlarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Новичок
- Сообщения: 7
- Зарегистрирован: 06 Март 2008, 16:53
Импорт данных из Excel в Сlarion
Добрый день!
Подскажите пожалуйста, где ошибка в следующем программном модуле? В С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"
!============================================================
Подскажите пожалуйста, где ошибка в следующем программном модуле? В С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"
!============================================================
Re: Импорт данных из Excel в Сlarion
Вот пример программы, которая запускается и работает под 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
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
-
- Новичок
- Сообщения: 7
- Зарегистрирован: 06 Март 2008, 16:53
Re: Импорт данных из Excel в Сlarion
Спасибо за совет, да действительно работает в CW6.1, но возникла другая проблема теперь Excel.Exe "висит" в диспетчере задач.
-
- Новичок
- Сообщения: 7
- Зарегистрирован: 06 Март 2008, 16:53
Re: Импорт данных из Excel в Сlarion
Спасибо за совет, да действительно работает в CW6.1, но возникла другая проблема теперь Excel.Exe "висит" в диспетчере задач в процессах или processes. Как можно убрать средствами Clarion Excel из процессов в сеансе работы CLARпрограммы, если из проги выходишь, то процессы сами по себе исчезают? Кто с этим сталкивался подскажите?
Re: Импорт данных из Excel в Сlarion
Может лучше продолжить дискусию по теме "Как закрыть OLE-обьект" в разделе, где все начиналось. То есть, проблема остается актуальной. Правда, прошло уже 4 года, поэтому может быть кто-то уже решил эту проблему: как теперь закрыть Exel после конца работы. Прошу откликнуться.
С уважением, ABBASoft.
С уважением, ABBASoft.
Re: Импорт данных из Excel в Сlarion
Уважаемые коллеги, проблема решена! Необходимо поставить оператор XlsFEQ('Application.Quit') перед XlsFEQ('PROP:Deactivate')=true (прочитал в Интернете - работа OLE-обьектами).
Большое спасибо всем за помощь (особенно Kreator'у)!
С уважением, ABBASoft.
Большое спасибо всем за помощь (особенно Kreator'у)!
С уважением, ABBASoft.
- vea
- Бывалый
- Сообщения: 51
- Зарегистрирован: 01 Сентябрь 2005, 15:48
- Откуда: Иваново
- Контактная информация:
Re: Импорт данных из Excel в Сlarion
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". Не находит пробелы.
Вопрос именно в определении позиции пробела. В чем проблема, почему не определяет место пробела? И может можно решить другим способом?
Кстати, есть локальные переменные и есть временные, т.е. знаки # и " записаны правильно. Насколько правильно применены - не знаю...
Спасибо заранее...
Небольшой пример экселевского файла (создан в 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
-
- ✯ Ветеран ✯
- Сообщения: 5160
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Импорт данных из Excel в Сlarion
Надо, типа так: Val1 = deformat(Str1,@n12_'2). Для полноты посмотри в Хелпе Picture tokens.
We are hard at work… for you. 

- vea
- Бывалый
- Сообщения: 51
- Зарегистрирован: 01 Сентябрь 2005, 15:48
- Откуда: Иваново
- Контактная информация:
Re: Импорт данных из Excel в Сlarion
Попробовал. Вроде, хорошо, но результат не получен.
1. Ругается на Picture tokens @n12_'2. В хелп смотрел, там есть такой формат. Но..., увы...
2. Если заменить на @n_12.2, работает, но не понимает запятую, как разделитель долей в строковом значении, если Picture tokens не описывает точно размерность значения, а оно в ячейке Экселя может быть разным (и 20 000,01 и 15 000 000,37).
Попробовал Val1 = deformat(Str1). При этом убираются и пробелы и запятая, величина понимается как целая и вместе с дробной частью записывается в 12 знаков с нулями в десятичной части...
Думаю, что с точкой в разделителе дробной части, вместо запятой, было бы обработано правильно. Но, в Экселе запятая (национальный стандарт).
Вообще, заметил, что запятая в Кларионе, воспринимается как-то особо.
Например, если определять позицию ";" в строке "Сумма, руб.;235,45; и т.д.", то определяется только "Сумма", а дальше как-будто и нет ничего...
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, там нужен то ли апостроф ' вместо `, то ли наоборот ` вместо апострофа '. Символ ` это то, что на клавише Ё.
С уважением, ДП
-
- ✯ Ветеран ✯
- Сообщения: 5160
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Импорт данных из Excel в Сlarion
Да ну всё работает. ДП прав - символ, где "Ё". Я поэтому и дал ссылку на хелп, чтобы не на слово верил.
И ещё тонкий момент. Deformat'у надо подсовывать полную строку (т.е., если написано, что n12_`3, то нужно добить строку до 12 символов).
И ещё тонкий момент. Deformat'у надо подсовывать полную строку (т.е., если написано, что n12_`3, то нужно добить строку до 12 символов).
We are hard at work… for you. 

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