Difference between revisions of "Documentation/DevGuide/FirstSteps/Example: Working with a Spreadsheet Document"

From Apache OpenOffice Wiki
Jump to: navigation, search
m
 
(14 intermediate revisions by 6 users not shown)
Line 4: Line 4:
 
|PrevPage=Documentation/DevGuide/FirstSteps/Using Services
 
|PrevPage=Documentation/DevGuide/FirstSteps/Using Services
 
|NextPage=Documentation/DevGuide/FirstSteps/Common Types
 
|NextPage=Documentation/DevGuide/FirstSteps/Common Types
}}
+
}}  
[[zh:Zh/Documentation/DevGuide/FirstSteps/Example:_Working_with_a_Spreadsheet_Document]]
+
{{Documentation/DevGuideLanguages|Documentation/DevGuide/FirstSteps/{{SUBPAGENAME}}}}
 
{{DISPLAYTITLE:Example: Working with a Spreadsheet Document}}
 
{{DISPLAYTITLE:Example: Working with a Spreadsheet Document}}
In this example, we will ask the remote service manager to give us the remote <code>Desktop</code> object and use its <code>loadComponentFromURL()</code> method to create a new spreadsheet document. From the document we get its sheets container where we insert and access a new sheet by name. In the new sheet, we enter values into A1 and A2 and summarize them in A3. The cell style of the summarizing cell gets the cell style Result, so that it appears in italics, bold and underlined. Finally, we make our new sheet the active sheet, so that the user can see it.
+
In this example, we will use the simple bootstrap mechanism ([https://www.openoffice.org/api/docs/java/ref/com/sun/star/comp/helper/Bootstrap.html#Bootstrap() com.sun.star.comp.helper.Bootstrap.Bootstrap()]) to get the remote office context of a running office instance and ask the remote service manager to give us the remote <code><idls>com.sun.star.frame.Desktop</idls></code> object and use its <code><idlm>com.sun.star.frame.XComponentLoader:loadComponentFromURL</idlm>()</code> method to create a new spreadsheet document. From the document we get its sheets container where we insert and access a new sheet by name. In the new sheet, we enter values into A1 and A2 and summarize them in A3. The cell style of the summarizing cell gets the cell style Result, so that it appears in italics, bold and underlined. Finally, we make our new sheet the active sheet, so that the user can see it.
Add these import lines to the FirstConnection example above: <!--[SOURCE:FirstSteps/FirstLoadComponent.java]-->
+
Add the following code in a new generated [https://wiki.openoffice.org/wiki/OpenOffice_Simple_UNO_Client_Application_Project_Type NetBeans UNO client application] project FirstLoadComponent:
  
  <source lang="java">
+
<!--[SOURCE:FirstSteps/FirstLoadComponent.java]-->
  import com.sun.star.beans.PropertyValue;
+
<syntaxhighlight lang="java">
  import com.sun.star.lang.XComponent;
+
package ooo.sdk.devguide.firststeps;
  import com.sun.star.sheet.XSpreadsheetDocument;
 
  import com.sun.star.sheet.XSpreadsheets;
 
  import com.sun.star.sheet.XSpreadsheet;
 
  import com.sun.star.sheet.XSpreadsheetView;
 
  import com.sun.star.table.XCell;
 
  import com.sun.star.frame.XModel;
 
  import com.sun.star.frame.XController;
 
  import com.sun.star.frame.XComponentLoader;
 
  </source>
 
  
 +
import com.sun.star.beans.PropertyValue;
 +
import com.sun.star.beans.XPropertySet;
 +
import com.sun.star.uno.XComponentContext;
 +
import com.sun.star.comp.helper.Bootstrap;
 +
import com.sun.star.container.XEnumeration;
 +
import com.sun.star.container.XEnumerationAccess;
 +
import com.sun.star.frame.XComponentLoader;
 +
import com.sun.star.frame.XController;
 +
import com.sun.star.frame.XModel;
 +
import com.sun.star.lang.XComponent;
 +
import com.sun.star.lang.XMultiComponentFactory;
 +
import com.sun.star.sheet.XCellAddressable;
 +
import com.sun.star.sheet.XCellRangesQuery;
 +
import com.sun.star.sheet.XSheetCellRanges;
 +
import com.sun.star.sheet.XSpreadsheet;
 +
import com.sun.star.sheet.XSpreadsheetDocument;
 +
import com.sun.star.sheet.XSpreadsheetView;
 +
import com.sun.star.sheet.XSpreadsheets;
 +
import com.sun.star.table.XCell;
 +
import com.sun.star.uno.UnoRuntime;
  
 +
public class FirstLoadComponent {
 +
   
 +
    /** Creates a new instance of FirstLoadComponent */
 +
    public FirstLoadComponent() {
 +
    }
 +
   
 +
    /**
 +
    * @param args the command line arguments
 +
    */
 +
    public static void main(String[] args) {
 +
        try {
 +
            // get the remote office component context
 +
            XComponentContext xRemoteContext = Bootstrap.bootstrap();
 +
            if (xRemoteContext == null) {
 +
                System.err.println("ERROR: Could not bootstrap default Office.");
 +
            }
  
 +
            XMultiComponentFactory xRemoteServiceManager = xRemoteContext.getServiceManager();
  
 +
            Object desktop = xRemoteServiceManager.createInstanceWithContext(
 +
                "com.sun.star.frame.Desktop", xRemoteContext);
 +
            XComponentLoader xComponentLoader = (XComponentLoader)
 +
                UnoRuntime.queryInterface(XComponentLoader.class, desktop);
  
 +
            PropertyValue[] loadProps = new PropertyValue[0];
 +
            XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps);
  
 +
            XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)
 +
                UnoRuntime.queryInterface(XSpreadsheetDocument.class,
 +
                                          xSpreadsheetComponent);
  
 +
            XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
 +
            xSpreadsheets.insertNewByName("MySheet", (short)0);
 +
            com.sun.star.uno.Type elemType = xSpreadsheets.getElementType();
  
Edit the <code>useConnection</code> method as follows:
+
            System.out.println(elemType.getTypeName());
 +
            Object sheet = xSpreadsheets.getByName("MySheet");
 +
            XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(
 +
                XSpreadsheet.class, sheet);
 +
 
 +
            XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
 +
            xCell.setValue(21);
 +
            xCell = xSpreadsheet.getCellByPosition(0, 1);
 +
            xCell.setValue(21);
 +
            xCell = xSpreadsheet.getCellByPosition(0, 2);
 +
            xCell.setFormula("=sum(A1:A2)");
 +
 
 +
            XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface(
 +
                XPropertySet.class, xCell);
 +
            xCellProps.setPropertyValue("CellStyle", "Result");
 +
 
 +
            XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(
 +
                XModel.class, xSpreadsheetComponent);
 +
            XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
 +
            XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)
 +
                UnoRuntime.queryInterface(XSpreadsheetView.class,
 +
                                          xSpreadsheetController);
 +
            xSpreadsheetView.setActiveSheet(xSpreadsheet);
 +
 
 +
            // *********************************************************
 +
            // example for use of enum types
 +
            xCellProps.setPropertyValue("VertJustify",
 +
                                        com.sun.star.table.CellVertJustify.TOP);
 +
 
 +
 
 +
            // *********************************************************
 +
            // example for a sequence of PropertyValue structs
 +
            // create an array with one PropertyValue struct, it contains
 +
            // references only
 +
            loadProps = new PropertyValue[1];
 +
 
 +
            // instantiate PropertyValue struct and set its member fields
 +
            PropertyValue asTemplate = new PropertyValue();
 +
            asTemplate.Name = "AsTemplate";
 +
            asTemplate.Value = new Boolean(true);
 +
 
 +
            // assign PropertyValue struct to array of references for PropertyValue
 +
            // structs
 +
            loadProps[0] = asTemplate;
 +
 
 +
            // load calc file as template
 +
            //xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
 +
            //    "file:///c:/temp/DataAnalysys.ods", "_blank", 0, loadProps);
 +
 
 +
            // *********************************************************
 +
            // example for use of XEnumerationAccess
 +
            XCellRangesQuery xCellQuery = (XCellRangesQuery)
 +
                UnoRuntime.queryInterface(XCellRangesQuery.class, sheet);
 +
            XSheetCellRanges xFormulaCells = xCellQuery.queryContentCells(
 +
                (short)com.sun.star.sheet.CellFlags.FORMULA);
 +
            XEnumerationAccess xFormulas = xFormulaCells.getCells();
 +
            XEnumeration xFormulaEnum = xFormulas.createEnumeration();
 +
 
 +
            while (xFormulaEnum.hasMoreElements()) {
 +
                Object formulaCell = xFormulaEnum.nextElement();
 +
                xCell = (XCell)UnoRuntime.queryInterface(XCell.class, formulaCell);
 +
                XCellAddressable xCellAddress = (XCellAddressable)
 +
                    UnoRuntime.queryInterface(XCellAddressable.class, xCell);
 +
                System.out.println("Formula cell in column " +
 +
                                  xCellAddress.getCellAddress().Column
 +
                                  + ", row " + xCellAddress.getCellAddress().Row
 +
                                  + " contains " + xCell.getFormula());
 +
            }
  
  <source lang="java">
 
  protected void useConnection() throws java.lang.Exception {
 
        try {
 
            // get the remote office component context
 
            xRemoteContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
 
            System.out.println("Connected to a running office ...");
 
               
 
            xRemoteServiceManager = xRemoteContext.getServiceManager();
 
 
         }
 
         }
         catch( Exception e) {
+
         catch (java.lang.Exception e){
 
             e.printStackTrace();
 
             e.printStackTrace();
            System.exit(1);
 
 
         }
 
         }
 
+
        finally {
  try {
+
             System.exit( 0 );
        // get the Desktop, we need its XComponentLoader interface to load a new document
+
         }
        Object desktop = xRemoteServiceManager.createInstanceWithContext(
 
            "com.sun.star.frame.Desktop", xRemoteContext);
 
       
 
        // query the XComponentLoader interface from the desktop
 
        XComponentLoader xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
 
            XComponentLoader.class, desktop);
 
 
 
        // create empty array of PropertyValue structs, needed for loadComponentFromURL
 
        PropertyValue[] loadProps = new PropertyValue[0];
 
       
 
        // load new calc file
 
        XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
 
            "private:factory/scalc", "_blank", 0, loadProps);
 
 
 
        // query its XSpreadsheetDocument interface, we want to use getSheets()
 
        XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface(
 
            XSpreadsheetDocument.class, xSpreadsheetComponent);
 
 
 
        // use getSheets to get spreadsheets container
 
        XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
 
 
 
        //insert new sheet at position 0 and get it by name, then query its XSpreadsheet interface
 
        xSpreadsheets.insertNewByName("MySheet", (short)0);
 
        Object sheet = xSpreadsheets.getByName("MySheet");
 
        XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(
 
             XSpreadsheet.class, sheet);
 
 
 
        // use XSpreadsheet interface to get the cell A1 at position 0,0 and enter 21 as value
 
        XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
 
         xCell.setValue(21);
 
 
 
        // enter another value into the cell A2 at position 0,1
 
        xCell = xSpreadsheet.getCellByPosition(0, 1);
 
        xCell.setValue(21);
 
 
 
        // sum up the two cells
 
        xCell = xSpreadsheet.getCellByPosition(0, 2);
 
        xCell.setFormula("=sum(A1:A2)");
 
 
 
        // we want to access the cell property CellStyle, so query the cell's XPropertySet interface
 
        XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface(
 
            XPropertySet.class, xCell);
 
 
 
        // assign the cell style "Result" to our formula, which is available out of the box
 
        xCellProps.setPropertyValue("CellStyle", "Result");
 
 
 
        // we want to make our new sheet the current sheet, so we need to ask the model
 
        // for the controller: first query the XModel interface from our spreadsheet component
 
        XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(
 
          XModel.class, xSpreadsheetComponent);
 
       
 
        // then get the current controller from the model
 
        XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
 
 
 
        // get the XSpreadsheetView interface from the controller, we want to call its method
 
        // setActiveSheet
 
        XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)UnoRuntime.queryInterface(
 
          XSpreadsheetView.class, xSpreadsheetController);
 
 
 
        // make our newly inserted sheet the active sheet using setActiveSheet
 
        xSpreadsheetView.setActiveSheet(xSpreadsheet);   
 
 
     }
 
     }
     catch( com.sun.star.lang.DisposedException e ) { //works from Patch 1
+
      
        xRemoteContext = null;
+
}
        throw e;
