Форум » [x]Harbour » Чтение/запись XLS _без_OLE (библиотека LibXL) » Ответить

Чтение/запись XLS _без_OLE (библиотека LibXL)

gustow: Кто-нибудь пробовал такую библиотечку - LibXL (http://www.libxl.com/)? Упоминается в обсуждении в Harbour Users - http://groups.google.com/group/harbour-users/browse_thread/thread/3adc51b4bcdfff51# - что с нею можно читать-писать XLS/XLSX _без_ имеющегося Excel'а.

Ответов - 13

SADSTAR33: а как потом результат показать? напечатать?

AlexMyr: SADSTAR33 пишет: а как потом результат показать? напечатать? В чем сарказм? Как результат можно привести самодостаточный пример для работы с XLS/XLSX.

gustow: Она (биб-ка), правда, платная ($199) - а "халява" читает только 100 строк из экселки и пишет тоже с ограничениями. Интересно просто - кто-нибудь в курсе наличия приблизительных (но халявных) аналогов? (чтобы _книгу_ делать, а не _отдельный_лист_) Меня, в общем-то, в 1ю голову интересует "читалка" из экселки.


santy: Попробуйте, неплохая библиотека xlslib --- http://xlslib.sourceforge.net/ Если вам нужно создавать отчёты в excel можна использовать ExCovnerter. Сам его использую.

Andrey: santy пишет: Если вам нужно создавать отчёты в excel можна использовать ExCovnerter. Сам его использую. Классная штука ! Жаль на Харбор нельзя перевести !

yury: Пользуюсь Йокселем как ActiveX объектом создает, читает, печатает, редактирует excel 97-2003 (выше пока не надо ). http://yoksel.net.ru ЗЫ. Также читает и пишет в формате ( mxl - 1Cv77 ) - так что можно тягать формы прямо из 1С

yury: И еще. В БАРС есть модуль xlsreport - создание отчетов из шаблонов екселя. Без ОЛЕ. В исходном коде. Насколько я понимаю, формат старого экселя уже давно известен ( biff8 кажется зовется ). Сам этим модулем не пользовался , т.к. для отображения результата там вызывается Эксель, что мне не подошло.

leo: yury пишет: Пользуюсь Йокселем как ActiveX объектом А можно привести пример использования на Harbour?

yury: leo пишет: А можно привести пример использования на Harbour? Да не вопрос. oYoksel := TOleAuto():New( "Yoksel" ) IF oYoksel == nil MsgStop('Ошибка создания объекта табличного документа !','Ошибка') RETURN Endif oDoc := oYoksel:CreateSpreadsheetDocument() IF oDoc == nil MsgStop('Ошибка создания объекта табличного документа !','Ошибка') RETURN Endif DBCREATE("mem:repo", {{"IDLIK", "N", 6, 0},{"GOD", "N", 4, 0},{"MES", "N", 2, 0},{"Kvo5", "N", 3, 0},{"Sum5", "N", 12, 2},; {"KvoFSS", "N", 3, 0},{"SumFSS", "N", 12, 2}},, .T., "memarea") INDEX ON STR(FIELD->IDLIK,6)+STR(FIELD->GOD,4)+STR(FIELD->MES,2) TAG LIK // открытие шаблона // oTmpl := oYoksel:CreateSpreadsheetDocument() IF oTmpl == nil MsgStop('Ошибка создания объекта табличного документа !','Ошибка') RETURN Endif oTmpl:Open(DirPrg()+"\rpt\template\Rpt_Liklist.mxl", 1, 0 ) IF oTmpl == nil MsgStop('Ошибка создания объекта табличного документа !','Ошибка') RETURN Endif //Шапка cPeriod := LOWER(Rus_Month( MONTH( dGl_WorkDate ) ) ) + " " + STR( YEAR ( dGl_WorkDate ), 4 ) + " г." oReg1 := oTmpl:Area( 1, 1 ) // 1 строка - заголовок отчета cTxt := oReg1:Text cTxt := STRTRAN( cTxt, "["+"cPeriod"+"]", cPeriod) oDoc:PasteArea( oReg1, 1 , 1 ) oReg2 := oDoc:Area( 1, 1 ) oReg2:Text := cTxt // 2-4 строка - заголовок таблицы oReg1 := oTmpl:Area( 2, 1, 4, 11 ) oDoc:PasteArea( oReg1, 2, 1 ) //ширина полей oReg2 := oDoc:Area( oDoc:TableHeight(), 1 ) oReg2:ColumnWidth := 9 oReg2 := oDoc:Area( oDoc:TableHeight(), 2 ) oReg2:ColumnWidth := 9 oReg2 := oDoc:Area( oDoc:TableHeight(), 3 ) oReg2:ColumnWidth := 50 oReg2 := oDoc:Area( oDoc:TableHeight(), 4 ) oReg2:ColumnWidth := 14 oReg2 := oDoc:Area( oDoc:TableHeight(), 5 ) oReg2:ColumnWidth := 11 oReg2 := oDoc:Area( oDoc:TableHeight(), 6 ) oReg2:ColumnWidth := 11 oReg2 := oDoc:Area( oDoc:TableHeight(), 7 ) oReg2:ColumnWidth := 12 oReg2 := oDoc:Area( oDoc:TableHeight(), 8 ) oReg2:ColumnWidth := 6 oReg2 := oDoc:Area( oDoc:TableHeight(), 9 ) oReg2:ColumnWidth := 12 oReg2 := oDoc:Area( oDoc:TableHeight(), 10 ) oReg2:ColumnWidth := 6 oReg2 := oDoc:Area( oDoc:TableHeight(), 11 ) oReg2:ColumnWidth := 12 nNom := 0 liklist->( DBGOTOP () ) DO WHILE !liklist->( EOF() ) nNom += 1 nIdLik := liklist->id nTn := liklist->tn cFio := liklist->fio nLik := liklist->nomlik cDateBegin := liklist->BeginDate cDateEnd := liklist->EndDate nSum := liklist->SumLik5 + liklist->SumLikFss nKvoDn5 := liklist->KvoDn5 nSum5 := liklist->SumLik5 nKvoDnFSS := liklist->KvoDnFss nSumFSS := liklist->SumLikFss //итоги nSumIt += liklist->SumLik5 + liklist->SumLikFss nKvoDn5It += liklist->KvoDn5 nSum5It += liklist->SumLik5 nKvoDnFSSIt += liklist->KvoDnFss nSumFSSIt += liklist->SumLikFss oReg1 := oTmpl:Area( 6, 1, 6, 11) oDoc:PasteArea(oReg1,oDoc:TableHeight() + 1, 1) oReg2 := oDoc:Area( oDoc:TableHeight(), 1 ) oReg2:Text := nNom oReg2 := oDoc:Area( oDoc:TableHeight(), 2 ) oReg2:Text := nTn oReg2 := oDoc:Area( oDoc:TableHeight(), 3 ) oReg2:Text := cFio oReg2 := oDoc:Area( oDoc:TableHeight(), 4 ) oReg2:Text := nLik oReg2 := oDoc:Area( oDoc:TableHeight(), 5 ) oReg2:Text := DTOC(cDateBegin) oReg2 := oDoc:Area( oDoc:TableHeight(), 6 ) oReg2:Text := DTOC(cDateEnd) oReg2 := oDoc:Area( oDoc:TableHeight(), 7 ) oReg2:Text := nSum oReg2 := oDoc:Area( oDoc:TableHeight(), 8 ) oReg2:Text := nKvoDn5 oReg2 := oDoc:Area( oDoc:TableHeight(), 9 ) oReg2:Text := nSum5 oReg2 := oDoc:Area( oDoc:TableHeight(), 10 ) oReg2:Text := nKvoDnFss oReg2 := oDoc:Area( oDoc:TableHeight(), 11 ) oReg2:Text := nSumFss memarea->( DBGOTOP() ) DO WHILE !memarea->( EOF() ) IF memarea->idlik == nIdLik cMes := LOWER(Rus_Month( memarea->mes ) ) + " " + STR( memarea->god, 4 ) + " г." nSum := memarea->Sum5 + memarea->SumFss nKvoDn5 := memarea->Kvo5 nSum5 := memarea->Sum5 nKvoDnFss := memarea->KvoFss nSumFss := memarea->SumFss oReg1 := oTmpl:Area( 8, 1, 8, 11) oDoc:PasteArea(oReg1,oDoc:TableHeight() + 1, 1) oReg2 := oDoc:Area( oDoc:TableHeight(), 3 ) oReg2:Text := cMes oReg2 := oDoc:Area( oDoc:TableHeight(), 7 ) oReg2:Text := nSum oReg2 := oDoc:Area( oDoc:TableHeight(), 8 ) oReg2:Text := nKvoDn5 oReg2 := oDoc:Area( oDoc:TableHeight(), 9 ) oReg2:Text := nSum5 oReg2 := oDoc:Area( oDoc:TableHeight(), 10 ) oReg2:Text := nKvoDnFss oReg2 := oDoc:Area( oDoc:TableHeight(), 11 ) oReg2:Text := nSumFss ENDIF memarea->(DBSKIP()) ENDDO liklist->( DBSKIP() ) ENDDO //итоги oReg1 := oTmpl:Area( 10, 1, 10, 11) oDoc:PasteArea(oReg1,oDoc:TableHeight() + 1, 1) oReg2 := oDoc:Area( oDoc:TableHeight(), 7 ) oReg2:Text := nSumIt oReg2 := oDoc:Area( oDoc:TableHeight(), 8 ) oReg2:Text := nKvoDn5It oReg2 := oDoc:Area( oDoc:TableHeight(), 9 ) oReg2:Text := nSum5It oReg2 := oDoc:Area( oDoc:TableHeight(), 10 ) oReg2:Text := nKvoDnFssIt oReg2 := oDoc:Area( oDoc:TableHeight(), 11 ) oReg2:Text := nSumFssIt IF ( fh:= hb_FTempCreateEx(@cRptName, Nil, Nil,".tmp")) != F_ERROR FClose(fh) Else MsgStop("Ошибка создания файла :"+ Str(FERROR())) RETURN Nil Endif oDoc:FixRowsTop := 4 oDoc:PrintingOptions:FitToPage := 1 oDoc:PrintingOptions:Orientation := 2 oDoc:PrintingOptions:MarginLeft := 100 oDoc:PrintingOptions:MarginRight := 0 oDoc:PrintingOptions:MarginTop := 50 oDoc:PrintingOptions:MarginBottom := 50 oDoc:Save( cRptName, 1 ) oReg1 := Nil oReg2 := Nil oDoc := Nil oTmpl := Nil oYoksel := Nil IF SELECT( "zpt" ) != 0 zpt->( DBCLOSEAREA() ) ENDIF IF SELECT( "liktabch" ) != 0 liktabch->( DBCLOSEAREA() ) ENDIF DBDROP("mem:repo") memarea->( DbCloseArea() ) SELECT( nOldSelect ) view_repo( cRptName ) Процедура показа сформированного листа Эксель #include "minigui.ch" Function View_Repo( cNameRepo, cFName ) //Default(@cFName, "" ) DEFAULT cFName TO "" IF !FILE( cNameRepo ) Return Nil ENDIF lThemed := IsThemed() IF !IsWindowDefined( ViewRepo ) DEFINE WINDOW ViewRepo ; AT nGl_WinWidth * 0.13, nGl_WinHeight * 0.23 ; WIDTH nGl_WinWidth * 0.97 ; HEIGHT nGl_WinHeight * 0.87 ; TITLE 'Просмотр отчета' ; ICON 'IDI_MAIN' ; CHILD ; ON INIT Show_Repo( cNameRepo ) ; ON RELEASE { || FERASE( cNameRepo ) } ; ON SIZE Adjust_ViewRepo() ; ON MAXIMIZE Adjust_ViewRepo() DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 90,32 FLAT RIGHTTEXT BUTTON PrintOp CAPTION 'Параметры страницы' PICTURE "IDB_PRINT_OPT" ACTION PrintOptions() AUTOSIZE BUTTON Print CAPTION 'Печать' PICTURE "IDB_PRINT" ACTION PrintRepo() AUTOSIZE BUTTON Excel CAPTION 'Сохранить' PICTURE "IDB_EXCEL" ACTION Save2Excel(cFName) AUTOSIZE BUTTON Close CAPTION _HMG_aABMLangButton[1] PICTURE "MINIGUI_EDIT_CLOSE" ACTION ViewRepo.Release AUTOSIZE END TOOLBAR DEFINE ACTIVEX acxYoksel ROW 45 COL 0 WIDTH GetProperty( "ViewRepo" , "width" ) - 07 HEIGHT GetProperty( "ViewRepo" , "height" ) - 102 PROGID "Yoksel.ActiveXCtrl.1" END ACTIVEX END WINDOW Center Window ViewRepo Activate Window ViewRepo ELSE ViewRepo.Show ENDIF Return Nil Procedure PrintRepo() Local oObject oObject := GetProperty( 'ViewRepo', 'acxYoksel', 'Object' ) oObject:GetControl():Document:Print( 1 ) Return Procedure PrintOptions() Local oObject oObject := GetProperty( 'ViewRepo', 'acxYoksel', 'Object' ) oObject:GetControl():Document:ShowPageSetupDialog() Return Procedure Save2Excel( cFName ) Local cExt, cSaveFile, nIndex := 1, oObject cSaveFile := PutFile( {{"Excel files (*.xls)", "*.xls"}} ,"Сохранить как..." , , ,cFName ) cExt := "xls" IF !EMPTY( cSaveFile) oObject := GetProperty( 'ViewRepo', 'acxYoksel', 'Object' ) oObject:GetControl():Document:Save( cSaveFile , 1 ) ENDIF Return Procedure Show_Repo( cNameRepo ) Local oObject oObject := GetProperty( 'ViewRepo', 'acxYoksel', 'Object' ) oObject:GetControl():Document:Open( cNameRepo , 2 ) oObject:GetControl():ReadOnly( 0 ) Return Procedure Adjust_ViewRepo() // ROW 32 // COL 0 SetProperty( "ViewRepo" , "acxYoksel" , "width" , GetProperty( "ViewRepo" , "width" ) - 07 ) SetProperty( "ViewRepo" , "acxYoksel" , "height" , GetProperty( "ViewRepo" , "height" ) - 102 ) Return #include "ActiveX.prg"

leo: yury пишет: Да не вопрос. Большое спасибо!

pasergey: А, для экспорта в файлы ODS OpenOffice есть библиотеки?

Pasha: pasergey пишет: А, для экспорта в файлы ODS OpenOffice есть библиотеки? Эта тема обсуждалась на форуе неоднократно, например - здесь: http://clipper.borda.ru/?1-4-0-00000214-000-0-0-1249881802 Можно просто сделать поиск по форуму по ключевому слову openoffice Если вкратце ответ - то можно. Про библиотеки - не знаю, может и есть А какой экспорт нужен ? Я к примеру использую документы ods как шаблон с закладками, и в закладки заношу информацию. Или в таблицы.

MIKHAIL: yury пишет: Пользуюсь Йокселем как ActiveX объектом создает, читает, печатает, редактирует excel 97-2003 (выше пока не надо ). http://yoksel.net.ru ЗЫ. Также читает и пишет в формате ( mxl - 1Cv77 ) - так что можно тягать формы прямо из 1С А что можно использовать для mxl - 1C8.2 ? Видно новый формат не поддерживает Йоксель



полная версия страницы