Автор | Сообщение |
Dima
|
| |
Пост N: 2372
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL
Ранее с 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
|
| Администратор
|
Пост N: 3119
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.14 16:49. Заголовок: Я устанавливаю грани..
Я устанавливаю границы по другому: oBorder := oCell:Borders(<nNSEW>) где параметр - одно из значений : xlEdgeBottom xlEdgeLeft xlEdgeRight xlEdgeTop и затем: oBorder:LineStyle := xlContinuous oBorder:Weight := xlThin стиль границы конечно можно указать другой
|
|
|
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
|
|
|
Dima
|
| |
Пост N: 3842
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.02.14 16:59. Заголовок: Pasha Идею понял. Т..
Pasha Идею понял. Тоже подойдет. Спасибо !
|
|
|
Dima
|
| |
Пост N: 4124
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.08.14 14:04. Заголовок: что еще может работа..
что еще может работать в Harbour c EXCEL кроме OLE ? Оля медленно работает.
|
|
|
fil
|
| |
Пост N: 237
Зарегистрирован: 17.06.10
|
|
Отправлено: 01.08.14 18:41. Заголовок: ADO видимо А в чем..
ADO видимо А в чем тормоз ?
|
|
|
Dima
|
| |
Пост N: 4125
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.08.14 21:14. Заголовок: fil пишет: А в чем ..
fil пишет: Ну это моё наблюдение на чисто выпуклый морской глаз. Заполняю EXCEL форму 100 строк 10 колонок в цикле построчно. Если заполнять DBF базу такую же ,то это происходит раз в 5 быстрее если не больше. Реально в своей задаче я делаю выборку во временную DBF базу и затем на основании её заполняю EXCEL форму и хорошо видно что ОЛЯ работает медленнее. В общем то на форуме где то уже писали ОЛЯ медленный механизм. С ADO не работал. Он умеет с EXCEL работать ?
|
|
|
fil
|
| |
Пост N: 238
Зарегистрирован: 17.06.10
|
|
Отправлено: 01.08.14 21:56. Заголовок: А ты, небось, каждую..
А ты, небось, каждую ячейку строки отдельно заполняешь ? ADO умеет с EXCEL работать ? Вроде как, у Линареса посмотри
|
|
|
Dima
|
| |
Пост N: 4126
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.08.14 23:04. Заголовок: fil пишет: А ты, не..
fil пишет: цитата: | А ты, небось, каждую ячейку строки отдельно заполняешь ? |
| Ну типа да ;) А что не так ?
|
|
|
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 и будет шустро
|
|
|
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
|
|
|
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. А что ж тогда лежит в элементе массива ? Ведь каждую ячейку нужно заполнить своим значением.
|
|
|
|
fil
|
| |
Пост N: 240
Зарегистрирован: 17.06.10
|
|
Отправлено: 02.08.14 16:32. Заголовок: Каждый элемент масси..
Каждый элемент массива это инфа для ячейки { {1,2,3,..10} {11,12,13...20}} чего тут неясного ? Если в форме много формул, желательно сначала отключить автоматический расчет (application.clculation), а потом включить и пересчитать
|
|
|
Dima
|
| |
Пост N: 4128
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.08.14 17:14. Заголовок: fil Прикольно , не ..
fil Прикольно , не знал что так можно делать. Проверил , работает. Сенкс !
|
|
|
Haz
|
| |
Пост N: 268
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.08.14 19:15. Заголовок: Dima пишет: и тп то..
Dima пишет: цитата: | и тп то что доступно через Олю |
| нет , только данные , лучший вариант предложил fil, а я просто внес альтернативу как пример
|
|
|
Dima
|
| |
Пост N: 4129
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.08.14 10:44. Заголовок: Haz пишет: лучший в..
Haz пишет: цитата: | лучший вариант предложил fil |
| Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 3526
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.08.14 13:56. Заголовок: Dima пишет: Да сдел..
Dima пишет: цитата: | Да сделал тестовый пример , по его методе скорость выше примерно в 5-6 раз. |
| А посмотреть на сам тест и пример можно ?
|
|
|
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 раз
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 3527
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.08.14 21:27. Заголовок: Dima пишет: Да коне..
Dima пишет: Спасибо БОЛЬШОЕ !
|
|
|
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) совсем ни чего не возвращает.
|
|
|
fil
|
| |
Пост N: 241
Зарегистрирован: 17.06.10
|
|
Отправлено: 08.08.14 22:30. Заголовок: Правильно ли я понял..
Правильно ли я понял, что нужно типа листнера состояния Excel ? Тогда можно сидеть на окне и по таймеру опрашиваать
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|