Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 06.07.09 13:10. Заголовок: OEMTOANSI
Возникла необходимость передать данные в EXCEL Программа консольная HARBOUR база ДОС Для передачи исрользую OLE В начале программы устонавливаю HB_LANG_RU866 HB_CODEPAGE_RU866 HB_LANGESELECT("RU866") HB_SETCODEPAGE("RU866") Просматривается база TBROWSE (перетранслированна из CLIPPER) Формируется таблица EXCEL Таблица формируется нормально Заголовки колонок формирую из заголовок колонок BROWSERa HB_OENTOANSI(oColumn:Header) В таблице EXCEL заголовки колонок выдаются неправильно Проверил oColumn:Header - таблица ДОС Проверил oColumn:Header после перекодировки коды символов не соответсвуют таблице WINDOWS Если в редакторе(FAR) сформировать константу а потом выполнить HB_OENTOANSI(CONST) то преобразует нормально В чем может быть причина.Спасибо
|
|
|
Ответов - 5
[только новые]
|
|
|
| постоянный участник
|
Пост N: 707
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.07.09 14:21. Заголовок: Avseev1949 пишет: З..
Avseev1949 пишет: цитата: | Заголовки колонок формирую из заголовок колонок BROWSERa HB_OENTOANSI(oColumn:Header) |
| А если сформировать просто как oColumn:Header?
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 06.07.09 14:34. Заголовок: Пробовал не помогает..
Пробовал не помогает Смотрел в иходниках OemToCharBuffA вроде вызов идет к ней. Если не ошибаюсь, но в MSDN ее описания не нашел. может это функция HARBOUR пытался разобраться как это все работает.
|
|
|
|
| постоянный участник
|
Пост N: 708
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.07.09 14:50. Заголовок: Это функция из user3..
Это функция из user32.dll Маленький пример желательно бы.. цитата: | Если в редакторе(FAR) сформировать константу а потом выполнить HB_OENTOANSI(CONST) то преобразует нормально |
| Т.е. исходники у вас в CP866? А как вы oColumn:Header устанавливаете ?
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 06.07.09 16:02. Заголовок: Исходники в CP866 oB..
Исходники в CP866 oBrow - Tbrowse OбЪект aColumn - Количество колонок На экран заголоки колонок отображаются нормально For nCol := 1 To Len( aColumn ) oCol := oBrow:GetColumn(aColumn[nCol]) cStr := HB_OEMTOANSI(oCol:Heading) //cStr := oCol:Heading //ДЛЯ ПРОВЕРКИ КОДОВ //uData := STR(ASC(Substr(cStr,1,1))) uData := cStr uData := StrTran( uData, Chr(13)+Chr(10), Chr( 10 ) ) cText += uData + Chr( 9 ) Next БЕЗ HB_OEMTOANSI ВЫДАЕТ КОДЫ ДОС С HB_OEMTOANSI ПЕРЕКОДИРУЕТ НО ПРИ ПЕРЕДАЧЕ В EXCEL МУСОР
|
|
|
|
| постоянный участник
|
Пост N: 709
Зарегистрирован: 09.10.06
|
|
Отправлено: 07.07.09 07:50. Заголовок: Avseev1949 пишет: Б..
Avseev1949 пишет: цитата: | БЕЗ HB_OEMTOANSI ВЫДАЕТ КОДЫ ДОС С HB_OEMTOANSI ПЕРЕКОДИРУЕТ НО ПРИ ПЕРЕДАЧЕ В EXCEL МУСОР |
| К сожалению, этот пример не самодостаточный. Проверить как он работает в программе трудно. К тому же у меня возникли вопросы о целесообразности использования промежуточной переменной uData и функции StrTran в цикле. Вот написал по быстрому, исходники в CP866 Все работает нормально. цитата: | REQUEST DBFCDX REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 STATIC s_oBrowse PROCEDURE Main() LOCAL aStruct := { { "CHAR1", "C", 25, 0 }, { "CHAR2", "C", 25, 0 } } // CLEAR SCREEN hb_setCodePage( "RU866" ) dbCreate( "mytest", aStruct, "DBFCDX", .T. , "MYALIAS" ) MYALIAS -> ( dbAppend() ) MYALIAS -> CHAR1 := "Значение #11" MYALIAS -> CHAR2 := "Значение #12" MYALIAS -> ( dbAppend() ) MYALIAS -> CHAR1 := "Значение #13" MYALIAS -> CHAR2 := "Значение #14" MYALIAS -> ( dbCommit() ) s_oBrowse := BrowseCreate() hb_setTermCP( "RU866", "RU1251", .T. ) ExportToExcel() dbCloseAll() dbDrop( "mytest" ) RETURN /** */ STATIC FUNCTION BrowseCreate() LOCAL oB, oC // oB := TBrowseDB( , , , ) oC := TBColumnNew( "Столбец #1", { || MYALIAS -> CHAR1 } ) oB:addColumn( oC ) oC := TBColumnNew( "Столбец #2", { || MYALIAS -> CHAR2 } ) oB:addColumn( oC ) RETURN oB /** */ STATIC PROCEDURE ExportToExcel() LOCAL oExcel, oWorkBook, oAS, nI LOCAL oColumn := s_oBrowse:GetColumn( 1 ) LOCAL cStr := oColumn:Heading IF !hb_isObject( s_oBrowse ) .OR. s_oBrowse:ClassName != "TBROWSE" RETURN ENDIF IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) != NIL oWorkBook := oExcel:WorkBooks:Add() oAS := oExcel:ActiveSheet() FOR nI := 1 TO s_oBrowse:colCount() oColumn := s_oBrowse:GetColumn( nI ) cStr := oColumn:Heading oAS:Cells( 1, nI ):Value := hb_oemToAnsi( cStr ) NEXT MYALIAS -> ( dbGoTop() ) nI := 3 DO WHILE !Eof() oAS:Cells( nI, 1 ):Value := hb_oemToAnsi( MYALIAS -> CHAR1 ) //? oAS:Cells( nI, 1 ):Value oAS:Cells( nI, 2 ):Value := hb_oemToAnsi( MYALIAS -> CHAR2 ) //? oAS:Cells( nI, 2 ):Value dbSkip( + 1 ); nI++ ENDDO FOR nI := 1 TO s_oBrowse:colCount() oAS:Columns( nI ):AutoFit() NEXT oExcel:Visible := .T. //oExcel:Quit() ELSE Alert( "Error: MS Excel not available. [" + win_oleErrorText() + "]" ) ENDIF |
|
|
|
|
|