powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Импорт excel в datawindow ...
7 сообщений из 7, страница 1 из 1
Импорт excel в datawindow ...
    #33624842
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, подскажите кто знает ...

Встала задача, сделать импорт экселовского файла в datawindow.
Глянул, предлагают:

ole_book = CREATE oleobject
ole_book.ConnectToNewObject('excel.application')
ole_book.insertfile("c:\book1.xls")
ole_book.getdata(clipformattext!, s_data)
ole_book.Application.Quit
ole_book.DisconnectObject()
DESTROY ole_book

dw_1.ImportString(s_data)

/****************************/
insertfile() - плюётса, говорит:
"Name not found calling external object function insertfile ..."

Чего не так???
Зараннее благодарен за любую наводку.

ПеСе
PB 9.0.2 Build 7610
Excel 2002 SP3
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33629011
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) видимо это эпидемия... Возникла та же самая проблема, что и у автора темы. Вчера полдня голову ломал, но ничего так и не понял. Ошибка, которая проявилась у автора темы проявилась и у меня, но у меня это просто один из частных случаев. В целом я вообще не могу нормально подцепить Excel файл.

Начал со следующего варианта:
Код: plaintext
1.
2.
3.
4.
5.
6.
lole_OLE = create oleObject

ll_returnCode = lole_OLE.connectToObject( ls_fullFileName )
if ll_returnCode <> 0 then
   /*реакция на ошибку*/
end if

все замечательно, никаких ошибок нет (в смысле ll_returnCode = 0), но... В общем нужный файл не открывается. У меня открывается "пустой" Excel и все. Такое впечатление, что я прицепляю не конкретный Excel`евский файл (имя и путь в переменной указаны правильно - проверял), а цепляюсь как connectToNewObject( 'excel.application' ). Соответственно, когда дальше дело доходит до чего-то похожего на:
Код: plaintext
lole_sheet = lole_OLE.application.activeWorkbook.workSheets[ 1 ]
Я получаю ошибку "Null object reference at line..."

Честно скажу, что ни черта не понял и стал менять варианты коннекта к Excel`ю. Пробовал и вариант похожий на то, что описывал автор темы. Т.е.:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
lole_OLE = create oleObject

ll_returnCode = lole_OLE.connectToNewObject( 'excel.application' )
if ll_returnCode <> 0 then
   /*реакция на ошибку*/
end if

if lole_OLE.insertFile( ls_fullFileName ) <> 0 then
   /*реакция на ошибку*/
end if
получил ту же ошибку, что и автор темы.

Складывается впечатление, что я упустил что-то очень очевидное.

На всякий случай - мне нужно открыть конкретный Excel файл.

Если кто-то сможеть пролить свет на мое заблуждение, то буду очень признателен.

У меня PB 10.2.1 Builb 9004
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33629083
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дремучий wrote:

> просто один из частных случаев. В целом я вообще не могу нормально
> подцепить Excel файл.

Мда... не, я всё понимаю, но зачем извращаться ;)?

oExcel = CREATE oleobject
if oExcel.ConnectToNewObject("Excel.Application") <> 0 then
MessageBox('Error', 'Невозможно установить связь с MS Excel', Stopsign!)
Return
end if

oExcel.Workbooks.Open(sFileName)

.....

