diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java index 01286584f..9ab157e44 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java @@ -155,8 +155,7 @@ public class XSSFRow implements Row { } public int getRowNum() { - // TODO Auto-generated method stub - return 0; + return (int) (row.getR() - 1); } public boolean getZeroHeight() { @@ -188,7 +187,7 @@ public class XSSFRow implements Row { } public void setRowNum(int rowNum) { - // TODO Auto-generated method stub + this.row.setR(rowNum + 1); } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index f63ab0d72..8bb75660c 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -18,6 +18,8 @@ package org.apache.poi.xssf.usermodel; import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.hssf.util.Region; @@ -44,13 +46,17 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; public class XSSFSheet implements Sheet { private CTSheet sheet; - private CTWorksheet worksheet; + private List rows; public XSSFSheet(CTSheet sheet) { this.sheet = sheet; this.worksheet = CTWorksheet.Factory.newInstance(); this.worksheet.addNewSheetData(); + this.rows = new LinkedList(); + for (CTRow row : worksheet.getSheetData().getRowArray()) { + this.rows.add(new XSSFRow(row)); + } // XXX ??? CTSheetViews views = this.worksheet.addNewSheetViews(); CTSheetView view = views.addNewSheetView(); @@ -109,11 +115,33 @@ public class XSSFSheet implements Sheet { } + protected XSSFRow addRow(int index, int rownum) { + CTRow row = this.worksheet.getSheetData().insertNewRow(index); + XSSFRow xrow = new XSSFRow(row); + xrow.setRowNum(rownum); +// xrow.setHeight(13.41); + return xrow; + } + public Row createRow(int rownum) { - CTRow row = this.worksheet.getSheetData().insertNewRow(rownum); - row.setR(rownum + 1); - row.setHt(13.41); // XXX ??? - return new XSSFRow(row); + int index = 0; + for (Row r : this.rows) { + if (r.getRowNum() == rownum) { + // Replace r with new row + XSSFRow xrow = addRow(index, rownum); + rows.set(index, xrow); + return xrow; + } + if (r.getRowNum() > rownum) { + XSSFRow xrow = addRow(index, rownum); + rows.add(index, xrow); + return xrow; + } + ++index; + } + XSSFRow xrow = addRow(index, rownum); + rows.add(xrow); + return xrow; } public void createSplitPane(int splitPos, int splitPos2, int leftmostColumn, int topRow, int activePane) { @@ -262,7 +290,12 @@ public class XSSFSheet implements Sheet { } public Row getRow(int rownum) { - // TODO Auto-generated method stub + for (Iterator it = rowIterator() ; it.hasNext() ; ) { + Row row = it.next(); + if (row.getRowNum() == rownum) { + return row; + } + } return null; } @@ -371,9 +404,8 @@ public class XSSFSheet implements Sheet { } - public Iterator rowIterator() { - // TODO Auto-generated method stub - return null; + public Iterator rowIterator() { + return rows.iterator(); } public void setAlternativeExpression(boolean b) { @@ -546,4 +578,32 @@ public class XSSFSheet implements Sheet { } + public void setTabSelected(boolean flag) { + CTSheetViews views = this.worksheet.getSheetViews(); + for (CTSheetView view : views.getSheetViewArray()) { + view.setTabSelected(flag); + } + } + + public boolean isTabSelected() { + CTSheetView view = getDefaultSheetView(); + return view != null && view.getTabSelected(); + } + + /** + * Return the default sheet view. This is the last one if the sheet's views, according to sec. 3.3.1.83 + * of the OOXML spec: "A single sheet view definition. When more than 1 sheet view is defined in the file, + * it means that when opening the workbook, each sheet view corresponds to a separate window within the + * spreadsheet application, where each window is showing the particular sheet. containing the same + * workbookViewId value, the last sheetView definition is loaded, and the others are discarded. + * When multiple windows are viewing the same sheet, multiple sheetView elements (with corresponding + * workbookView entries) are saved." + */ + private CTSheetView getDefaultSheetView() { + CTSheetViews views = this.worksheet.getSheetViews(); + if (views == null || views.getSheetViewArray() == null || views.getSheetViewArray().length <= 0) { + return null; + } + return views.getSheetViewArray(views.getSheetViewArray().length - 1); + } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index b3e058e1e..20f604be7 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -34,6 +34,7 @@ import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Palette; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.opc.Package; @@ -63,6 +64,10 @@ public class XSSFWorkbook implements Workbook { this.workbook.addNewSheets(); } + protected CTWorkbook getWorkbook() { + return this.workbook; + } + public int addPicture(byte[] pictureData, int format) { // TODO Auto-generated method stub return 0; @@ -207,8 +212,14 @@ public class XSSFWorkbook implements Workbook { } public short getSelectedTab() { - // TODO Auto-generated method stub - return 0; + short i = 0; + for (XSSFSheet sheet : this.sheets) { + if (sheet.isTabSelected()) { + return i; + } + ++i; + } + return -1; } public Sheet getSheet(String name) { @@ -217,17 +228,21 @@ public class XSSFWorkbook implements Workbook { } public Sheet getSheetAt(int index) { - return this.sheets.get(index - 1); + return this.sheets.get(index); } public int getSheetIndex(String name) { - // TODO Auto-generated method stub - return 0; + CTSheet[] sheets = this.workbook.getSheets().getSheetArray(); + for (int i = 0 ; i < sheets.length ; ++i) { + if (name.equals(sheets[i].getName())) { + return i; + } + } + return -1; } public int getSheetIndex(Sheet sheet) { - // TODO Auto-generated method stub - return 0; + return this.sheets.indexOf(sheet); } public String getSheetName(int sheet) { @@ -285,9 +300,14 @@ public class XSSFWorkbook implements Workbook { } + /** + * We only set one sheet as selected for compatibility with HSSF. + */ public void setSelectedTab(short index) { - // TODO Auto-generated method stub - + for (int i = 0 ; i < this.sheets.size() ; ++i) { + XSSFSheet sheet = this.sheets.get(i); + sheet.setTabSelected(i == index); + } } public void setSheetName(int sheet, String name) { @@ -301,8 +321,13 @@ public class XSSFWorkbook implements Workbook { } public void setSheetOrder(String sheetname, int pos) { - // TODO Auto-generated method stub - + int idx = getSheetIndex(sheetname); + sheets.add(pos, sheets.remove(idx)); + // Reorder CTSheets + XmlObject cts = this.workbook.getSheets().getSheetArray(idx).copy(); + this.workbook.getSheets().removeSheet(idx); + CTSheet newcts = this.workbook.getSheets().insertNewSheet(pos); + newcts.set(cts); } public void unwriteProtectWorkbook() { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java new file mode 100644 index 000000000..bf2c218cb --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -0,0 +1,73 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.xssf.usermodel; + +import junit.framework.TestCase; + +import org.apache.poi.ss.usermodel.Sheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; + + +public class TestXSSFWorkbook extends TestCase { + + public void testGetSheetIndex() { + XSSFWorkbook workbook = new XSSFWorkbook(); + Sheet sheet1 = workbook.createSheet("sheet1"); + Sheet sheet2 = workbook.createSheet("sheet2"); + assertEquals(0, workbook.getSheetIndex(sheet1)); + assertEquals(0, workbook.getSheetIndex("sheet1")); + assertEquals(1, workbook.getSheetIndex(sheet2)); + assertEquals(1, workbook.getSheetIndex("sheet2")); + assertEquals(-1, workbook.getSheetIndex("noSheet")); + } + + public void testSetSheetOrder() throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(); + Sheet sheet1 = workbook.createSheet("sheet1"); + Sheet sheet2 = workbook.createSheet("sheet2"); + assertSame(sheet1, workbook.getSheetAt(0)); + assertSame(sheet2, workbook.getSheetAt(1)); + workbook.setSheetOrder("sheet2", 0); + assertSame(sheet2, workbook.getSheetAt(0)); + assertSame(sheet1, workbook.getSheetAt(1)); + // Test reordering of CTSheets + CTWorkbook ctwb = workbook.getWorkbook(); + CTSheet[] ctsheets = ctwb.getSheets().getSheetArray(); + assertEquals("sheet2", ctsheets[0].getName()); + assertEquals("sheet1", ctsheets[1].getName()); + + // Borderline case: only one sheet + workbook = new XSSFWorkbook(); + sheet1 = workbook.createSheet("sheet1"); + assertSame(sheet1, workbook.getSheetAt(0)); + workbook.setSheetOrder("sheet1", 0); + assertSame(sheet1, workbook.getSheetAt(0)); + } + + public void testSetSelectedTab() throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(); + Sheet sheet1 = workbook.createSheet("sheet1"); + Sheet sheet2 = workbook.createSheet("sheet2"); + assertEquals(-1, workbook.getSelectedTab()); + workbook.setSelectedTab((short) 0); + assertEquals(0, workbook.getSelectedTab()); + workbook.setSelectedTab((short) 1); + assertEquals(1, workbook.getSelectedTab()); + } +}