From 5f25e0ffa8a6701cef4c621aeca80e56dfd6d4ac Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 3 Apr 2008 15:04:52 +0000 Subject: [PATCH] Make a bit of a start on being able to edit chart titles, based on the email to user@poi from Russ on the 2nd of April. Not quite there though git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@644343 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/usermodel/HSSFChart.java | 78 ++++++++++++++++++ .../poi/hssf/usermodel/TestHSSFChart.java | 61 ++++++++++++++ .../apache/poi/hssf/data/WithThreeCharts.xls | Bin 0 -> 32768 bytes .../apache/poi/hssf/data/WithThreeCharts.xlsx | Bin 0 -> 13841 bytes 4 files changed, 139 insertions(+) create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java create mode 100755 src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xlsx diff --git a/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java b/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java index bf9b0cc236..d708a5c1da 100644 --- a/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java +++ b/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java @@ -23,6 +23,7 @@ import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.record.formula.Area3DPtg; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Stack; @@ -33,6 +34,15 @@ import java.util.Stack; */ public class HSSFChart { + private ChartRecord chartRecord; + private SeriesRecord seriesRecord; + + private ChartTitleFormatRecord chartTitleFormat; + private SeriesTextRecord chartTitleText; + + private HSSFChart(ChartRecord chartRecord) { + this.chartRecord = chartRecord; + } /** * Creates a bar chart. API needs some work. :) @@ -107,6 +117,74 @@ public class HSSFChart sheet.insertChartRecords( records ); workbook.insertChartRecord(); } + + /** + * Returns all the charts for the given sheet. + * + * NOTE: Does not yet work... checking it in just so others + * can take a look. + */ + public static HSSFChart[] getSheetCharts(HSSFSheet sheet) { + List charts = new ArrayList(); + HSSFChart lastChart = null; + + // Find records of interest + List records = sheet.getSheet().getRecords(); + for(Iterator it = records.iterator(); it.hasNext();) { + Record r = (Record)it.next(); + System.err.println(r); + + if(r instanceof DrawingRecord) { + DrawingRecord dr = (DrawingRecord)r; + } + + if(r instanceof ChartRecord) { + lastChart = new HSSFChart((ChartRecord)r); + charts.add(lastChart); + } + if(r instanceof SeriesRecord) { + lastChart.seriesRecord = (SeriesRecord)r; + } + if(r instanceof ChartTitleFormatRecord) { + lastChart.chartTitleFormat = + (ChartTitleFormatRecord)r; + } + if(r instanceof SeriesTextRecord) { + lastChart.chartTitleText = + (SeriesTextRecord)r; + } + } + + return (HSSFChart[]) + charts.toArray( new HSSFChart[charts.size()] ); + } + + + /** + * Returns the chart's title, if there is one, + * or null if not + */ + public String getChartTitle() { + if(chartTitleText != null) { + return chartTitleText.getText(); + } + return null; + } + + /** + * Changes the chart's title, but only if there + * was one already. + * TODO - add in the records if not + */ + public void setChartTitle(String title) { + if(chartTitleText != null) { + chartTitleText.setText(title); + } else { + throw new IllegalStateException("No chart title found to change"); + } + } + + private EOFRecord createEOFRecord() { diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java new file mode 100644 index 0000000000..2a069c3ff6 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java @@ -0,0 +1,61 @@ +/* ==================================================================== + 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.hssf.usermodel; + +import java.io.File; +import java.io.FileInputStream; + +import junit.framework.TestCase; + +public class TestHSSFChart extends TestCase { + private String dirName; + + protected void setUp() throws Exception { + dirName = System.getProperty("HSSF.testdata.path"); + } + + public void testSingleChart() throws Exception { + + } + + public void testTwoCharts() throws Exception { + + } + + public void BROKENtestThreeCharts() throws Exception { + HSSFWorkbook wb = new HSSFWorkbook( + new FileInputStream(new File(dirName, "WithThreeCharts.xls")) + ); + + HSSFSheet s1 = wb.getSheetAt(0); + HSSFSheet s2 = wb.getSheetAt(1); + HSSFSheet s3 = wb.getSheetAt(2); + + assertEquals(0, HSSFChart.getSheetCharts(s1).length); + assertEquals(2, HSSFChart.getSheetCharts(s2).length); + assertEquals(1, HSSFChart.getSheetCharts(s3).length); + + HSSFChart[] charts; + + charts = HSSFChart.getSheetCharts(s2); + assertNull(charts[0].getChartTitle()); + assertEquals("Pie Chart Title Thingy", charts[1].getChartTitle()); + + charts = HSSFChart.getSheetCharts(s3); + assertEquals("Sheet 3 Chart with Title", charts[1].getChartTitle()); + } +} diff --git a/src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xls b/src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xls new file mode 100755 index 0000000000000000000000000000000000000000..157bf331b8e30319216c638603ef8676753794f4 GIT binary patch literal 32768 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 Jv9p=}{{hwOXaE2J literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xlsx b/src/testcases/org/apache/poi/hssf/data/WithThreeCharts.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..e7398e274bce4b97f9f8329cdb43f038f135c6e3 GIT binary patch literal 13841 zcmeHuWmH_*wk{QdySuvvcXxLUu7Tk0?(XjH?j8v45-bD>gaEy$IoOIJU@4esm zonln&QDg7*vF2KH&hTis371VkRTu+L?DMal2D}p5ReB55D*lQC4iQ&jkTkR zwWFSjo2`k14!x_DC1L&t0A()73*htref=+5fySgUx%Ui+qSq1+!e8j#Y6}QKvL5;m zA-7W!=pUG)%-7My_+1^R@n8#z1}LS-W>TJZopWr-m}V$Z5Ny=dk{hM$rIP6vss?GA z95|h_w3|SI8zfFI2n;s+TC(x-XV5moGvuv;Gbe{^9C3)J2~#mN!NYcGzSavDi18lC zinXYF;mwM_ZfhAEC1#@)#f>i{x--_%lu9(nxAj zDt18*c#Fx7xTxavKnT!YdMbij{n1#_*x`zp9qo7{|8)YxFn{Wa*lj&l#k1@qig zU&-Y@yT#%R*m6N$J~5rBfwLWf?-MuD=>-Bw{v)=VhXWJwy?wD{mdAeVoVGXy9`!hC zX&i~@cDK@b z+g@@G*b|%bPjW3a@T;^E`v$Hc9S-#$AIDyv+^zFI0xj<82^2)(ZwA|>%0O}n)Iu5H zT^Nu_fS$dHrNb-wAD@KzqyIJ3|1}0089xOyPuRg@iB91!_us4~AoGekWF$I>RPf)C z9uYJ}6_5&CUj>5tOBt=qTTm$vhHA_9$!o&>2#rx9whzRWV#0L^X7Cd=Wn9~FMqBsV{Q3JD?1guh%Pl?;S z!9Dm2bUgFDZy_N(AjHdDt%72Thsok`YaBIqKFWaaL6da^>caK}0vBB} z1((9Epr<4SPFM zfuW@yTRABs3aWG7_7CQsyT&q1jh!jqD7C(rWY@Ue>;vY5C{`9<^mXe3xM97dzOS#a zM=7?RfBTRZp-z00f*?K{%9u7fZHUT{6dIGInjGq<7eZwNt326@${tMhRewRckJ5a; zB6%=th$ZPOVRmw0F2_>i!Cd~sx3-%hvMnPnBA$|%_?TlB2yeT9d4%68kf=0VcnVM{ zHi6Fa#}hyW`m5?hDvinQGa#<&h50b3wP2LcQz@_tZWfJ!6J=YV$YWPT<1N#hKYfqZ zdF`*?JL+Ic{$?_5AMd1wQZsPQZ+HOOwr{N+H-9 z%k+pHx4BvsOuhMalYU=vzaKha`(Df`JNf*zx$80)asK|1NJRT$Ix?MSYcjPj?JlFx z%KMZ+Ehh|`A|uu*`_a*^5fAZc^`_27tB{7ZL^Xqe{d^H2IyEkyy!};$@pGfek~l)^ zT~Wbf{x)LLeRY$EjAWwd0rwxA402 z5zdW+jNO7Ta3hb!W+H=-n}M^Np=UZVzwirMTU?g^~|3>R4}h0B+Gg zoxol(S*t%d2#7My4~F`44;{@+tV~}0{AB#$0uD6gZC2P&dk~gf2pw&#D4KB~oWhst zGOA>8`mICo&C`-Kl=B5Kh;@%#U0)6Ahd@dx1r0(j*1SF;sH} zl+VbUg%lw%1Tz_${G;ytL+9wiJoK6j24j<rSu|Ec4|32HCpo7ek`TI$aB zci`_nFjX(^J9#u^W&`xsA!Ms)Mbj_8i&Z7e(E1*1F&$brDOPpdym-7MOVi4dE18ip zsS|-4=37WP!I?Mp@|ftwi5*~1KDnH9Zdq|W0XIIKAoF~Zs?c;f1xIDVmQR`fnD^){ z#Tz2Su|gMQ1L9eb-iJXM8qCwq5&;!6U#<~x;zfT4GA$5{78RFHVeIb}x=9}`=5IIw zVuP%mS|{ACjXm2LdjTe^vU1PR8;b)K|!FR`p-I>$(1ax$7 zKGR1BZ1$zBdtdD=5)|-fd!L`3Vr;u=_CMXdr|5ZjaN|T|G9#Lac$M>Tbubc9!}s{u zF+_G^LV< zb!om(WrmR&x>}9pFg#+$rNNC&r7YaJNsL84JW~9&

w~FU_a8i!X{NBQ48RNJ0^d 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 literal 0 HcmV?d00001 -- 2.39.5