> все замечательно, никаких ошибок нет (в смысле ll_returnCode = 0), но...
> В общем нужный файл не открывается. У меня открывается "пустой" Excel и
> все. Такое впечатление, что я прицепляю не конкретный Excel`евский файл
> (имя и путь в переменной указаны правильно - проверял), а цепляюсь как
> connectToNewObject( 'excel.application' ). Соответственно, когда дальше
> дело доходит до чего-то похожего на:
>
> lole_sheet = lole_OLE.application.activeWorkbook.workSheets[ 1 ]

Скорее, lole_sheet = lole_OLE.Workbooks(1).WorkSheets(1)

> У меня PB 10.2.1 Builb 9004

То, что я написал, работает прекрасно, но под ПБ9. Что будт под ПБ10 -
не знаю :).
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33629139
Дремучий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dim2000
Стыдно... очень стыдно... :( но в очередной раз проявилась ситуация - напишешь на форум, через 5 минут сам решишь проблему.

Дело в том, что такой вариант
Код: plaintext
1.
2.
lole_OLE.connectToNewObject ( 'excel.application' )
...
lole_OLE.application.workBooks.open( ls_fullFileName )
Я вчера пробовал. Но видимо голова к тому моменту уже совсем никакая была. Дело в том, что я пробовал немного по иному:
Код: plaintext
1.
2.
3.
4.
lole_OLE.connectToNewObject ( 'excel.application' )
...
if lole_OLE.application.workBooks.open( ls_fullFileName ) <> 0 then
   messageBox( '', 'И тут ошибка :(', Exclamation! )
end if
И совершенно не обратил внимание на то, что вылетевшее сообщение об ошибке другое по своему смыслу. Ругань идет на несоответствие типов! Ну а не заметив этого я просто закомментарил этот вариант и стал дальше извращаться. А сегодня продолжая эксперименты снава запустил... заметил, что сообщение принципиально иное и получил нужный результат.

Прошу прощение за беспокойство. :(
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33629275
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дремучий wrote:

> lole_OLE.application.workBooks.open( ls_fullFileName )

Application тут не нужен. Говорю как краевед :).
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33633505
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмммм ... комрады, наверное ещё утро но я так и не понял, почему
ole_book.insertfile("c:\book1.xls") не работает.

Ну вообщем я пошёл другим путём(может этот код кому, на что и сгодитса), код не в продакшн, там в окно мне ешё другой процесс надо добавить, поэтому любые коментарии "мор-дэн-вэлком" ... (то биш зараннее благодарен)


long l_day, l_month, l_year, l_row, l_row_count, l_worksheet_knt, l_idx, l_work_sheet_idx[], l_pos
int i_rc, i_rc2, i_col_knt, i_col_knt_check
datetime dt_date
string s_filter, s_fname1, s_fname2, s_work_sheet_name[], s_match, s_select, s_dwsyntax, s_err, s_col_name, s_col_list[]
string s_data, s_num, s_str, s_col_list_check[]
oleobject ole_book, ole_sheet
any a_any
boolean b_fnd

/******************************* File check constants ... *****************************************/
i_col_knt_check = 18

s_col_list_check[] = {'owner_last_1','owner_first_2', .... и так далее}
/**************************************************************************************************/

dw_xls_import.dataobject = ''
dw_xls_display.Reset()

i_str_pass.s[4] = 'AR'
message.fnv_set_str_pass(i_str_pass)

open (w_parm)

i_str_pass = Message.fnv_get_str_pass()
Message.fnv_clear_str_pass()

CHOOSE CASE i_str_pass.s_action
CASE 'cancel'
close(this)
RETURN

CASE 'ok'

CASE ELSE
g_nv_msg_mgr.fnv_process_msg ('pt', 'App Error', 'Invalid Action in ue_fileopen of w_xls_import', '', 0, 0)
close(this)
RETURN

END CHOOSE

// 1 if it succeeds ...
// 0 if the user clicks the Cancel button or Windows cancels the display ...
//-1 if an error occurs ...
i_rc = GetFileOpenName('Select File', s_fname1, s_fname2, 'XLS', 'Excel Files (*.XLS),*.XLS')

IF i_rc = 0 THEN
close(this)
RETURN
END IF

IF i_rc = - 1 THEN
MessageBox(This.Title, 'Unable to locate file.', Exclamation!)
close(this)
RETURN
END IF

This.SetFocus()

// Check for open file ...
i_rc = FileOpen (s_fname1, StreamMode!, Write!, LockReadWrite!)

IF i_rc > 0 THEN
FileClose(i_rc)
ELSE
MessageBox(This.Title, 'Selected file is currently open.~nPlease close it to continued.', Exclamation!)
close(this)
RETURN
END IF

ole_book = CREATE oleobject

IF NOT IsValid(ole_book) THEN
MessageBox(This.Title, 'Create fail.', Exclamation!)
DESTROY ole_book
close(this)
RETURN
END IF

// 0 if it succeeds
//-1 Invalid Call: the argument is the Object property of a control
//-2 Class name not found
//-3 Object could not be created
//-4 Could not connect to object
//-9 Other error
//-15 MTS is not loaded on this computer
//-16 Invalid Call: this function not applicable ...

i_rc = ole_book.ConnectToNewObject('excel.application')

IF i_rc <> 0 THEN
MessageBox(This.Title, 'Unable to connect to excel application.', Exclamation!)
DESTROY ole_book
Close(This)
RETURN
END IF

a_any = ole_book.Application.DisplayAlerts = FALSE

a_any = ole_book.Application.WorkBooks.Open(s_fname1)

// Check if there is more then 1 worksheet ...
l_worksheet_knt = ole_book.Worksheets.Count

IF l_worksheet_knt > 1 THEN
FOR l_idx = 1 TO l_worksheet_knt
s_work_sheet_name[l_idx] = ole_book.Worksheets(l_idx).Name
l_work_sheet_idx[l_idx] = l_idx
NEXT

i_str_pass.s[] = s_work_sheet_name[]
i_str_pass.d[] = l_work_sheet_idx[]

message.fnv_set_str_pass(i_str_pass)

open(w_parm_import_sheets)

i_str_pass = Message.fnv_get_str_pass()
Message.fnv_clear_str_pass()

CHOOSE CASE i_str_pass.s_action
CASE 'ok'
l_worksheet_knt = i_str_pass.d[1]

CASE ELSE
ole_sheet.DisconnectObject()
ole_book.Application.Quit
ole_book.DisconnectObject()

IF IsValid(ole_sheet) THEN
DESTROY ole_sheet
END IF

IF IsValid(ole_book) THEN
DESTROY ole_book
END IF

close(this)
RETURN
END CHOOSE
END IF

ole_sheet = ole_book.ActiveWorkBook.WorkSheets(l_worksheet_knt)

// Check file for a valid column number ...
i_col_knt = ole_sheet.UsedRange.Columns(ole_sheet.UsedRange.Columns.Count).Column

IF i_col_knt <> i_col_knt_check THEN
ole_sheet.DisconnectObject()
ole_book.Application.Quit
ole_book.DisconnectObject()

IF IsValid(ole_sheet) THEN
DESTROY ole_sheet
END IF

IF IsValid(ole_book) THEN
DESTROY ole_book
END IF

MessageBox(This.Title, 'Invalid file format, ColumnCount() = ' + string(i_col_knt), Exclamation!)
close(this)
RETURN
END IF


// Щас на лету построим datawindow для импорта ...
s_select = 'select '

FOR i_rc = 1 TO i_col_knt
s_col_name = lower(trim(string(ole_book.Workbooks(1).Worksheets(l_worksheet_knt).cells(1, i_rc).value)))

l_pos = Pos(s_col_name, ' ')

DO WHILE l_pos > 0
s_col_name = Replace (s_col_name, l_pos, 1, '_' )

l_pos = Pos(s_col_name, ' ')
LOOP

s_col_list[i_rc] = s_col_name

s_select = s_select + s_col_name + ' = convert(varchar(40), null),'

//s = ole_book.Workbooks(1).Worksheets(1).cells(2, i_rc).NumberFormat
NEXT

// Check file for a range of the valid columns (names) ...
s_col_name = ''
b_fnd = FALSE

FOR i_rc = 1 TO UpperBound(s_col_list[])
s_col_name = s_col_list[i_rc]

b_fnd = FALSE

FOR i_rc2 = 1 TO UpperBound(s_col_list_check[])
IF s_col_name = s_col_list_check[i_rc2] THEN
b_fnd = TRUE
EXIT
END IF
NEXT

IF b_fnd = FALSE THEN
EXIT
END IF

NEXT

IF NOT b_fnd THEN
ole_sheet.DisconnectObject()
ole_book.Application.Quit
ole_book.DisconnectObject()

IF IsValid(ole_sheet) THEN
DESTROY ole_sheet
END IF

IF IsValid(ole_book) THEN
DESTROY ole_book
END IF

MessageBox(This.Title, 'Invalid file format, column ' + s_col_list[i_rc] + ' is not a valid column.', Exclamation!)
close(this)
RETURN
END IF

s_select = Left(s_select, len(s_select) - 1)
s_dwsyntax = SQLCA.SyntaxFromSQL(s_select, "Style(Type=grid)", s_err)
dw_xls_import.Create(s_dwsyntax, s_err)

IF s_err <> '' THEN
MessageBox(This.Title, s_err, Exclamation!)
ole_sheet.DisconnectObject()
ole_book.Application.Quit
ole_book.DisconnectObject()

IF IsValid(ole_sheet) THEN
DESTROY ole_sheet
END IF

IF IsValid(ole_book) THEN
DESTROY ole_book
END IF

close(this)
RETURN
END IF

/* Важно, иначе если больше чем один шит, будет будет цеплять шит с потолка, не всегда тот который ты выбрал ... */
ole_book.Workbooks(1).Worksheets(l_worksheet_knt).select

ole_book.ActiveCell.CurrentRegion.Select()
ole_book.Selection.Copy()

/* ole_book.Application.DisplayAlerts = False */

dw_xls_import.ImportClipBoard(2)

ClipBoard('')

ole_sheet.DisconnectObject()
ole_book.Application.Quit
ole_book.DisconnectObject()

IF IsValid(ole_sheet) THEN
DESTROY ole_sheet
END IF

IF IsValid(ole_book) THEN
DESTROY ole_book
END IF

Ну и после того как вся дата сидит у меня в datawindow и я знаю названия всех колонок, я уже распихаю её по другим datawindows, собственно в етом и заключаетса вышеупомянутый процесс.

Вот
...
Рейтинг: 0 / 0
Импорт excel в datawindow ...
    #33633558
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voronk wrote:

> Хмммм ... комрады, наверное ещё утро но я так и не понял, почему
> ole_book.insertfile("c:\book1.xls") не работает.

В справке по VBA Excel я такого метода не нашёл.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Импорт excel в datawindow ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]