Форум » [x]Harbour » Снова EXCEL » Ответить
Снова EXCEL
Dima: Ранее с Excel из Harbour ни когда не работал. Поставили тут задачу. У некоторых поставщиков есть определенные формы заказов. Набраны они в Excel. Сейчас народ руками заполняет эти формы и шлет по электронке поставщикам. Задача сводится к тому что бы в этих формах находить нужные коды товара и в нужной ячейке проставлять заказ. Может ткнет кто носом с чего начать что бы не напороться на грабли. Спасибо Сами формы тут http://zalil.ru/33279066
Dima: Пока что интересует: поиск в определенной колонке c определенной строки
Pasha: Да никаких особенных граблей быть не может. Примерно так: [pre]Local oExcel := Win_OleAuto():New( "Excel.Application" ) Local oBook, oSheet, oCell, xValue Local nRow := 3 Local nCol := 3, nCol2 := 5 oExcel:Visible := .f. oExcel:Workbooks:Open( cFile, 0 ) oBook := oDoc:ActiveWorkBook oSheet := oExcel:ActiveSheet while .t. oCell := oSheet( nRow, nCol ) xValue := oRange:Value if Empty(xValue) exit endif if xValue == <Kod> oSheet( nRow, nCol2 ):Value := <Zakaz> endif enddo ... oBook:Close(.f.) oExcel:Quit() [/pre]
Andrey: Dima пишет: Пока что интересует: поиск в определенной колонке c определенной строки Форма жестко задана ? Т.е. нужно найти (например: 001/001) и в ячейку "К-во (кг)" написать тебе нужную цифру ?
fil: 1. Определяем для Excel-файла ширину/высоту рабочего ранга(было на форуме) 2. Бросаем ранг в массив. Ну и ищем чего надо
Vlad04: http://files.mail.ru/X3JBC6 Пример загрузки из Excel- в базу
Dima: fil пишет: 1. Определяем для Excel-файла ширину/высоту рабочего ранга(было на форуме) что то не нашел...... Вроде все получилось , но после заполнения бланка и попытки закрытия EXCEL , он задает вопрос , не желаю ли я сохранить изменения. Как обойти этот запрос и сохраниться ?
fil: oExc:Sheets(nn):UsedRange:Rows:Count oExc:Sheets(nn):UsedRange:Columns:Count oExc:WorkBooks(имя):Close(FALSE,,FALSE)
Dima: Всем спасибо !!!
Dima: Наткнулся на грабли. MT режим. Запущенная в отдельном потоке функция по по заполнению заявок упорно не хочет запускать EXCEL. Функция постоянно выдает FALSE Private переменная oExcel объявлена из фунции которая вызывает Start_Excel() Куда копать ? PS Простой пример без потоков в MT режиме срабатывает нормально. [pre2] func Start_Excel() Local Res:=.f. #ifndef __XHARBOUR__ #xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )} #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> #endif TRY oExcel := GetActiveObject( "Excel.Application" ) oExcel:DisplayAlerts:=.f. Res:=.t. CATCH Res:=.f. TRY oExcel := CreateObject( "Excel.Application" ) Res:=.t. CATCH // Ole2TxtError() выдает ошибку 0x800401f0 Res:=.f. END END Return Res [/pre2]
Dima: Похоже в MT режиме и многопоточной обработкой EXCEL запустить не получиться. Или не прав я и можно как то исправить ситуацию ? PS Уж очень не хочется функцию по заполнению бланков реализовывать в виде отдельной программы и вызывать ее из основной задачи.
fil: А так можно: Открываем один oExc:=CreateObject(Excel.Application). Открываем файл в нем листы с формами На каждый трейд ActiveX():New( диалог, "OWC11.Spreadsheet" ) и на каждый кладем свою форму. Обрабатываем.
Vlad04: Private переменная oExcel объявлена из фунции Я oExcel объявляю в головном файле и стартую из любого места программы
Dima: fil пишет: Открываем один oExc:=CreateObject(Excel.Application) Dima пишет: Похоже в MT режиме и многопоточной обработкой EXCEL запустить не получиться Dima пишет: Ole2TxtError() выдает ошибку 0x800401f0
Dima: Dima пишет: Уж очень не хочется функцию по заполнению бланков реализовывать в виде отдельной программы и вызывать ее из основной задачи. Так и поступил. Работает ;)
Softlog86: Есть задача сгенерировать два XLS файла из одной DBF . Только разные условия для отбора . Пока делаю последовательно ... Можно-ли клепать их одновременно (как-бы разные листы) ? А затем сохранять каждый лист отдельно ... Но я не знаю как это делать - у меня сохраняется вся книга сразу .... Научите переключать книги и сохранять их отдельно :)
Dima: Примерно так. [pre2] proc main local oWorkBook1 local oWorkBook2 local cfile1:=CurDrive()+":\"+CurDir()+"\"+"z1.xls" local cfile2:=CurDrive()+":\"+CurDir()+"\"+"z2.xls" private oExcel if !Start_Excel() quit endif oWorkBook1 := oExcel:Workbooks:Open(cfile1) oWorkBook2 := oExcel:Workbooks:Open(cfile2) oExcel:Visible := .T. oExcel:Windows(oWorkBook1:name()):Activate() // переключение между файлами // oExcel:Windows(oWorkBook2:name()):Activate() переключение между файлами wait oWorkBook1:save() oWorkBook1:close(.f.,,.f.) oWorkBook2:save() oWorkBook2:close(.f.,,.f.) oExcel:Quit() return nil [/pre2]
Softlog86: Уже спасибки ! А как быть если XLS файлов нет ? Они создаются во время обработки данных из других DBF файлов ...... Интересует ещё команды изменения свойств ячейки ( столбца) : Тип данных , выравнивание , шаблон вывода.....
Dima: Softlog86 А посмотри примерчик \svn\harbour\contrib\hbwin\tests\testole.prg Что касаемо шаблона и выравнивания есть тема на форуме , поищи по слову Excel
fil: Всем, привет ! Excel через ole 1. Как получить текст формулы условного форматирования (ежели таковые определены для ячейки) ? 2. Можно ли программно выполнить формулу условного форматирования ?
Dima: fil Сделай макрос и все увидишь. Можно погуглить на предмет Selection.FormatConditions
полная версия страницы