2013-01-21 6 views
1

사용자 입력을 Java로 LibreOffice/OpenOffice 스프레드 시트에 추적하고 싶습니다. 현재, 나는 the first LibreOffice examples 시작하고 (here를 볼 때) 아마 OpenOffice 스프레드 시트 리스너

  • com.sun.star.container.XContainerListener 스프레드 시트에하는

    • com.sun.star.chart.XChartDataChangeEventListener에 비슷한 부착하고 싶습니다.

    XSpreadsheetDocument를 XContainer로 변환하려고 할 때 NullPointerException이 발생했습니다. 나는 탐색 악명 하드 API 문서를 찾아 방법에 힌트 감사 할 것입니다 : XSpreadsheetDocument의 유형 계층 밖으로

    • 그림,
    • 있는 수신기에 연결되는 인터페이스 및
    • 공장 해당 인터페이스 추측을 통해
  • 답변

    1

    에 체인, 나는 private:factory/scalc에서로드 XComponentcom.sun.star.util.XModifyBroadcaster을 인터페이스 주조 할 수있는 서비스에 속하는 승, 알 수 있었다 hich는 com.sun.star.util.XModifyListener의 설치를 허용합니다.

    import com.sun.star.beans.PropertyValue; 
    import com.sun.star.comp.helper.Bootstrap; 
    import com.sun.star.comp.helper.BootstrapException; 
    import com.sun.star.frame.XComponentLoader; 
    import com.sun.star.lang.EventObject; 
    import com.sun.star.lang.XComponent; 
    import com.sun.star.lang.XMultiComponentFactory; 
    import com.sun.star.sheet.XSpreadsheetDocument; 
    import com.sun.star.uno.Exception; 
    import com.sun.star.uno.UnoRuntime; 
    import com.sun.star.uno.XComponentContext; 
    import com.sun.star.util.XModifyBroadcaster; 
    
    public class CalcListener { 
        public static void main(String[] args) { 
         try { 
          // Lots of verbose code to get a Document instance 
          final XComponentContext xRemoteContext = Bootstrap.bootstrap(); 
          if(xRemoteContext == null) { 
           System.err.println("ERROR: Could not bootstrap default Office."); 
           return; 
          } 
          final XMultiComponentFactory xRemoteServiceManager = xRemoteContext.getServiceManager(); 
          final Object desktop = xRemoteServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", xRemoteContext); 
          final XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop); 
    
          final PropertyValue[] loadProps = new PropertyValue[0]; 
          final XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps); 
    
          // Cast to interface Document, to do anything useful later 
          final XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, xSpreadsheetComponent); 
    
          // Cast to interface XModifyBroadcaster to attach listener 
          final XModifyBroadcaster messageHost = (XModifyBroadcaster) UnoRuntime.queryInterface(XModifyBroadcaster.class, xSpreadsheetDocument); 
          messageHost.addModifyListener(new XModifyListener() 
          { 
           public void modified(EventObject eo) { 
            System.out.println("modified:"+eo.Source); 
           } 
    
           public void disposing(EventObject eo) { 
            System.out.println("disposing:"+eo); 
           } 
          }); 
    
          // Do possibly useful stuff 
          // ... 
    
         } catch (BootstrapException | Exception ex) { 
          System.err.println("bad things happened:"+ex); 
         } 
        } 
    } 
    
    +0

    내가 수동으로 클래스 패스에이 시간에 (은/usr/lib 디렉토리/URE/lib에) libjpipe.so하는 경로를 추가했다 :

    다음은 작업 예입니다. –

    +0

    왜 LibreOffice는 이처럼 명확한 것을 제공하지 않습니까? 잘 했어 고마워. – user1501247