Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein kleines Beispiel für die einfache Automatisierung von Open Office scalc Spreadsheets mit Java via UNO.
Als Open Office Version verwende ich hier: 2.4.0
Ausgabe:
Mit ein wenig Java 5 magic ersparen wir uns das lässtige Casten, dass man in den ganzen OO Tutorials findet...
Anstatt
Schreiben wir nur noch:
Das vereinfacht das ganze erheblich und macht den Code IMHO viel lesbarer!
Ergibt folgendes Dokument:
Gruß Tom
hier mal ein kleines Beispiel für die einfache Automatisierung von Open Office scalc Spreadsheets mit Java via UNO.
Als Open Office Version verwende ich hier: 2.4.0
Java:
/**
*
*/
package de.tutorials;
import com.sun.star.beans.PropertyValue;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XEnumeration;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XEventListener;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.sheet.CellFlags;
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.table.XCell;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
/**
* @author Thomas.Darimont
*
*/
public class OOExample {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
final XComponentContext componentContext = Bootstrap.bootstrap();
XMultiComponentFactory multiComponentFactory = componentContext
.getServiceManager();
XComponentLoader componentLoader = convert(multiComponentFactory
.createInstanceWithContext("com.sun.star.frame.Desktop",
componentContext));
final XComponent component = componentLoader.loadComponentFromURL(
"private:factory/scalc", "_blank", 0, new PropertyValue[0]);
XSpreadsheetDocument spreadsheetDocument = convert(component);
XSpreadsheet spreadsheet = convert(spreadsheetDocument
.getSheets()
.getByName(spreadsheetDocument.getSheets().getElementNames()[0]));
XCell cell = spreadsheet.getCellByPosition(0, 0);
cell.setValue(1);
cell = spreadsheet.getCellByPosition(0, 1);
cell.setValue(2);
cell = spreadsheet.getCellByPosition(0, 2);
cell.setFormula("=sum(A1:A2)");
XCellRangesQuery cellRangesQuery = convert(spreadsheet);
XSheetCellRanges sheetCellRanges = cellRangesQuery
.queryContentCells((short) CellFlags.VALUE);
XEnumeration cellEnumeration = sheetCellRanges.getCells()
.createEnumeration();
while (cellEnumeration.hasMoreElements()) {
Object element = cellEnumeration.nextElement();
System.out.println(element);
XCell currentCell = convertAny(element);
System.out.println(currentCell.getValue());
}
component.addEventListener(new XEventListener() {
@Override
public void disposing(EventObject eventObject) {
System.out.println("Closing...");
System.exit(0);
}
});
}
@SuppressWarnings("unchecked")
public static <TTarget> TTarget convert(Object instance, TTarget... args) {
return (TTarget) UnoRuntime.queryInterface(args.getClass()
.getComponentType(), instance);
}
@SuppressWarnings("unchecked")
public static <TTarget> TTarget convertAny(Object instance, TTarget... args) {
try {
return (TTarget) AnyConverter.toObject(args.getClass()
.getComponentType(), instance);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return null;
}
}
Ausgabe:
Code:
Any[Type[com.sun.star.table.XCell], [Proxy:3195425,7d81688;msci[0];9eb8c73d1d5749528db88bd98c4e3d1c,Type[com.sun.star.table.XCell]]]
1.0
Any[Type[com.sun.star.table.XCell], [Proxy:18426253,7aff978;msci[0];9eb8c73d1d5749528db88bd98c4e3d1c,Type[com.sun.star.table.XCell]]]
2.0
Closing...
Mit ein wenig Java 5 magic ersparen wir uns das lässtige Casten, dass man in den ganzen OO Tutorials findet...
Anstatt
Java:
XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface(XSpreadsheetDocument.class, xSpreadsheetComponent);
Schreiben wir nur noch:
Java:
XSpreadsheetDocument spreadsheetDocument = convert(component);
Das vereinfacht das ganze erheblich und macht den Code IMHO viel lesbarer!
Java:
@SuppressWarnings("unchecked")
public static <TTarget> TTarget convert(Object instance, TTarget... args) {
return (TTarget) UnoRuntime.queryInterface(args.getClass()
.getComponentType(), instance);
}
Ergibt folgendes Dokument:
Gruß Tom