diff --git a/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java b/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java index 8bf32b2b8..87eff04cf 100644 --- a/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java +++ b/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java @@ -23,13 +23,19 @@ import org.apache.poi.util.Beta; * A factory for different chart axis. * * @author Roman Kashitsyn + * @author Martin Andersson */ @Beta public interface ChartAxisFactory { - + /** * @return new value axis */ ValueAxis createValueAxis(AxisPosition pos); + /** + * @return new category axis. + */ + ChartAxis createCategoryAxis(AxisPosition pos); + } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java index 348d903f0..bc5c6707d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java @@ -33,6 +33,7 @@ import org.apache.poi.util.Internal; import org.apache.poi.ss.usermodel.Chart; import org.apache.poi.ss.usermodel.charts.ChartAxis; import org.apache.poi.ss.usermodel.charts.ChartAxisFactory; +import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis; import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory; import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis; import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis; @@ -43,6 +44,7 @@ import org.apache.poi.ss.usermodel.charts.AxisPosition; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; @@ -59,6 +61,7 @@ import org.w3c.dom.Text; * Represents a SpreadsheetML Chart * @author Nick Burch * @author Roman Kashitsyn + * @author Martin Andersson */ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory { @@ -212,6 +215,18 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA return valueAxis; } + public XSSFCategoryAxis createCategoryAxis(AxisPosition pos) { + long id = axis.size() + 1; + XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos); + if (axis.size() == 1) { + ChartAxis ax = axis.get(0); + ax.crossAxis(categoryAxis); + categoryAxis.crossAxis(ax); + } + axis.add(categoryAxis); + return categoryAxis; + } + public List getAxis() { if (axis.isEmpty() && hasAxis()) { parseAxis(); @@ -287,9 +302,16 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA private void parseAxis() { // TODO: add other axis types + parseCategoryAxis(); parseValueAxis(); } + private void parseCategoryAxis() { + for (CTCatAx catAx : chart.getPlotArea().getCatAxList()) { + axis.add(new XSSFCategoryAxis(this, catAx)); + } + } + private void parseValueAxis() { for (CTValAx valAx : chart.getPlotArea().getValAxList()) { axis.add(new XSSFValueAxis(this, valAx)); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java new file mode 100644 index 000000000..d8193a5a0 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java @@ -0,0 +1,93 @@ +/* ==================================================================== + 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.charts; + +import org.apache.poi.ss.usermodel.charts.AxisCrosses; +import org.apache.poi.ss.usermodel.charts.AxisOrientation; +import org.apache.poi.ss.usermodel.charts.AxisPosition; +import org.apache.poi.ss.usermodel.charts.ChartAxis; +import org.apache.poi.util.Beta; +import org.apache.poi.xssf.usermodel.XSSFChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling; +import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos; + +/** + * Category axis type. + * + * @author Martin Andersson + */ +@Beta +public class XSSFCategoryAxis extends XSSFChartAxis { + + private CTCatAx ctCatAx; + + public XSSFCategoryAxis(XSSFChart chart, long id, AxisPosition pos) { + super(chart); + createAxis(id, pos); + } + + public XSSFCategoryAxis(XSSFChart chart, CTCatAx ctCatAx) { + super(chart); + this.ctCatAx = ctCatAx; + } + + public long getId() { + return ctCatAx.getAxId().getVal(); + } + + protected CTAxPos getCTAxPos() { + return ctCatAx.getAxPos(); + } + + protected CTNumFmt getCTNumFmt() { + if (ctCatAx.isSetNumFmt()) { + return ctCatAx.getNumFmt(); + } + return ctCatAx.addNewNumFmt(); + } + + protected CTScaling getCTScaling() { + return ctCatAx.getScaling(); + } + + protected CTCrosses getCTCrosses() { + return ctCatAx.getCrosses(); + } + + public void crossAxis(ChartAxis axis) { + ctCatAx.getCrossAx().setVal(axis.getId()); + } + + private void createAxis(long id, AxisPosition pos) { + ctCatAx = chart.getCTChart().getPlotArea().addNewCatAx(); + ctCatAx.addNewAxId().setVal(id); + ctCatAx.addNewAxPos(); + ctCatAx.addNewScaling(); + ctCatAx.addNewCrosses(); + ctCatAx.addNewCrossAx(); + ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); + + setPosition(pos); + setOrientation(AxisOrientation.MIN_MAX); + setCrosses(AxisCrosses.AUTO_ZERO); + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java new file mode 100644 index 000000000..64ce92b57 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java @@ -0,0 +1,40 @@ +/* ==================================================================== + 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.charts; + +import junit.framework.TestCase; + +import org.apache.poi.ss.usermodel.charts.*; +import org.apache.poi.xssf.usermodel.*; + +public final class TestXSSFCategoryAxis extends TestCase { + + public void testAccessMethods() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook(); + XSSFSheet sheet = wb.createSheet(); + XSSFDrawing drawing = sheet.createDrawingPatriarch(); + XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30); + XSSFChart chart = drawing.createChart(anchor); + XSSFCategoryAxis axis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); + + axis.setCrosses(AxisCrosses.AUTO_ZERO); + assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO); + + assertEquals(chart.getAxis().size(), 1); + } +}