On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
Dima
администратор




Пост N: 2372
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL


Ранее с Excel из Harbour ни когда не работал.
Поставили тут задачу.
У некоторых поставщиков есть определенные формы заказов.
Набраны они в Excel. Сейчас народ руками заполняет эти формы
и шлет по электронке поставщикам.
Задача сводится к тому что бы в этих формах находить
нужные коды товара и в нужной ячейке проставлять заказ.
Может ткнет кто носом с чего начать что бы не напороться на грабли.
Спасибо
Сами формы тут http://zalil.ru/33279066

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


Pasha
Администратор




Пост N: 3119
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:49. Заголовок: Я устанавливаю грани..


Я устанавливаю границы по другому:

oBorder := oCell:Borders(<nNSEW>)

где параметр - одно из значений :
xlEdgeBottom
xlEdgeLeft
xlEdgeRight
xlEdgeTop

и затем:

oBorder:LineStyle := xlContinuous
oBorder:Weight := xlThin

стиль границы конечно можно указать другой

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 3841
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:52. Заголовок: kia пишет: так не п..


kia пишет:

 цитата:
так не пробовал?
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle( xlContinuous)
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight( xlMedium)



Cпасибо , заработало вот так
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):LineStyle:=xlContinuous
oSheet:Range(osheet:cells(i,1),osheet:cells(i+3,1)):Borders(xlEdgeBottom):Weight:=xlMedium


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 3842
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.14 16:59. Заголовок: Pasha Идею понял. Т..


Pasha
Идею понял. Тоже подойдет. Спасибо !

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4124
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 14:04. Заголовок: что еще может работа..


что еще может работать в Harbour c EXCEL кроме OLE ?
Оля медленно работает.

Спасибо: 0 
Профиль
fil



Пост N: 237
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 18:41. Заголовок: ADO видимо А в чем..


ADO видимо

А в чем тормоз ?

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4125
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 21:14. Заголовок: fil пишет: А в чем ..


fil пишет:

 цитата:
А в чем тормоз ?


Ну это моё наблюдение на чисто выпуклый морской глаз.
Заполняю EXCEL форму 100 строк 10 колонок в цикле построчно.
Если заполнять DBF базу такую же ,то это происходит раз в 5 быстрее если не больше.
Реально в своей задаче я делаю выборку во временную DBF базу и затем на основании
её заполняю EXCEL форму и хорошо видно что ОЛЯ работает медленнее.
В общем то на форуме где то уже писали ОЛЯ медленный механизм.
С ADO не работал. Он умеет с EXCEL работать ?

Спасибо: 0 
Профиль
fil



Пост N: 238
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 21:56. Заголовок: А ты, небось, каждую..


А ты, небось, каждую ячейку строки отдельно заполняешь ?

ADO умеет с EXCEL работать ?

Вроде как, у Линареса посмотри

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4126
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.14 23:04. Заголовок: fil пишет: А ты, не..


fil пишет:

 цитата:
А ты, небось, каждую ячейку строки отдельно заполняешь ?


Ну типа да ;) А что не так ?

Спасибо: 0 
Профиль
fil



Пост N: 239
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.14 23:37. Заголовок: Вот поэтому и медлен..


Вот поэтому и медленно. Надо типа так

for st=1 to 100
oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st]
next

и будет шустро


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 267
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.08.14 11:12. Заголовок: fil пишет: ADO умее..



 цитата:
ADO умеет с EXCEL работать ?



Дима, привет.
Лови пример ADO

Function Read_XLS
Local cFile := 'TEST.XLS'

oConection = todbc():new("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq="+ cFile + ";DefaultDir="+GetCurrentFolder()+";")
oConection:Setsql("SELECT * FROM [ЛИСТ1$]")

if !oConection:Open()
? " Error connection "
return
endif

for n := 1 to len(oConexion:aRecordSet)
for j := 1 to len(oConection:aRecordSet[n])
do case
case valtype(oConection:aRecordSet[n][j]) == "C"
? alltrim(oConection:aRecordSet[n][j])
case valtype(oConection:aRecordSet[n][j]) == "N"
? alltrim(str(oConection:aRecordSet[n][j]))
case valtype(oConection:aRecordSet[n][j]) == "D"
? alltrim(DtoC(oConection:aRecordSet[n][j]))
case valtype(oConection:aRecordSet[n][j]) == "L"
? alltrim(oConection:aRecordSet[n][j])
end case
next
next

oConection:Close()
oConection:Destroy()
Return


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4127
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.08.14 13:13. Заголовок: Haz Спасибо. Думаеш..


Haz
Спасибо. Думаешь он быстрее будет ?
А в нем доступны вещи типа : назначить шрифт , изменить его размер , залить фон ячейки цветом , рамочки построить и т д
и тп то что доступно через Олю ?


