Форум » [x]Harbour » Снова EXCEL » Ответить

Снова EXCEL

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

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Pasha: Я устанавливаю границы по другому: oBorder := oCell:Borders(<nNSEW>) где параметр - одно из значений : xlEdgeBottom xlEdgeLeft xlEdgeRight xlEdgeTop и затем: oBorder:LineStyle := xlContinuous oBorder:Weight := xlThin стиль границы конечно можно указать другой

Dima: 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

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


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

fil: ADO видимо А в чем тормоз ?

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

fil: А ты, небось, каждую ячейку строки отдельно заполняешь ? ADO умеет с EXCEL работать ? Вроде как, у Линареса посмотри

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

fil: Вот поэтому и медленно. Надо типа так for st=1 to 100 oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st] next и будет шустро

Haz: 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

Dima: Haz Спасибо. Думаешь он быстрее будет ? А в нем доступны вещи типа : назначить шрифт , изменить его размер , залить фон ячейки цветом , рамочки построить и т д и тп то что доступно через Олю ? fil пишет: for st=1 to 100 oExc:ActiveSheet:Range("A"+ltrim(str(st))+":J"+ltrim(str(st))):value:=массив[st] next То есть ты заполняешь ячейки построчно с колонки А по J. А что ж тогда лежит в элементе массива ? Ведь каждую ячейку нужно заполнить своим значением.

fil: Каждый элемент массива это инфа для ячейки { {1,2,3,..10} {11,12,13...20}} чего тут неясного ? Если в форме много формул, желательно сначала отключить автоматический расчет (application.clculation), а потом включить и пересчитать

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

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

Dima: Haz пишет: лучший вариант предложил fil Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.

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

Dima: Andrey Да конечно. [pre2] 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 [/pre2] PS У меня при 1000 строках и 10 столбцах быстрее в 5 раз. 100 строк и 10 столбцов в 7 раз

Andrey: Dima пишет: Да конечно. Спасибо БОЛЬШОЕ !

Dima: WVT программа. Задача установить что открыт нужный лист EXCEL. Такую проверку я сделал но почему то после проверки оказываюсь в EXCEL (оно как бы понятно почему). а надо бы вернуться в программу. Как это правильно сделать ? Делаю примерно так [pre2] 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 [/pre2] Решил пробнуть hwnd:=hb_gtInfo(HB_GTI_GETWIN) а затем Hb_gtInfo( HB_GTI_SETWIN, hwnd) , но hb_gtInfo(HB_GTI_GETWIN) совсем ни чего не возвращает.

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



полная версия страницы