Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 26.01.06 19:02. Заголовок: Ввод информации из файлов Excell
В форуме время от времени обсуждается вопрос выгрузки в Excell, а у меня обратная задача. Есть несколько организаций, которые передают нам списки своих людей для зачисления сумм на карточки. Раньше у них была единая программа , которая формировала Dbf-файлы и все было просто. Сейчас новая версия этой программы формирует Xls-файлы. Хотелось бы знать как с минимальными переделками решить эту задачу на Harbour? Наверняка посетители форума уже решали такие задачи и могут поделиться своими наработками в этом вопросе.
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.01.06 10:20. Заголовок: Re:
Через OLE Типа так Function ReestrX if ! File('reestr.xls') Alert('Не найден файл reestr.xls') else Private oDoc := OpenExcel('reestr.xls') Private oSheet := oDoc:Get('ActiveSheet') Private oRange Private nRow := 1 Private cLast := space(35) Private cText := space(35) Private cDom Private cKv Private nAt Private nKol Private xVal Private oRow Private xn Private cTown := '0001' Private oWnd := GetWnd() Private oFont Private lFont oWnd:Disable() StackPush(TWindowNew(8, 15, 13, 65, Palette(1),, 2, .t.)) Private oWnd2 := GetWnd() SetCaption('Абоненты') WndSay(10, 20, {|| street->Name}) WndSay(12, 20, {|| Str(nRow) + ' '+cText}) WndMeter() while nRow <= 3056 oRow := oSheet:Rows(nRow) oRange := oRow:Columns(1) xn := oRange:Value oRange := oRow:Columns( 8) xVal := oRange:Value if ValType(xVal) = 'C' nKol := Val(xVal) elseif ValType(xVal) = 'N' nKol := xVal else nKol := 0 endif oRange := oRow:Columns( 4) cText := AnsiToOEM(oRange:Value) и так далее, та мои функции интерфейса не обращай внимание
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.01.06 16:45. Заголовок: Re:
Pasha В общем идея понятна, но линковщик матерится на строке OpenExcel.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 27.01.06 23:02. Заголовок: Re:
oDocl := TOleAuto():New( "Excel.Application" )
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 28.01.06 09:22. Заголовок: Re:
Точно, пропустил, моя функция: Function OpenExcel(cFile) Local oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .f. oExcel:Workbooks:Open( cFile ) Return oExcel
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 30.01.06 14:55. Заголовок: Re:
Pasha Вот отрывок программы с учетом твоего уточнения: cFile = "Example.xls" oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .f. oExcel:Workbooks:Open( cFile ) oSheet := oExcel:Get('ActiveSheet') На выделенной строке во время выполнения программы выдает ошибку Error Excel.Application:WORKBOOKS/16389 E_FAIL: OPEN Arguments: ( [ 1] = Type: C Val: Example.xls) Error at ...: TOLEAUTO:OPEN(0) in Module: win32ole.prg Called from : MAIN(29) in Module: my.prg И как с этим бороться?
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 30.01.06 15:05. Заголовок: Re:
эксэлю надо дать полный путь к файлу, при этом понятия текущего каталога-диска не существует Причем имена каталогов (МОИДОК~1) должны быть кодировке Ansi (1251)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 30.01.06 15:47. Заголовок: Re:
Pasha Вот теперь понятно, большое спасибо
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 31.01.06 16:19. Заголовок: Re:
А есть ли для Clipper какие-то библиотеки, которые позволят прочитать содержимое файла Excell? А если нет, то как будет выглядеть кусок программы Паши для FiveWin? К сожалению в огрызках документации по FiveWin, которая есть у меня, практически ничего на эту тему нет.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.02.06 13:33. Заголовок: Re:
А как завершить работу с XLS-файлом? А то после окончания работы программы Excell так и остается висеть в памяти.
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.02.06 13:57. Заголовок: Re:
или сделать Visible:=.t. и пусть его юзер сам прибивает, или: oWorkBook:Book:Close(.f.) // если есть ActiveWorkBook oExcel:Quit()
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.02.06 15:36. Заголовок: Re:
Pasha Огромное спасибо! Было бы намного меньше вопросов при наличии хоть какой-то документации.
|
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.02.06 20:58. Заголовок: Re:
Это ведь уже вопрос не к харбору, а к майкрософт И такая дока конечно есть, она общедоступна - есть в поставке Office Это хелп по VBA Excel Еще хороший метод - включить в Excel запись макросов, что-то сделать и посмотреть какими командами это повторяется программно
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 01.03.06 19:47. Заголовок: Re:
Pasha Последний вопрос относительно импорта информации. XLS-файл содержит макросы, открываю и обрабатываю его нормально, без вопросов, а вот при закрытии файла выходит сообщение, на которое пользователь программы дожен реагировать выбором соответствующего продолжения. Нельзя ли избавиться от этого сообщения?
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.03.06 14:23. Заголовок: Re:
Надо установить свойство Application:DisplayAlerts := .F.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 02.03.06 15:46. Заголовок: Re:
Pasha Все получилось, большое спасибо!
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 15.05.06 14:13. Заголовок: Переделка импорта их Xls файлов на Open Office
Практически всюду наша головная контора заставила снять Microsoft Office и теперь нужно срочно переделать функцию импорта на следующие дествия: а) Проверить наличие установленного Microsoft Office. Если он есть импорт делается по старому б) Если нет, проверяем наличие установленного Open Office. И если он есть импортируем его средствами. Т.е. необходимо в этом случае перевести текст oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Visible := .f. oExcel:DisplayAlerts := .f. oWorkbook := oExcel:Workbooks:Open( cFile ) oSheet := oExcel:Get('ActiveSheet') do while .t. oRow := oSheet:Rows(nRow) oRange := oRow:Columns( 5) cTemp := oRange:Value ... nRow = nRow + 1 enddo * Выгружаем из Excell oExcel:Workbooks:Close() oExcel:Quit() так чтобы он работал с Open Office в) Если нет ни того и ни другого - просто выдать сообщение об установке одного из двух пакетов Если кто-то уже решал поставленную проблему - поделитесь решением
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.05.06 11:22. Заголовок: Re:
Проверка установки - наверное можно делать через реестр, но как я не знаю Если средствами харбора, то вместо TOleAuto():new( cServer ); Local cServer := 'com.sun.star.ServiceManager' Local hObj := CreateOleObject( cServer ) if OleError() == 0 oStarManager := TOleAuto():new( hObj ) oStarManager:cClassName := cServer else lError := .t. endif Аналогично можно проверить установку Excel Маленький пример с OpenOffice (после создания): oStarDesktop := oStarManager:createInstance('com.sun.star.frame.Desktop') oDocument := oStarDesktop:LoadComponentFromURL(; 'private:factory/scalc',; '_blank',; 0,; {}) oSheet:=oDocument:Sheets:getByName(OemToAnsi("Лист1")) // Нумерация ячеек с нуля oRange := oSheet:getCellByPosition(nCol-1, nRow-1) oRange:SetString(cStr) Чтобы открыть ОО-документ, кажется его имя надо указать вместо _blank, но в формате url, т.е. через //file: У меня под рукой нет примера, я гляну позже
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.05.06 14:06. Заголовок: Re:
Pasha пишет: цитата: | Проверка установки - наверное можно делать через реестр, но как я не знаю |
| Функции в библиотеке what32.lib xHarbour _HB_FUN_REGCLOSEKEY _HB_FUN_REGCREATEKEY _HB_FUN_REGCREATEKEYEX _HB_FUN_REGDELETEKEY _HB_FUN_REGDELETEVALUE _HB_FUN_REGENUMKEYEX _HB_FUN_REGOPENKEYEX _HB_FUN_REGQUERYVALUEEX _HB_FUN_REGSETVALUEEX Пытался использовать , чего-то не получилось , бросил (не было времени) . Кто разберется , тому памятник (при жизни). http://clipper.fastbb.ru/index.pl?1-0-0-00000136-000-10001-0-1144087977 здесь mmk пишет примерчик , я так понимаю на FiveWin (наверно )
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.05.06 19:32. Заголовок: Re:
Начинаем с RegOpenKeyEx(hwKey, cSubKey,,, @nKeyHandle) Описание: The RegOpenKeyEx function opens the specified key. LONG RegOpenKeyEx( HKEY hKey, // handle of open key LPCTSTR lpSubKey, // address of name of subkey to open DWORD ulOptions, // reserved REGSAM samDesired, // security access mask PHKEY phkResult // address of handle of open key ); Parameters hKey Identifies a currently open key or any of the following predefined reserved handle values: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey Points to a null-terminated string containing the name of the subkey to open. If this parameter is NULL or a pointer to an empty string, the function will open a new handle of the key identified by the hKey parameter. In this case, the function will not close the handles previously opened. ulOptions Reserved; must be zero. samDesired Specifies an access mask that describes the desired security access for the new key. This parameter can be a combination of the following values: Value Meaning KEY_ALL_ACCESS Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, and KEY_SET_VALUE access. KEY_CREATE_LINK Permission to create a symbolic link. KEY_CREATE_SUB_KEY Permission to create subkeys. KEY_ENUMERATE_SUB_KEYS Permission to enumerate subkeys. KEY_EXECUTE Permission for read access. KEY_NOTIFY Permission for change notification. KEY_QUERY_VALUE Permission to query subkey data. KEY_READ Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTIFY access. KEY_SET_VALUE Permission to set subkey data. KEY_WRITE Combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access. phkResult Points to a variable that receives the handle of the opened key. Return Values If the function succeeds, the return value is ERROR_SUCCESS. If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.05.06 23:53. Заголовок: Re:
saulius пишет: цитата: | Начинаем с RegOpenKeyEx(hwKey, cSubKey,,, @nKeyHandle) |
| А примерчик можно ? пытаюсь выполнить : msginfo(str(RegOpenKeyEX( "HKEY_LOCAL_MACHINE","SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe",,, @nHandle ),5)) получаю -1 , что делаю не так ?
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|