On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 26.01.06 19:02. Заголовок: Ввод информации из файлов Excell


В форуме время от времени обсуждается вопрос выгрузки в Excell, а у меня обратная задача. Есть несколько организаций, которые передают нам списки своих людей для зачисления сумм на карточки. Раньше у них была единая программа , которая формировала Dbf-файлы и все было просто. Сейчас новая версия этой программы формирует Xls-файлы. Хотелось бы знать как с минимальными переделками
решить эту задачу на Harbour? Наверняка посетители форума уже решали такие задачи и могут
поделиться своими наработками в этом вопросе.


Спасибо: 0 
Ответов - 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)

и так далее, та мои функции интерфейса не обращай внимание



Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 27.01.06 16:45. Заголовок: Re:


Pasha

В общем идея понятна, но линковщик матерится на строке OpenExcel.



Спасибо: 0 



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 27.01.06 23:02. Заголовок: Re:


oDocl := TOleAuto():New( "Excel.Application" )


Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 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


Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 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

И как с этим бороться?



Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 30.01.06 15:05. Заголовок: Re:


эксэлю надо дать полный путь к файлу, при этом понятия текущего каталога-диска не существует
Причем имена каталогов (МОИДОК~1) должны быть кодировке Ansi (1251)


Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 30.01.06 15:47. Заголовок: Re:


Pasha

Вот теперь понятно, большое спасибо



Спасибо: 0 



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 31.01.06 16:19. Заголовок: Re:


А есть ли для Clipper какие-то библиотеки, которые позволят прочитать
содержимое файла Excell? А если нет, то как будет выглядеть кусок программы
Паши для FiveWin? К сожалению в огрызках документации по FiveWin, которая
есть у меня, практически ничего на эту тему нет.


Спасибо: 0 



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.02.06 13:33. Заголовок: Re:


А как завершить работу с XLS-файлом? А то после окончания работы программы
Excell так и остается висеть в памяти.

Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.02.06 13:57. Заголовок: Re:


или сделать Visible:=.t. и пусть его юзер сам прибивает, или:

oWorkBook:Book:Close(.f.) // если есть ActiveWorkBook
oExcel:Quit()


Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.02.06 15:36. Заголовок: Re:


Pasha

Огромное спасибо! Было бы намного меньше вопросов при наличии
хоть какой-то документации.



Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.02.06 20:58. Заголовок: Re:


Это ведь уже вопрос не к харбору, а к майкрософт
И такая дока конечно есть, она общедоступна - есть в поставке Office
Это хелп по VBA Excel
Еще хороший метод - включить в Excel запись макросов, что-то сделать
и посмотреть какими командами это повторяется программно

Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 01.03.06 19:47. Заголовок: Re:


Pasha

Последний вопрос относительно импорта информации. XLS-файл содержит макросы,
открываю и обрабатываю его нормально, без вопросов, а вот при закрытии файла
выходит сообщение, на которое пользователь программы дожен реагировать выбором
соответствующего продолжения. Нельзя ли избавиться от этого сообщения?



Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.03.06 14:23. Заголовок: Re:


Надо установить свойство

Application:DisplayAlerts := .F.


Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 02.03.06 15:46. Заголовок: Re:


Pasha

Все получилось, большое спасибо!



Спасибо: 0 



Не зарегистрирован
Зарегистрирован: 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

в) Если нет ни того и ни другого - просто выдать сообщение об установке одного
из двух пакетов

Если кто-то уже решал поставленную проблему - поделитесь решением

Спасибо: 0 
Администратор




Не зарегистрирован
Зарегистрирован: 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:
У меня под рукой нет примера, я гляну позже


Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 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 (наверно )



Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 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.



Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 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 , что делаю не так ?


Спасибо: 0 
Профиль
Ответов - 35 , стр: 1 2 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 105
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет