forked from amazingfate/loongoffice
449 lines
18 KiB
Java
449 lines
18 KiB
Java
/*************************************************************************
|
|
*
|
|
* $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
|