diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java index c3c1b61e0..f9aeb40c9 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java @@ -17,25 +17,34 @@ package org.apache.poi.xssf.usermodel; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.util.Map; +import java.util.HashMap; + import org.apache.poi.POIXMLException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTChartsheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.ChartsheetDocument; +import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; + +import javax.xml.namespace.QName; /** - * High level representation of of Sheet Parts that are of type 'chartsheet'. - * - * TODO: current verion extends XSSFSheet although both should extend AbstractSheet + * High level representation of Sheet Parts that are of type 'chartsheet'. + *

+ * Chart sheet is a special kind of Sheet that contains only chart and no data. + *

* * @author Yegor Kozlov */ public class XSSFChartSheet extends XSSFSheet { + private static final byte[] BLANK_WORKSHEET = blankWorksheet(); + protected CTChartsheet chartsheet; protected XSSFChartSheet(PackagePart part, PackageRelationship rel) { @@ -43,6 +52,9 @@ public class XSSFChartSheet extends XSSFSheet { } protected void read(InputStream is) throws IOException { + //initialize the supeclass with a blank worksheet + super.read(new ByteArrayInputStream(BLANK_WORKSHEET)); + try { chartsheet = ChartsheetDocument.Factory.parse(is).getChartsheet(); } catch (XmlException e){ @@ -51,17 +63,35 @@ public class XSSFChartSheet extends XSSFSheet { } /** - * Provide access to the CTWorksheet bean holding this sheet's data + * Provide access to the CTChartsheet bean holding this sheet's data * - * @return the CTWorksheet bean holding this sheet's data + * @return the CTChartsheet bean holding this sheet's data */ public CTChartsheet getCTChartsheet() { return chartsheet; } @Override - protected void commit() throws IOException { + protected void write(OutputStream out) throws IOException { + XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); + xmlOptions.setSaveSyntheticDocumentElement( + new QName(CTChartsheet.type.getName().getNamespaceURI(), "chartsheet")); + Map map = new HashMap(); + map.put(STRelationshipId.type.getName().getNamespaceURI(), "r"); + xmlOptions.setSaveSuggestedPrefixes(map); + + chartsheet.save(out, xmlOptions); } + private static byte[] blankWorksheet(){ + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + new XSSFSheet().write(out); + } catch (IOException e){ + throw new RuntimeException(e); + } + return out.toByteArray(); + } + } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFChartSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFChartSheet.java new file mode 100644 index 000000000..5ecb18754 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFChartSheet.java @@ -0,0 +1,84 @@ +/* ==================================================================== + 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 org.apache.poi.ss.usermodel.BaseTestSheet; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.XSSFITestDataProvider; +import org.apache.poi.xssf.XSSFTestDataSamples; +import org.apache.poi.xssf.model.CommentsTable; +import org.apache.poi.xssf.model.StylesTable; +import org.apache.poi.xssf.usermodel.helpers.ColumnHelper; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane; + + +public class TestXSSFChartSheet extends BaseTestSheet { + + @Override + protected XSSFITestDataProvider getTestDataProvider() { + return XSSFITestDataProvider.getInstance(); + } + + public void testXSSFFactory() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chart_sheet.xlsx"); + assertEquals(4, wb.getNumberOfSheets()); + + //the third sheet is of type 'chartsheet' + assertEquals("Chart1", wb.getSheetName(2)); + assertTrue(wb.getSheetAt(2) instanceof XSSFChartSheet); + assertEquals("Chart1", wb.getSheetAt(2).getSheetName()); + + } + + public void testGetAccessors() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chart_sheet.xlsx"); + XSSFChartSheet sheet = (XSSFChartSheet)wb.getSheetAt(2); + for(Row row : sheet) { + fail("Row iterator for chart sheets should return zero rows"); + } + //access to a arbitrary row + assertEquals(null, sheet.getRow(1)); + + //some basic get* accessors + assertEquals(0, sheet.getNumberOfComments()); + assertEquals(0, sheet.getNumHyperlinks()); + assertEquals(0, sheet.getNumMergedRegions()); + assertEquals(null, sheet.getActiveCell()); + assertEquals(true, sheet.getAutobreaks()); + assertEquals(null, sheet.getCellComment(0, 0)); + assertEquals(0, sheet.getColumnBreaks().length); + assertEquals(true, sheet.getRowSumsBelow()); + } + + /** + * YK: disable failing test from the superclass + */ + @Override + public void testDefaultColumnStyle() { + + } +} \ No newline at end of file diff --git a/test-data/spreadsheet/chart_sheet.xlsx b/test-data/spreadsheet/chart_sheet.xlsx new file mode 100644 index 000000000..44d771b06 Binary files /dev/null and b/test-data/spreadsheet/chart_sheet.xlsx differ