fil пишет:

 цитата:
for st=1 to 100
oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st]
next


То есть ты заполняешь ячейки построчно с колонки А по J. А что ж тогда лежит
в элементе массива ? Ведь каждую ячейку нужно заполнить своим значением.

Спасибо: 0 
Профиль
fil



Пост N: 240
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 02.08.14 16:32. Заголовок: Каждый элемент масси..


Каждый элемент массива это инфа для ячейки
{ {1,2,3,..10}
{11,12,13...20}}

чего тут неясного ?

Если в форме много формул, желательно сначала отключить автоматический расчет (application.clculation), а потом включить и пересчитать

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4128
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.08.14 17:14. Заголовок: fil Прикольно , не ..


fil
Прикольно , не знал что так можно делать.
Проверил , работает.
Сенкс !

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 268
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.08.14 19:15. Заголовок: Dima пишет: и тп то..


Dima пишет:

 цитата:
и тп то что доступно через Олю


нет , только данные , лучший вариант предложил fil, а я просто внес альтернативу как пример

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4129
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.14 10:44. Заголовок: Haz пишет: лучший в..


Haz пишет:

 цитата:
лучший вариант предложил fil


Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 3526
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.08.14 13:56. Заголовок: Dima пишет: Да сдел..


Dima пишет:

 цитата:
Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.



А посмотреть на сам тест и пример можно ?

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4130
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.14 14:01. Заголовок: Andrey Да конечно. ..


Andrey
Да конечно.

 
Proc main
local oExcel
local oWorkBook
local oSheet
local secs:=0
local i

oExcel := CreateObject( "Excel.Application" )
IF Valtype(oExcel) == "O"
oExcel:Visible := .f.
oExcel:DisplayAlerts:=.f.
oWorkBook := oExcel:WorkBooks:Add()
oSheet := oExcel:ActiveSheet()
oSheet:Cells:Font:Name := "Arial Cyr"
oSheet:Cells:Font:Size := 12
oExcel:ActiveWindow:DisplayZeros:=.F.


secs:=seconds()
for i=1 to 1000
oSheet:Cells( i, 1 ):Value:=1
oSheet:Cells( i, 2 ):Value:=date()
oSheet:Cells( i, 3 ):Value:=time()
oSheet:Cells( i, 4 ):Value:="TEST"
oSheet:Cells( i, 5 ):Value:=1000
oSheet:Cells( i, 6 ):Value:=112345.123
oSheet:Cells( i, 7 ):Value:=dtos(date())
oSheet:Cells( i, 8 ):Value:=2
oSheet:Cells( i, 9 ):Value:=3
oSheet:Cells( i, 10 ):Value:=4
next
? seconds()-secs

secs:=seconds()
for i=1001 to 2000
oSheet:Range(osheet:cells(i,1),osheet:cells(i,10)):Value:={1,date(),;
time(),"TEST1",1000,112345.123,dtos(date()),2,3,4}
next
? seconds()-secs


wait
oExcel:Visible := .t.
ENDIF
return



PS
У меня при 1000 строках и 10 столбцах быстрее в 5 раз.
100 строк и 10 столбцов в 7 раз

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 3527
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.08.14 21:27. Заголовок: Dima пишет: Да коне..


Dima пишет:

 цитата:
Да конечно.


Спасибо БОЛЬШОЕ !

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 4146
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.08.14 15:35. Заголовок: WVT программа. Задач..


WVT программа.
Задача установить что открыт нужный лист EXCEL.
Такую проверку я сделал но почему то после проверки оказываюсь в EXCEL (оно как бы понятно почему).
а надо бы вернуться в программу. Как это правильно сделать ?
Делаю примерно так

 
do while .t.

if Start_EXCEL()
IF Valtype(oExcel) == "O"
oExcel:Visible := .f.
oExcel:DisplayAlerts:=.f.
oSheet := oExcel:ActiveSheet()
if oSheet:UsedRange:Columns:Count#15
oExcel:Visible := .t.
soob("Открыта не та книга........","r/r","gr+/r")
exit
endif



oExcel:Visible := .t.
ELSE
soob("Объект не найден.........","r/r","gr+/r")
exit
ENDIF
endif

exit
enddo


Решил пробнуть hwnd:=hb_gtInfo(HB_GTI_GETWIN) а затем Hb_gtInfo( HB_GTI_SETWIN, hwnd) ,
но hb_gtInfo(HB_GTI_GETWIN) совсем ни чего не возвращает.

Спасибо: 0 
Профиль
fil



Пост N: 241
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 08.08.14 22:30. Заголовок: Правильно ли я понял..


Правильно ли я понял, что нужно типа листнера состояния Excel ? Тогда можно сидеть на окне и по таймеру опрашиваать

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 698
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет