|
|
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
Ребята, подскажите кто знает ... Встала задача, сделать импорт экселовского файла в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 23:53 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
:) видимо это эпидемия... Возникла та же самая проблема, что и у автора темы. Вчера полдня голову ломал, но ничего так и не понял. Ошибка, которая проявилась у автора темы проявилась и у меня, но у меня это просто один из частных случаев. В целом я вообще не могу нормально подцепить Excel файл. Начал со следующего варианта: Код: plaintext 1. 2. 3. 4. 5. 6. все замечательно, никаких ошибок нет (в смысле ll_returnCode = 0), но... В общем нужный файл не открывается. У меня открывается "пустой" Excel и все. Такое впечатление, что я прицепляю не конкретный Excel`евский файл (имя и путь в переменной указаны правильно - проверял), а цепляюсь как connectToNewObject( 'excel.application' ). Соответственно, когда дальше дело доходит до чего-то похожего на: Код: plaintext Честно скажу, что ни черта не понял и стал менять варианты коннекта к Excel`ю. Пробовал и вариант похожий на то, что описывал автор темы. Т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Складывается впечатление, что я упустил что-то очень очевидное. На всякий случай - мне нужно открыть конкретный Excel файл. Если кто-то сможеть пролить свет на мое заблуждение, то буду очень признателен. У меня PB 10.2.1 Builb 9004 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 11:31 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
Дремучий 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 11:50 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
2 Dim2000 Стыдно... очень стыдно... :( но в очередной раз проявилась ситуация - напишешь на форум, через 5 минут сам решишь проблему. Дело в том, что такой вариант Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. Прошу прощение за беспокойство. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 12:02 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
Дремучий wrote: > lole_OLE.application.workBooks.open( ls_fullFileName ) Application тут не нужен. Говорю как краевед :). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 12:33 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
Хмммм ... комрады, наверное ещё утро но я так и не понял, почему 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, собственно в етом и заключаетса вышеупомянутый процесс. Вот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 19:00 |
|
||
|
Импорт excel в datawindow ...
|
|||
|---|---|---|---|
|
#18+
voronk wrote: > Хмммм ... комрады, наверное ещё утро но я так и не понял, почему > ole_book.insertfile("c:\book1.xls") не работает. В справке по VBA Excel я такого метода не нашёл. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 19:35 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=33633505&tid=1337852]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 439ms |

| 0 / 0 |
