From: Alain Béarez Date: Wed, 3 Oct 2018 08:20:50 +0000 (+0000) Subject: change chart data to experiment diverse scripts X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e88fc19ca4a11be1f2d2eee0a82a650ca8aa104d;p=poi.git change chart data to experiment diverse scripts git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842687 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java b/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java index ac1d68a7df..7b052b7daf 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java @@ -59,26 +59,30 @@ public class BarChartDemo { BufferedReader modelReader = new BufferedReader(new FileReader(args[1]))) { String chartTitle = modelReader.readLine(); // first line is chart title + String[] series = modelReader.readLine().split(","); // Category Axis Data - List listCategories = new ArrayList(3); + List listLanguages = new ArrayList<>(10); // Values - List listValues = new ArrayList(3); + List listCountries = new ArrayList<>(10); + List listSpeakers = new ArrayList<>(10); // set model String ln; - while((ln = modelReader.readLine()) != null){ - String[] vals = ln.split("\\s+"); - listCategories.add(vals[0]); - listValues.add(Double.valueOf(vals[1])); + while((ln = modelReader.readLine()) != null) { + String[] vals = ln.split(","); + listCountries.add(Double.valueOf(vals[0])); + listSpeakers.add(Double.valueOf(vals[1])); + listLanguages.add(vals[2]); } - String[] categories = listCategories.toArray(new String[listCategories.size()]); - Double[] values = listValues.toArray(new Double[listValues.size()]); + String[] categories = listLanguages.toArray(new String[listLanguages.size()]); + Double[] values1 = listCountries.toArray(new Double[listCountries.size()]); + Double[] values2 = listSpeakers.toArray(new Double[listSpeakers.size()]); try (XMLSlideShow pptx = new XMLSlideShow(argIS)) { XSLFSlide slide = pptx.getSlides().get(0); - setBarData(findChart(slide), chartTitle, categories, values); + setBarData(findChart(slide), chartTitle, series, categories, values1, values2); XSLFChart chart = findChart(pptx.createSlide().importContent(slide)); setColumnData(chart, "Column variant"); @@ -91,18 +95,22 @@ public class BarChartDemo { } } - private static void setBarData(XSLFChart chart, String chartTitle, String[] categories, Double[] values) { - final List series = chart.getChartSeries(); - final XDDFBarChartData bar = (XDDFBarChartData) series.get(0); + private static void setBarData(XSLFChart chart, String chartTitle, String[] series, String[] categories, Double[] values1, Double[] values2) { + final List data = chart.getChartSeries(); + final XDDFBarChartData bar = (XDDFBarChartData) data.get(0); final int numOfPoints = categories.length; final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0)); final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1)); - final XDDFDataSource categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange); - final XDDFNumericalDataSource valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange); - + final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2)); + final XDDFDataSource categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0); + final XDDFNumericalDataSource valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, 1); + values1[6] = 16.0; // if you ever want to change the underlying data + final XDDFNumericalDataSource valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2); bar.getSeries().get(0).replaceData(categoriesData, valuesData); - bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle)); + bar.addSeries(categoriesData, valuesData2); + bar.getSeries().get(0).setTitle(series[0], chart.setSheetTitle(series[0], 0)); + bar.getSeries().get(1).setTitle(series[1], chart.setSheetTitle(series[1], 1)); chart.plot(bar); } @@ -110,7 +118,6 @@ public class BarChartDemo { // Series Text List series = chart.getChartSeries(); XDDFBarChartData bar = (XDDFBarChartData) series.get(0); - bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle)); // in order to transform a bar chart into a column chart, you just need to change the bar direction bar.setBarDirection(BarDirection.COL); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java index bbf6a0e680..4f020550db 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java @@ -77,10 +77,10 @@ public class PieChartDemo { XDDFPieChartData pie = (XDDFPieChartData) series.get(0); // Category Axis Data - List listCategories = new ArrayList(3); + List listCategories = new ArrayList<>(3); // Values - List listValues = new ArrayList(3); + List listValues = new ArrayList<>(3); // set model String ln; @@ -100,7 +100,7 @@ public class PieChartDemo { XDDFPieChartData.Series firstSeries = (XDDFPieChartData.Series) pie.getSeries().get(0); firstSeries.replaceData(categoriesData, valuesData); - firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle)); + firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle, 0)); firstSeries.setExplosion(25); chart.plot(pie); diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/bar-chart-data.txt b/src/examples/src/org/apache/poi/xslf/usermodel/bar-chart-data.txt index 7f9c271036..22c7b86ab8 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/bar-chart-data.txt +++ b/src/examples/src/org/apache/poi/xslf/usermodel/bar-chart-data.txt @@ -1,4 +1,12 @@ -My Bar or Column Chart -First 1.0 -Second 3.0 -Third 4.0 \ No newline at end of file +10 languages with most speakers as first language +countries,speakers,language +58,315,العربية +4,243,বাংলা +38,1299,中文 +118,378,English +4,260,हिन्दी +2,128,日本語 +15,223,português +6,119,ਪੰਜਾਬੀ +18,154,Русский язык +31,442,español diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java index 12a271811b..d1e7f6b8bc 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java @@ -61,26 +61,30 @@ public class BarChartExample { BufferedReader modelReader = new BufferedReader(new FileReader(args[1]))) { String chartTitle = modelReader.readLine(); // first line is chart title + String[] series = modelReader.readLine().split(","); // Category Axis Data - List listCategories = new ArrayList(3); + List listLanguages = new ArrayList<>(10); // Values - List listValues = new ArrayList(3); + List listCountries = new ArrayList<>(10); + List listSpeakers = new ArrayList<>(10); // set model String ln; while((ln = modelReader.readLine()) != null) { - String[] vals = ln.split("\\s+"); - listCategories.add(vals[0]); - listValues.add(Double.valueOf(vals[1])); + String[] vals = ln.split(","); + listCountries.add(Double.valueOf(vals[0])); + listSpeakers.add(Double.valueOf(vals[1])); + listLanguages.add(vals[2]); } - String[] categories = listCategories.toArray(new String[listCategories.size()]); - Double[] values = listValues.toArray(new Double[listValues.size()]); + String[] categories = listLanguages.toArray(new String[listLanguages.size()]); + Double[] values1 = listCountries.toArray(new Double[listCountries.size()]); + Double[] values2 = listSpeakers.toArray(new Double[listSpeakers.size()]); try (XWPFDocument doc = new XWPFDocument(argIS)) { XWPFChart chart = doc.getCharts().get(0); - setBarData(chart, chartTitle, categories, values); + setBarData(chart, chartTitle, series, categories, values1, values2); chart = doc.getCharts().get(1); setColumnData(chart, "Column variant"); @@ -93,21 +97,22 @@ public class BarChartExample { System.out.println("Done"); } - private static void setBarData(XWPFChart chart, String chartTitle, String[] categories, Double[] values) { - final List series = chart.getChartSeries(); - final XDDFBarChartData bar = (XDDFBarChartData) series.get(0); + private static void setBarData(XWPFChart chart, String chartTitle, String[] series, String[] categories, Double[] values1, Double[] values2) { + final List data = chart.getChartSeries(); + final XDDFBarChartData bar = (XDDFBarChartData) data.get(0); final int numOfPoints = categories.length; final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0)); final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1)); final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2)); final XDDFDataSource categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0); - final XDDFNumericalDataSource valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange, 1); - values[2] = 10.0; - final XDDFNumericalDataSource valuesData2 = XDDFDataSourcesFactory.fromArray(values, valuesDataRange2, 2); + final XDDFNumericalDataSource valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, 1); + values1[6] = 16.0; // if you ever want to change the underlying data + final XDDFNumericalDataSource valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2); bar.getSeries().get(0).replaceData(categoriesData, valuesData); bar.addSeries(categoriesData, valuesData2); - bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle)); + bar.getSeries().get(0).setTitle(series[0], chart.setSheetTitle(series[0], 0)); + bar.getSeries().get(1).setTitle(series[1], chart.setSheetTitle(series[1], 1)); chart.plot(bar); } @@ -115,11 +120,10 @@ public class BarChartExample { // Series Text List series = chart.getChartSeries(); XDDFBarChartData bar = (XDDFBarChartData) series.get(0); - bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle)); // in order to transform a bar chart into a column chart, you just need to change the bar direction bar.setBarDirection(BarDirection.COL); - + // looking for "Stacked Bar Chart"? uncomment the following line // bar.setBarGrouping(BarGrouping.STACKED); diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/bar-chart-data.txt b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/bar-chart-data.txt index 7f9c271036..22c7b86ab8 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/bar-chart-data.txt +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/bar-chart-data.txt @@ -1,4 +1,12 @@ -My Bar or Column Chart -First 1.0 -Second 3.0 -Third 4.0 \ No newline at end of file +10 languages with most speakers as first language +countries,speakers,language +58,315,العربية +4,243,বাংলা +38,1299,中文 +118,378,English +4,260,हिन्दी +2,128,日本語 +15,223,português +6,119,ਪੰਜਾਬੀ +18,154,Русский язык +31,442,español diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java index 5e89e775fa..9f1004ad25 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java @@ -109,6 +109,7 @@ public class XDDFBarChartData extends XDDFChartData { XDDFNumericalDataSource values) { final int index = this.series.size(); final CTBarSer ctSer = this.chart.addNewSer(); + ctSer.addNewTx(); ctSer.addNewCat(); ctSer.addNewVal(); ctSer.addNewIdx().setVal(index); diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index 5b43eeb292..d146e59d0d 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -669,20 +669,22 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai } /** - * set sheet time in excel file + * set sheet title in excel file * * @param title * title of sheet + * @param column + * column index * @return return cell reference * @since POI 4.0.0 */ - public CellReference setSheetTitle(String title) { + public CellReference setSheetTitle(String title, int column) { XSSFSheet sheet = getSheet(); XSSFRow row = this.getRow(sheet, 0); - XSSFCell cell = this.getCell(row, 1); + XSSFCell cell = this.getCell(row, column); cell.setCellValue(title); - this.updateSheetTable(sheet.getTables().get(0).getCTTable(), title, 1); - return new CellReference(sheet.getSheetName(), 0, 1, true, true); + this.updateSheetTable(sheet.getTables().get(0).getCTTable(), title, column); + return new CellReference(sheet.getSheetName(), 0, column, true, true); } /** @@ -698,12 +700,11 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai private void updateSheetTable(CTTable ctTable, String title, int index) { CTTableColumns tableColumnList = ctTable.getTableColumns(); CTTableColumn column = null; - if (tableColumnList.getCount() >= index) { - column = tableColumnList.getTableColumnArray(index); - } else { + for( int i = 0; tableColumnList.getCount() < index; i++) { column = tableColumnList.addNewTableColumn(); - column.setId(index); + column.setId(i); } + column = tableColumnList.getTableColumnArray(index); column.setName(title); } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java index a9e214586f..8c3f6a7559 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java @@ -130,6 +130,10 @@ public abstract class XDDFChartData { } else { cache = ref.addNewStrCache(); } + if (cache.sizeOfPtArray() < 1) { + cache.addNewPtCount().setVal(1); + cache.addNewPt().setIdx(0);; + } cache.getPtArray(0).setV(title); ref.setF(titleRef.formatAsString()); } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java index 819c3df505..27775fadee 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java @@ -158,7 +158,7 @@ public class TestXSLFChart { final XDDFNumericalDataSource valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange); series.replaceData(categoryData, valuesData); final String title = "Apache POI"; - series.setTitle(title, chart.setSheetTitle(title)); + series.setTitle(title, chart.setSheetTitle(title, 0)); chart.plot(data); }