Форум » [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

Dima: Vlad04 Можно погуглить "чтение файла excel ole" А строки можно сразу посчитать

Pasha: Свойство Value относится к объекту Range. Можно присвоить Range диапазону ячеек внутри строки, и получить Value как массив. Можно получить значения сразу нескольких строк как двумерный массив.

Vlad04: Pasha Попробую построчно считывать. При записи подобным образом скорость кратно возрастает


Haz: Vlad04 пишет: нужно прочесть данные с большого Excel файла Если это просто чья то выгрузка в Excel - читать можно через ODBC

Vlad04: Haz Выгрузка чья-то, но формат определённый. Попробовал читать в массив - построчно быстрее,чем по клеточно - а если всю таблицу в массив, так вообще улёт, совсем немного отстает от DBF. Через ODBC, наверно, скорость будет как с родной таблицей ?

Haz: Vlad04 пишет: Через ODBC, наверно, скорость будет как с родной таблицей ? В принципе не тормозит. Где-то был пример чтения через ODBC, если сам не найдёшь, могу поискать у себя. Точно баловался лет 7 назад, тк была задача чтения и записи больших таблиц Excel.

Vlad04: Небольшой косочек кода решил выложить, так как с некоторыми моментами пришлось повозиться ExcelApl - имя объекта Excel при открытии oAS := ExcelApl:ActiveSheet() Количество строк в Excel странице mlast := ExcelApl:ActiveSheet:Range("A1"):CurrentRegion:Rows:Count Копирование в переменную mCel (объявлена, как {}) необходимой области страницы Excel - 3 столбца на всю высоту.В столбцах числовые значения (2) и в одном - Дата. mCel:=oAS:Range('D'+Alltrim(Str(1,5))+':F'+Alltrim(Str(mlast,5))):Value Обработка nn:=2 for i:=2 to mlast // собственно данные со второй строки nWsrst:=(datTek - mCel[i,1] )/365.25 // в итоге число, исходное значение ДАТА nPOL:=Int(mCel[i,2] ) // число nSmk:= Int(mCel[i,3]) // число .... next i

Vlad04: Формат исходного документа csv и xls. Оффис 2003.

Dima: Vlad04 хз я считаю строки и столбцы примерно так a:=oSheet:UsedRange:Rows:Count b:=oSheet:UsedRange:Columns:Count это после oWorkBook := oExcel:Workbooks:Open(cfile) oSheet := oExcel:ActiveSheet()

Haz: Vlad04 Через ODBC, наверно, скорость будет как с родной таблицей Попробуй этим , просто интересно Выгрузки в Excel где первая срока - имена полей а потом сам массив данных читает влет ODBCDemo.prg [pre2] #require "rddsql" #require "sddodbc" #include "simpleio.ch" #include "dbinfo.ch" REQUEST SDDODBC, SQLMIX REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 PROCEDURE Main() #if defined( __HBSCRIPT__HBSHELL ) rddRegister( "SQLBASE" ) rddRegister( "SQLMIX" ) hb_SDDODBC_Register() #endif Set( _SET_DATEFORMAT, "yyyy-mm-dd" ) HB_SETCODEPAGE( "RU1251" ) rddSetDefault( "SQLMIX" ) ? "Connect:", rddInfo( RDDI_CONNECT, { "ODBC", "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=TEST.XLS;" } ) ? "Use:", dbUseArea( .T., , "select * from sheet1", "test" ) ? "Alias:", Alias() ? "DB struct:", hb_ValToExp( dbStruct() ) wait dbGoTop() Browse() dbCloseArea() RETURN [/pre2] Browse там для наглядности, обработку можно сделать в цикле while !eof() ... end, доступ к полям через fieldget( n ) свой XLS переименуй в TEST.XLS и кинь в папку с программой. ВАЖНО ярлычек с данными в EXL должен называться sheet1 или поправь в исходнике под свое название С MiniGui под консоль собирается так c:\MiniGui\batch\compile.bat ODBCDemo /l hbodbc /l odbc32 /l sddodbc /l hbsqldd /c %1 %2 %3 %4 %5 %6 %7 %8 %9

Dima: Pasha пишет: В office 2013 и office 2010 с последними обновлениями появилась новая неприятная хворь: При открытии документа методом Excel:Workbooks:Open происходит или ошибка открытия, или зависание при выполнении метода. Хворь проявляется у Excel, и иногда у Word. У меня шаблоны документов хранятся на letodb сервере. Перед открытием я их копирую в папку temp из getenv('temp'). Делаю точно так же и в 2003 работает норм. В 2010 падаем при открытии. Сделал пару тестов с тем же файлом Excel минуя копирование по сети , проблемы нет. Курил тему https://answers.microsoft.com/ru-ru/office/forum/office_2010-excel/%D0%B7%D0%B0%D1%89%D0%B8%D1%89%D0%B5%D0%BD%D0%BD/d2647c06-cb06-4a3c-a1db-2821e8a0d561 не помогло Курил так же Meтод Open http://www.taurion.ru/excel/pril1/7 и решения не увидел Что делать я хз

Pasha: Я тоже не нашел общего ответа, как решить элу проблему. Иногда эксель сходит с ума и начинает чудить. Из последних случаев: Эксель отказывался открывать определенный документ, по каким-то причинам считая его подозрительным Согласился открывать только после того, как я пересохранил документ именно этим экселем Другой случай: win_oleCreateObject("Excel.Application") на одном компьютере стал стабильно выдавать непонятную ошибку и сваливаться. Причем word там же работал без проблем Я уже собрался переустанавливать паршивца, когда заметил, что если Excel уже работает, открыт другой документ, то win_oleCreateObject тоже работает. Иногда не открывает файл из определенной папки, после копирования его в другую начинает открывать. Рекомендации по ссылке я тоже отрабатывал, не помогало Начиная с версии 2010 поганец сам решает, открывать ему файл или нет.

Dima: Pasha пишет: Я тоже не нашел общего ответа, как решить элу проблему. Я обнаружил один момент , писал выше. Если с тем же XLS файлом проделывать манипуляции по открытию его не важно из какой папки , минуя копирование по сети то все открывается нормально. Видать какой то атрибут цепляется к файлу после его копирования по сетке........вот его бы обнулить как то..

PSP: Dima пишет: Видать какой то атрибут цепляется к файлу после его копирования по сетке........вот его бы обнулить как то.. http://winitpro.ru/index.php/2015/03/17/kak-windows-opredelyaet-chto-fajl-skachan-iz-interneta/

Dima: PSP Пасиб за ссылку. Что делать с этими атрибутами из Harbour не понятно.. Но посетила мысль , я взял файлик XLS по сети и сложил локально. Далее читаю его содержимое через hb_MemoRead , файлик локально убиваю и после пишу в файл с таким же именем через hb_memowrit По идее от этого атрибута и следа не останется

Haz: Dima пишет: .вот его бы обнулить как то.. Попробуй так StrFile(FileStr(cFile ), cFile) создастся локальный файл PS Дим не заметил твое последнее с memowrit - по сути одно и тоже написали

Dima: Haz пишет: по сути одно и тоже написали бывает

PSP: Нормальный способ)) Костыль, конечно, но 100%-ый))

Pasha: Вот описание работы с альтернативными потоками средствами winapi: https://habr.com/ru/post/46990/ Можно сделать обертку этих вызовов на харборе. Насколько я понял, для получения списка потоков файла надо использовать функцию NtQueryInformationFile. А для удаления потока подойдут и обычные файловые функции.

Haz: Dima пишет: его бы обнулить как то.. Дим все оказалось просто; Ferase( cFile + ":Zone.Identifier") удаляет этот альтернативный поток не трогая сам файл. Более того стандартные файловые функции могут читать и писать в эти потоки.



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