+
</syntaxhighlight>
    }         
 
  }
 
  </source>
 
  
 
Alternatively, you can add ''FirstLoadComponent.java'' from the samples directory to your current project, it contains the changes shown above.
 
Alternatively, you can add ''FirstLoadComponent.java'' from the samples directory to your current project, it contains the changes shown above.
Line 121: Line 155:
 
{{PDL1}}
 
{{PDL1}}
  
[[Category:Documentation/Developers Guide/First Steps]]
+
[[Category:Documentation/Developer's Guide/First Steps]]

Latest revision as of 11:15, 18 May 2022



In this example, we will use the simple bootstrap mechanism (com.sun.star.comp.helper.Bootstrap.Bootstrap()) to get the remote office context of a running office instance and ask the remote service manager to give us the remote Desktop object and use its loadComponentFromURL() method to create a new spreadsheet document. From the document we get its sheets container where we insert and access a new sheet by name. In the new sheet, we enter values into A1 and A2 and summarize them in A3. The cell style of the summarizing cell gets the cell style Result, so that it appears in italics, bold and underlined. Finally, we make our new sheet the active sheet, so that the user can see it. Add the following code in a new generated NetBeans UNO client application project FirstLoadComponent:

package ooo.sdk.devguide.firststeps;

import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.uno.XComponentContext;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XEnumeration;
import com.sun.star.container.XEnumerationAccess;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.sheet.XCellAddressable;
import com.sun.star.sheet.XCellRangesQuery;
import com.sun.star.sheet.XSheetCellRanges;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheetView;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.table.XCell;
import com.sun.star.uno.UnoRuntime;

public class FirstLoadComponent {
    
    /** Creates a new instance of FirstLoadComponent */
    public FirstLoadComponent() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // get the remote office component context
            XComponentContext xRemoteContext = Bootstrap.bootstrap();
            if (xRemoteContext == null) {
                System.err.println("ERROR: Could not bootstrap default Office.");
            }

            XMultiComponentFactory xRemoteServiceManager = xRemoteContext.getServiceManager();

            Object desktop = xRemoteServiceManager.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xRemoteContext);
            XComponentLoader xComponentLoader = (XComponentLoader)
                UnoRuntime.queryInterface(XComponentLoader.class, desktop);

            PropertyValue[] loadProps = new PropertyValue[0];
            XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps);

            XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)
                UnoRuntime.queryInterface(XSpreadsheetDocument.class,
                                          xSpreadsheetComponent);

            XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
            xSpreadsheets.insertNewByName("MySheet", (short)0);
            com.sun.star.uno.Type elemType = xSpreadsheets.getElementType();

            System.out.println(elemType.getTypeName());
            Object sheet = xSpreadsheets.getByName("MySheet");
            XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(
                XSpreadsheet.class, sheet);

            XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
            xCell.setValue(21);
            xCell = xSpreadsheet.getCellByPosition(0, 1);
            xCell.setValue(21);
            xCell = xSpreadsheet.getCellByPosition(0, 2);
            xCell.setFormula("=sum(A1:A2)");

            XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface(
                XPropertySet.class, xCell);
            xCellProps.setPropertyValue("CellStyle", "Result");

            XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(
                XModel.class, xSpreadsheetComponent);
            XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
            XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)
                UnoRuntime.queryInterface(XSpreadsheetView.class,
                                          xSpreadsheetController);
            xSpreadsheetView.setActiveSheet(xSpreadsheet);

            // *********************************************************
            // example for use of enum types
            xCellProps.setPropertyValue("VertJustify",
                                        com.sun.star.table.CellVertJustify.TOP);


            // *********************************************************
            // example for a sequence of PropertyValue structs
            // create an array with one PropertyValue struct, it contains
            // references only
            loadProps = new PropertyValue[1];

            // instantiate PropertyValue struct and set its member fields
            PropertyValue asTemplate = new PropertyValue();
            asTemplate.Name = "AsTemplate";
            asTemplate.Value = new Boolean(true);

            // assign PropertyValue struct to array of references for PropertyValue
            // structs
            loadProps[0] = asTemplate;

            // load calc file as template
            //xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
            //    "file:///c:/temp/DataAnalysys.ods", "_blank", 0, loadProps);

            // *********************************************************
            // example for use of XEnumerationAccess
            XCellRangesQuery xCellQuery = (XCellRangesQuery)
                UnoRuntime.queryInterface(XCellRangesQuery.class, sheet);
            XSheetCellRanges xFormulaCells = xCellQuery.queryContentCells(
                (short)com.sun.star.sheet.CellFlags.FORMULA);
            XEnumerationAccess xFormulas = xFormulaCells.getCells();
            XEnumeration xFormulaEnum = xFormulas.createEnumeration();

            while (xFormulaEnum.hasMoreElements()) {
                Object formulaCell = xFormulaEnum.nextElement();
                xCell = (XCell)UnoRuntime.queryInterface(XCell.class, formulaCell);
                XCellAddressable xCellAddress = (XCellAddressable)
                    UnoRuntime.queryInterface(XCellAddressable.class, xCell);
                System.out.println("Formula cell in column " +
                                   xCellAddress.getCellAddress().Column
                                   + ", row " + xCellAddress.getCellAddress().Row
                                   + " contains " + xCell.getFormula());
            }

        }
        catch (java.lang.Exception e){
            e.printStackTrace();
        }
        finally {
            System.exit( 0 );
        }
    }
    
}

Alternatively, you can add FirstLoadComponent.java from the samples directory to your current project, it contains the changes shown above.

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages