/*************************************************************************
*
* $RCSfile: SCalc.java,v $
*
* $Revision: 1.3 $
*
* last change: $Author: hr $ $Date: 2003/06/30 15:58:44 $
*
* The Contents of this file are made available subject to the terms of
* the BSD license.
*
* Copyright (c) 2003 by Sun Microsystems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Sun Microsystems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*************************************************************************/
//***************************************************************************
// comment: Step 1: connect to the office an get the MSF
// Step 2: open an empty calc document
// Step 3: create cell styles
// Step 4: get the sheet an insert some data
// Step 5: apply the created cell syles
// Step 6: insert a 3D Chart
//***************************************************************************
// base interface
import com.sun.star.uno.XInterface;
// access the implementations via names
import com.sun.star.comp.servicemanager.ServiceManager;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.connection.XConnector;
import com.sun.star.connection.XConnection;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.XNamingService;
import com.sun.star.uno.XComponentContext;
// staroffice interfaces to provide desktop and componentloader
// and components i.e. spreadsheets, writerdocs etc.
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XComponentLoader;
// additional classes required
import com.sun.star.sheet.*;
import com.sun.star.container.*;
import com.sun.star.table.*;
import com.sun.star.beans.*;
import com.sun.star.style.*;
import com.sun.star.lang.*;
import com.sun.star.text.*;
import com.sun.star.chart.*;
import com.sun.star.document.*;
import com.sun.star.awt.Rectangle;
public class SCalc {
public static void main(String args[]) {
//oooooooooooooooooooooooooooStep 1oooooooooooooooooooooooooooooooooooooooooo
// connect to the office an get the MultiServiceFactory
// this is necessary to create instances of Services
//***************************************************************************
String sConnectionString = "uno:socket,host=localhost,port=8100;urp;StarOffice.NamingService";
// It is possible to use a different connection string, passed as argument
if ( args.length == 1 ) {
sConnectionString = args[0];
}
XMultiServiceFactory xMSF = null;
XSpreadsheetDocument myDoc = null;
XCell oCell = null;
// create connection(s) and get multiservicefactory
// create connection(s) and get multiservicefactory
System.out.println( "getting MultiServiceFactory" );
try {
xMSF = connect( sConnectionString );
} catch( com.sun.star.uno.RuntimeException Ex ) {
System.out.println( "Couldn't get MSF"+ Ex.getMessage() );
return;
} catch( Exception Ex ) {
}
//***************************************************************************
//oooooooooooooooooooooooooooStep 2oooooooooooooooooooooooooooooooooooooooooo
// open an empty document. In this case it's a calc document.
// For this purpose an instance of com.sun.star.frame.Desktop
// is created. It's interface XDesktop provides the XComponentLoader,
// which is used to open the document via loadComponentFromURL
//***************************************************************************
//Open document
//Calc
System.out.println("Opening an empty Calc document");
myDoc = openCalc(xMSF);
//***************************************************************************
//oooooooooooooooooooooooooooStep 3oooooooooooooooooooooooooooooooooooooooooo
// create cell styles.
// For this purpose get the StyleFamiliesSupplier and the the familiy
// CellStyle. Create an instance of com.sun.star.style.CellStyle and
// add it to the family. Now change some properties
//***************************************************************************
try {
XStyleFamiliesSupplier xSFS = (XStyleFamiliesSupplier) UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, myDoc);
XNameAccess xSF = (XNameAccess) xSFS.getStyleFamilies();
XNameAccess xCS = (XNameAccess) UnoRuntime.queryInterface(
XNameAccess.class, xSF.getByName("CellStyles"));
XMultiServiceFactory oDocMSF = (XMultiServiceFactory) UnoRuntime.queryInterface(
XMultiServiceFactory.class, myDoc );
XNameContainer oStyleFamilyNameContainer = (XNameContainer) UnoRuntime.queryInterface(
XNameContainer.class, xCS);
XInterface oInt1 = (XInterface) oDocMSF.createInstance("com.sun.star.style.CellStyle");
oStyleFamilyNameContainer.insertByName("My Style", oInt1);
XPropertySet oCPS1 = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, oInt1 );
oCPS1.setPropertyValue("IsCellBackgroundTransparent", new Boolean(false));
oCPS1.setPropertyValue("CellBackColor",new Integer(6710932));
oCPS1.setPropertyValue("CharColor",new Integer(16777215));
XInterface oInt2 = (XInterface) oDocMSF.createInstance("com.sun.star.style.CellStyle");
oStyleFamilyNameContainer.insertByName("My Style2", oInt2);
XPropertySet oCPS2 = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, oInt2 );
oCPS2.setPropertyValue("IsCellBackgroundTransparent", new Boolean(false));
oCPS2.setPropertyValue("CellBackColor",new Integer(13421823));
} catch (Exception e) {
}
//***************************************************************************
//oooooooooooooooooooooooooooStep 4oooooooooooooooooooooooooooooooooooooooooo
// get the sheet an insert some data.
// Get the sheets from the document and then the first from this container.
// Now some data can be inserted. For this purpose get a Cell via
// getCellByPosition and insert into this cell via setValue() (for floats)
// or setFormula() for formulas and Strings
//***************************************************************************
XSpreadsheet oSheet=null;
try {
System.out.println("Getting spreadsheet") ;
XSpreadsheets oSheets = myDoc.getSheets() ;
XIndexAccess oIndexSheets = (XIndexAccess) UnoRuntime.queryInterface(
XIndexAccess.class, oSheets);
oSheet = (XSpreadsheet) UnoRuntime.queryInterface(
XSpreadsheet.class, oIndexSheets.getByIndex(0));
} catch (Exception e) {
System.out.println("Couldn't get Sheet " +e);
}
System.out.println("Creating the Header") ;
insertIntoCell(1,0,"JAN",oSheet,"");
insertIntoCell(2,0,"FEB",oSheet,"");
insertIntoCell(3,0,"MAR",oSheet,"");
insertIntoCell(4,0,"APR",oSheet,"");
insertIntoCell(5,0,"MAI",oSheet,"");
insertIntoCell(6,0,"JUN",oSheet,"");
insertIntoCell(7,0,"JUL",oSheet,"");
insertIntoCell(8,0,"AUG",oSheet,"");
insertIntoCell(9,0,"SEP",oSheet,"");
insertIntoCell(10,0,"OCT",oSheet,"");
insertIntoCell(11,0,"NOV",oSheet,"");
insertIntoCell(12,0,"DEC",oSheet,"");
insertIntoCell(13,0,"SUM",oSheet,"");
System.out.println("Fill the lines");
insertIntoCell(0,1,"Smith",oSheet,"");
insertIntoCell(1,1,"42",oSheet,"V");
insertIntoCell(2,1,"58.9",oSheet,"V");
insertIntoCell(3,1,"-66.5",oSheet,"V");
insertIntoCell(4,1,"43.4",oSheet,"V");
insertIntoCell(5,1,"44.5",oSheet,"V");
insertIntoCell(6,1,"45.3",oSheet,"V");
insertIntoCell(7,1,"-67.3",oSheet,"V");
insertIntoCell(8,1,"30.5",oSheet,"V");
insertIntoCell(9,1,"23.2",oSheet,"V");
insertIntoCell(10,1,"-97.3",oSheet,"V");
insertIntoCell(11,1,"22.4",oSheet,"V");
insertIntoCell(12,1,"23.5",oSheet,"V");
insertIntoCell(13,1,"=SUM(B2:M2)",oSheet,"");
insertIntoCell(0,2,"Jones",oSheet,"");
insertIntoCell(1,2,"21",oSheet,"V");
insertIntoCell(2,2,"40.9",oSheet,"V");
insertIntoCell(3,2,"-57.5",oSheet,"V");
insertIntoCell(4,2,"-23.4",oSheet,"V");
insertIntoCell(5,2,"34.5",oSheet,"V");
insertIntoCell(6,2,"59.3",oSheet,"V");
insertIntoCell(7,2,"27.3",oSheet,"V");
insertIntoCell(8,2,"-38.5",oSheet,"V");
insertIntoCell(9,2,"43.2",oSheet,"V");
insertIntoCell(10,2,"57.3",oSheet,"V");
insertIntoCell(11,2,"25.4",oSheet,"V");
insertIntoCell(12,2,"28.5",oSheet,"V");
insertIntoCell(13,2,"=SUM(B3:M3)",oSheet,"");
insertIntoCell(0,3,"Brown",oSheet,"");
insertIntoCell(1,3,"31.45",oSheet,"V");
insertIntoCell(2,3,"-20.9",oSheet,"V");
insertIntoCell(3,3,"-117.5",oSheet,"V");
insertIntoCell(4,3,"23.4",oSheet,"V");
insertIntoCell(5,3,"-114.5",oSheet,"V");
insertIntoCell(6,3,"115.3",oSheet,"V");
insertIntoCell(7,3,"-171.3",oSheet,"V");
insertIntoCell(8,3,"89.5",oSheet,"V");
insertIntoCell(9,3,"41.2",oSheet,"V");
insertIntoCell(10,3,"71.3",oSheet,"V");
insertIntoCell(11,3,"25.4",oSheet,"V");
insertIntoCell(12,3,"38.5",oSheet,"V");
insertIntoCell(13,3,"=SUM(A4:L4)",oSheet,"");
//***************************************************************************
//oooooooooooooooooooooooooooStep 5oooooooooooooooooooooooooooooooooooooooooo
// apply the created cell style.
// For this purpose get the PropertySet of the Cell and change the
// property CellStyle to the appropriate value.
//***************************************************************************
// change backcolor
chgbColor( 1 , 0, 13, 0, "My Style", oSheet );
chgbColor( 0 , 1, 0, 3, "My Style", oSheet );
chgbColor( 1 , 1, 13, 3, "My Style2", oSheet );
//***************************************************************************
//oooooooooooooooooooooooooooStep 6oooooooooooooooooooooooooooooooooooooooooo
// insert a 3D chart.
// get the CellRange which holds the data for the chart and its RangeAddress
// get the TableChartSupplier from the sheet and then the TableCharts from it.
// add a new chart based on the data to the TableCharts.
// get the ChartDocument, which provide the Diagramm. Change the properties
// Dim3D (3 dimension) and String (the title) of the diagramm.
//***************************************************************************
// insert a chart
Rectangle oRect = new Rectangle();
oRect.X = 500;
oRect.Y = 3000;
oRect.Width = 25000;
oRect.Height = 11000;
XCellRange oRange = (XCellRange)UnoRuntime.queryInterface(XCellRange.class, oSheet);
XCellRange myRange = oRange.getCellRangeByName("A1:N4");
XCellRangeAddressable oRangeAddr = (XCellRangeAddressable)UnoRuntime.queryInterface(
XCellRangeAddressable.class, myRange);
CellRangeAddress myAddr = oRangeAddr.getRangeAddress();
CellRangeAddress[] oAddr = new CellRangeAddress[1];
oAddr[0] = myAddr;
XTableChartsSupplier oSupp = (XTableChartsSupplier)UnoRuntime.queryInterface(
XTableChartsSupplier.class, oSheet);
XTableChart oChart = null;
System.out.println("Insert Chart");
XTableCharts oCharts = oSupp.getCharts();
oCharts.addNewByName("Example", oRect, oAddr, true, true);
// get the diagramm and Change some of the properties
try {
oChart = (XTableChart) (UnoRuntime.queryInterface(
XTableChart.class, ((XNameAccess) UnoRuntime.queryInterface(
XNameAccess.class, oCharts)).getByName("Example")));
XEmbeddedObjectSupplier oEOS = (XEmbeddedObjectSupplier) UnoRuntime.queryInterface(
XEmbeddedObjectSupplier.class, oChart);
XInterface oInt = oEOS.getEmbeddedObject();
XChartDocument xChart = (XChartDocument) UnoRuntime.queryInterface(XChartDocument.class,oInt);
XDiagram oDiag = (XDiagram) xChart.getDiagram();
System.out.println("Change Diagramm to 3D");
XPropertySet oCPS = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, oDiag );
oCPS.setPropertyValue("Dim3D", new Boolean(true));
System.out.println("Change the title");
Thread.sleep(200);
XPropertySet oTPS = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, xChart.getTitle() );
oTPS.setPropertyValue("String","The new title");
//oDiag.Dim3D();
} catch (Exception e){
System.out.println("Changin Properties failed "+e);
}
System.out.println("done");
System.exit(0);
} // finish method main
public static XMultiServiceFactory connect( String connectStr )
throws com.sun.star.uno.Exception,
com.sun.star.uno.RuntimeException, Exception {
// Get component context
XComponentContext xcomponentcontext =
com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(
null );
// initial serviceManager
XMultiComponentFactory xLocalServiceManager =
xcomponentcontext.getServiceManager();
// create a connector, so that it can contact the office
Object xUrlResolver = xLocalServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", xcomponentcontext );
XUnoUrlResolver urlResolver = (XUnoUrlResolver)UnoRuntime.queryInterface(
XUnoUrlResolver.class, xUrlResolver );
Object rInitialObject = urlResolver.resolve( connectStr );
XNamingService rName = (XNamingService)UnoRuntime.queryInterface(
XNamingService.class, rInitialObject );
XMultiServiceFactory xMSF = null;
if( rName != null ) {
System.err.println( "got the remote naming service !" );
Object rXsmgr = rName.getRegisteredObject("StarOffice.ServiceManager" );
xMSF = (XMultiServiceFactory)
UnoRuntime.queryInterface( XMultiServiceFactory.class, rXsmgr );
}
return ( xMSF );
}
public static XSpreadsheetDocument openCalc(XMultiServiceFactory oMSF) {
//define variables
XInterface oInterface;
XDesktop oDesktop;
XComponentLoader oCLoader;
XSpreadsheetDocument oDoc = null;
XComponent aDoc = null;
try {
oInterface = (XInterface) oMSF.createInstance( "com.sun.star.frame.Desktop" );
oDesktop = ( XDesktop ) UnoRuntime.queryInterface( XDesktop.class, oInterface );
oCLoader = ( XComponentLoader ) UnoRuntime.queryInterface( XComponentLoader.class, oDesktop );
PropertyValue [] szEmptyArgs = new PropertyValue [0];
String doc = "private:factory/scalc";
aDoc = oCLoader.loadComponentFromURL(doc, "_blank", 0, szEmptyArgs );
oDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, aDoc);
} // end of try
catch(Exception e){
System.out.println(" Exception " + e);
} // end of catch
return oDoc;
}//end of openCalc
public static void insertIntoCell(int CellX, int CellY, String theValue, XSpreadsheet TT1, String flag) {
XCell oCell = null;
try {
oCell = TT1.getCellByPosition(CellX, CellY);
} catch (com.sun.star.lang.IndexOutOfBoundsException ex) {
System.out.println("Could not get Cell");
}
if (flag.equals("V")) {oCell.setValue((new Float(theValue)).floatValue());}
else {oCell.setFormula(theValue);}
} // end of insertIntoCell
public static void chgbColor( int x1, int y1, int x2, int y2, String template, XSpreadsheet TT ) {
XCellRange xCR = null;
try {
xCR = TT.getCellRangeByPosition(x1,y1,x2,y2);
} catch (com.sun.star.lang.IndexOutOfBoundsException ex) {
System.out.println("Could not get CellRange");
}
XPropertySet oCPS = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, xCR );
try {
oCPS.setPropertyValue("CellStyle", template);
} catch (Exception e) {
System.out.println("Can't change colors chgbColor" + e);
}
}
} // finish class SCalc