1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************
27  */
28 
29 package util;
30 
31 import com.sun.star.container.XIndexAccess;
32 import com.sun.star.lang.IllegalArgumentException;
33 import com.sun.star.lang.IndexOutOfBoundsException;
34 import com.sun.star.lang.WrappedTargetException;
35 import com.sun.star.lang.XComponent;
36 import com.sun.star.sheet.XCellRangeData;
37 import com.sun.star.sheet.XSpreadsheet;
38 import com.sun.star.sheet.XSpreadsheetDocument;
39 import com.sun.star.sheet.XSpreadsheets;
40 import com.sun.star.table.XCellRange;
41 import com.sun.star.uno.AnyConverter;
42 import com.sun.star.uno.Exception;
43 import com.sun.star.uno.Type;
44 import com.sun.star.uno.UnoRuntime;
45 
46 /**
47  * This class contains some usefull mathods to handle Calc documents
48  * and its sheets.
49  */
50 public class CalcTools {
51 
52     /**
53      * fills a range of a calc sheet with computed data of type
54      * <CODE>Double</CODE>.
55      * @param xSheetDoc the Clac documents wich should be filled
56      * @param sheetNumber the number of the sheet of <CODE>xSheetDoc</CODE>
57      * @param startCellX the cell number of the X start point (row) of the range to fill
58      * @param startCellY the cell number of the Y start point (column) of the range to fill
59      * @param rangeLengthX the size of the range expansion in X-direction
60      * @param rangeLengthY the size of the range expansion in Y-direction
61      * @throws java.lang.Exception on any error an <CODE>java.lang.Exception</CODE> was thrown
62      */
63     public static void fillCalcSheetWithContent(XComponent xSheetDoc, int sheetNumber,
64                         int startCellX, int startCellY, int rangeLengthX, int rangeLengthY)
65                   throws java.lang.Exception {
66         try{
67             XSpreadsheet xSheet = getSpreadSheetFromSheetDoc(xSheetDoc, sheetNumber);
68 
69             fillCalcSheetWithContent(xSheet, startCellX, startCellY, rangeLengthX, rangeLengthY);
70 
71         } catch (Exception e){
72                 throw new Exception(
73                         "Couldn't fill CalcSheet with content: " + e.toString());
74         }
75     }
76 
77     /**
78      * fills a range of a calc sheet with computed data of type
79      * <CODE>Double</CODE>.
80      * @param xSheet the sheet to fill with content
81      * @param startCellX the cell number of the X start point (row) of the range to fill
82      * @param startCellY the cell number of the Y start point (column) of the range to fill
83      * @param rangeLengthX the size of the range expansion in X-direction
84      * @param rangeLengthY the size of the range expansion in Y-direction
85      * @throws java.lang.Exception on any error an <CODE>java.lang.Exception</CODE> was thrown
86      */
87     public static void fillCalcSheetWithContent(XSpreadsheet xSheet,
88                         int startCellX, int startCellY, int rangeLengthX, int rangeLengthY)
89                   throws java.lang.Exception {
90 
91         try{
92             // create a range with content
93             Object[][] newData = new Object[rangeLengthY][rangeLengthX];
94             for (int i=0; i<rangeLengthY; i++) {
95                 for (int j=0; j<rangeLengthX; j++) {
96                     newData[i][j] = new Double(10*i +j);
97                 }
98             }
99             XCellRange xRange = null;
100             try {
101                 xRange = xSheet.getCellRangeByPosition(startCellX, startCellY,
102                                     startCellX+rangeLengthX-1, startCellY+rangeLengthY-1);
103             } catch ( IndexOutOfBoundsException e){
104                     throw new Exception(
105                             "Couldn't get CellRange from sheett: " + e.toString());
106             }
107 
108             XCellRangeData xRangeData = (XCellRangeData) UnoRuntime.queryInterface(XCellRangeData.class, xRange);
109 
110             xRangeData.setDataArray(newData);
111         } catch (Exception e){
112                 throw new Exception(
113                         "Couldn't fill CalcSheet with content: " + e.toString());
114         }
115     }
116 
117     /**
118      *
119      * returns an <CODE>XSpreadsheet</CODE> from a Calc document.
120      * @param xSheetDoc the Calc docuent which containes the sheet
121      * @param sheetNumber the number of the sheet to return
122      * @throws java.lang.Exception on any error an <CODE>java.lang.Exception</CODE> was thrown
123      * @return calc sheet
124      * @see com.sun.star.sheet.XSpreadsheet
125      */
126     public static XSpreadsheet getSpreadSheetFromSheetDoc(XComponent xSheetDoc, int sheetNumber)
127                   throws java.lang.Exception {
128 
129         XSpreadsheet xSheet = null;
130 
131         try{
132             XSpreadsheetDocument xSpreadsheetDoc = (XSpreadsheetDocument)
133                     UnoRuntime.queryInterface(XSpreadsheetDocument.class, xSheetDoc);
134 
135             XSpreadsheets xSpreadsheets = xSpreadsheetDoc.getSheets();
136 
137             XIndexAccess xSheetsIndexArray = (XIndexAccess)
138                         UnoRuntime.queryInterface(XIndexAccess.class, xSpreadsheets);
139 
140             try{
141                 xSheet = (XSpreadsheet) AnyConverter.toObject(
142                         new Type(XSpreadsheet.class),xSheetsIndexArray.getByIndex(sheetNumber));
143 
144             } catch (IllegalArgumentException e){
145                 throw new Exception(
146                         "Couldn't get sheet '" +sheetNumber + "' : " + e.toString());
147             } catch (IndexOutOfBoundsException e){
148                 throw new Exception(
149                         "Couldn't get sheet '" +sheetNumber + "' : " + e.toString());
150             } catch (WrappedTargetException e){
151                 throw new Exception(
152                         "Couldn't get sheet '" +sheetNumber + "' : " + e.toString());
153             }
154         } catch (Exception e){
155             throw new Exception(
156                 "Couldn't get sheet '" +sheetNumber + "' : " + e.toString());
157         }
158          return xSheet;
159     }
160 }
161