Java如何操作OpenOffice创建一个.doc文件,并且向这个文件输入值呢?
求高手指点。

解决方案 »

  1.   

    http://www.artofsolving.com/opensource/jodconverter调用他的API,可以通过UNO访问OpenOffice进行文档转换。但是新建没做过。估计需要直接访问UNO的API
      

  2.   

    OpenOffice java api:简单的说就是利用java程序可以操作OpenOffice的所有功能,比如创建doc文档,插入文字,设置文字格式等等。 1. OpenOffice 给程序员提供了一个叫UNO (UniversalNetwork Objects)的组件技术.我理解的UNO: OpenOffice 类似于web程序中的服务器,程序员写的代码类似于客户端,利用UNO提供的接口和服务去完成对OpenOffice文档的操作。所以写程序首先要搭建 UNO环境:1. 下载 OpenOffice: http://download.openoffice.org/index.html. (ps :一定要安装 Software Development Kit (SDK) )2.复制UNO提供的jar包: unoil.jar, java_uno.jar, juh.jar, jurt.jar, ridl.jar, unoloader.jar. (ps: 安装了SDK之后在文件夹找)到自己的工程中,引入它们。3. 下载文档:DevelopersGuide.pdf. http://api.openoffice.org/docs/DevelopersGuide/DevelopersGuide.pdf4. 安装了SDK后,重新启动一下机器,然后就可以按照 DevelopersGuide 来学习 UNO 编程了。5. 需要ava 环境。 补充: 安装了SDK后, java, c++帮助文档,样例程序,其他关于sdk的信息 都放在本地openOffice安装路径一个叫sdk目录下面,enjoy it ! 总结一下已经实现的功能和碰到的问题汇总:1. 首先要得到远程office组件的上下文.通过:com.sun.star.uno.XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();得到,如果OpenOffice安装路径不是在工程的路径下面(我自己猜的), 就会报:com.sun.star.comp.helper.BootstrapException: no office executable found!解决办法: 黑其源代码,  看了源代码就会发现其实OpenOffice是在寻找本地的soffice的shell文件,所以弄个变量来保存soffice在系统中的路径,重新写一 个Bootstrap就可以了。详细请参照:论坛 。 2. 得到 XMultiComponentFactory (ComponentFactory 工厂)com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager(); 3. 得到各种组件可以通过下面代码:// docType 是 与 soffice 同目录下面的OpenOffice的其他shell文件,swrite等等    protected XComponent newDocComponent(String docType)
                throws java.lang.Exception {
            String loadUrl = "private:factory/" + docType;
            
            mxRemoteServiceManager = this.getRemoteServiceManager();
            Object desktop = mxRemoteServiceManager.createInstanceWithContext(
                    "com.sun.star.frame.Desktop", mxRemoteContext);
            
            XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime
                    .queryInterface(XComponentLoader.class, desktop);
            PropertyValue[] loadProps = new PropertyValue[0];
            
            return xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0,
                    loadProps);
        } 4.得到 XTextDocument       XComponent xEmptyWriterComponent = newDocComponent("swriter");        XTextDocument mxDoc = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,
                    xEmptyWriterComponent);5. 得到一个文档的引用XText mxDocText = mxDoc.getText();6. 得到文档的属性列表        XPropertySet mxDocProps = (XPropertySet) UnoRuntime.queryInterface(
                    XPropertySet.class, mxDoc); 7. 建立光标,用来插入新的内容。XTextCursor mxDocCursor = mxDocText.createTextCursor();        XSentenceCursor xSentenceCursor = (XSentenceCursor) UnoRuntime
            .queryInterface(XSentenceCursor.class, mxDocCursor);
            
            XWordCursor xWordCursor = (XWordCursor) UnoRuntime.queryInterface(
                    XWordCursor.class, mxDocCursor); 8.得到光标属性列表      XPropertySet xCursorProps = (XPropertySet) UnoRuntime .queryInterface(XPropertySet.class, mxDocCursor);9.设置插入文字格式        xCursorProps.setPropertyValue("CharFontName", "宋体");
            xCursorProps.setPropertyValue("CharWeight", new Float(FontWeight.BOLD));
            xCursorProps.setPropertyValue("CharHeight", new Float(10.5));
            // 居中显示
            xCursorProps.setPropertyValue("ParaAdjust", com.sun.star.style.ParagraphAdjust.CENTER);10.在该光标处插入信息mxDocText.insertString(xSentenceCursor, “Hello World", true); 11. 保存的关键代码    protected void storeDocComponent(XComponent xDoc, String storeUrl)
                throws java.lang.Exception {        XStorable xStorable = (XStorable) UnoRuntime.queryInterface(
                    XStorable.class, xDoc);
            PropertyValue[] storeProps = new PropertyValue[1];
            storeProps[0] = new PropertyValue();
            storeProps[0].Name = "FilterName";
            storeProps[0].Value = "MS Word 97";        openOfficeJavaLogger.debug("... store \"" + xDoc.toString() + "\" to \"" + storeUrl
                    + "\".");        xStorable.storeAsURL(storeUrl, storeProps);
        }这篇教程写的不错,分享一下呵呵
      

  3.   

    算你狠! 我自己写类测试的时候为什么会出现 java.lang.NullPointerException 呢?比如用XTextDocument.getText(); 时。这个大概会是什么原因呢?