Home » excel » charts – How to reference current sheet data for excel graphs without sheet name

charts – How to reference current sheet data for excel graphs without sheet name

Posted by: admin May 14, 2020 Leave a comment

Questions:

I’m planning to use the java library POI to read a sheet from an excel template, populate data and store it to a target workbook repeated for n times.
The template/master sheet contains a graph and the “series value” for the graph must be
composed with the sheetname, like =sheet1!$D$52:$D$310

I feel that this is going to interfere with my idea of templating, because the cloned sheets will inevitably need to get new names and the graph series won’t be able to reference them anymore.

Is there a way to solve this easily either by doing something smart with the graph series or by doing something in POI?

How to&Answers:

Promoting a comment to an answer….

The generally suggested way to do this is to create some named ranges, pointing to dummy bits of your file. Create one or more charts in your file, using the named ranges to provide the data. Tweak your chart(s) until they look correct.

Then, in POI, add in your data. This could be by appending rows, or by adding new sheets in. Whatever works for you! When you’re done, update the named ranges using POI to point to the new data. Save, load in Excel, and enjoy the shiny looking graph!

The only thing you need to take care of is not to do anything drawing or comment related to the slide(s) with your graphs on, nor to try cloning a sheet with comments or graphs on. Sheet cloning doesn’t (currently) fix up drawing references, so things risk then going wrong with drawing related things such as graphs. As long as you only clone non-graph sheets in your processing, you should be fine with the named range approach

Answer:

I’m using EPPlus library in .NET but I expect this trick would also work.

Assumptions :

  • You have a worksheet called ‘TEMPLATE’
  • You have already created the charts within Excel
  • You use this merely as a starting point. It worked for me but likely is more complicated to accomodate special cases.
  • Your chart (created within Excel itself) already has series set to point to data on the worksheet – and you intend to update this data from within your code. If you’re planning on inserting rows or columns this simple approach below will fall flat..

Once I’ve cloned a worksheet (ws) I just iterate through the charts and modify the series reference by finding elements in the XML with <c:f> such as <c:f>TEMPLATE!$D$31:$D$45</c:f> and then I just change this Xml to be the correct name of my cloned worksheet.

    foreach (ExcelChart chart in ws.Drawings.OfType<ExcelChart>())
    {
        foreach (var seriesRef in chart.ChartXml.GetElementsByTagName("c:f").OfType<XmlElement>())
        {
            seriesRef.InnerText = seriesRef.InnerText.Replace("TEMPLATE!", "MyClonedSheet" + "!");
        }
    }

Here’s a full sample Xml for ChartXml which is a graph containing several series. The above code managed to fix the references for cloned worksheets.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <c:chartSpace xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> <c:date1904 val="0"/> <c:lang val="en-US"/> <c:roundedCorners val="0"/> <mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> <mc:Choice Requires="c14" xmlns:c14="http://schemas.microsoft.com/office/drawing/2007/8/2/chart"> <c14:style val="102"/> </mc:Choice> <mc:Fallback> <c:style val="2"/> </mc:Fallback> </mc:AlternateContent> <c:chart> <c:title> <c:tx> <c:rich> <a:bodyPr rot="0" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr sz="1400" b="0" i="0" u="none" strike="noStrike" kern="1200" spc="0" baseline="0"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="65000"/> <a:lumOff val="35000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:r> <a:rPr lang="en-US"/> <a:t>Comparison of weekly </a:t> </a:r> </a:p> <a:p> <a:pPr> <a:defRPr/> </a:pPr> <a:r> <a:rPr lang="en-US"/> <a:t>sales</a:t> </a:r> </a:p> </c:rich> </c:tx> <c:layout> <c:manualLayout> <c:xMode val="edge"/> <c:yMode val="edge"/> <c:x val="0.37324856294414882"/> <c:y val="2.588996104019544E-2"/> </c:manualLayout> </c:layout> <c:overlay val="0"/> <c:spPr> <a:noFill/> <a:ln> <a:noFill/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr rot="0" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr sz="1400" b="0" i="0" u="none" strike="noStrike" kern="1200" spc="0" baseline="0"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="65000"/> <a:lumOff val="35000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> </c:title> <c:autoTitleDeleted val="0"/> <c:plotArea> <c:layout/> <c:scatterChart> <c:scatterStyle val="lineMarker"/> <c:varyColors val="0"/> <c:ser> <c:idx val="0"/> <c:order val="0"/> <c:tx> <c:v>2013 Sales</c:v> </c:tx> <c:spPr> <a:ln w="19050" cap="rnd"> <a:solidFill> <a:srgbClr val="00B0F0"/> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:marker> <c:symbol val="circle"/> <c:size val="5"/> <c:spPr> <a:solidFill> <a:schemeClr val="accent1"/> </a:solidFill> <a:ln w="9525"> <a:solidFill> <a:schemeClr val="accent1"/> </a:solidFill> </a:ln> <a:effectLst/> </c:spPr> </c:marker> <c:xVal> <c:numRef> <c:f>Template!$D$31:$D$45</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="15"/> <c:pt idx="0"> <c:v>39</c:v> </c:pt> <c:pt idx="1"> <c:v>40</c:v> </c:pt> <c:pt idx="2"> <c:v>41</c:v> </c:pt> <c:pt idx="3"> <c:v>42</c:v> </c:pt> <c:pt idx="4"> <c:v>43</c:v> </c:pt> <c:pt idx="5"> <c:v>44</c:v> </c:pt> <c:pt idx="6"> <c:v>45</c:v> </c:pt> <c:pt idx="7"> <c:v>46</c:v> </c:pt> <c:pt idx="8"> <c:v>47</c:v> </c:pt> <c:pt idx="9"> <c:v>48</c:v> </c:pt> <c:pt idx="10"> <c:v>49</c:v> </c:pt> <c:pt idx="11"> <c:v>50</c:v> </c:pt> <c:pt idx="12"> <c:v>51</c:v> </c:pt> <c:pt idx="13"> <c:v>52</c:v> </c:pt> <c:pt idx="14"> <c:v>53</c:v> </c:pt> </c:numCache> </c:numRef> </c:xVal> <c:yVal> <c:numRef> <c:f>Template!$F$31:$F$45</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="15"/> </c:numCache> </c:numRef> </c:yVal> <c:smooth val="0"/> </c:ser> <c:ser> <c:idx val="1"/> <c:order val="1"/> <c:tx> <c:v>2014 Sales</c:v> </c:tx> <c:spPr> <a:ln w="19050" cap="rnd"> <a:solidFill> <a:srgbClr val="00B050"/> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:marker> <c:symbol val="circle"/> <c:size val="5"/> <c:spPr> <a:solidFill> <a:srgbClr val="92D050"/> </a:solidFill> <a:ln w="9525"> <a:noFill/> </a:ln> <a:effectLst/> </c:spPr> </c:marker> <c:xVal> <c:numRef> <c:f>Template!$L$31:$L$38</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="8"/> <c:pt idx="0"> <c:v>39</c:v> </c:pt> <c:pt idx="1"> <c:v>40</c:v> </c:pt> <c:pt idx="2"> <c:v>41</c:v> </c:pt> <c:pt idx="3"> <c:v>42</c:v> </c:pt> <c:pt idx="4"> <c:v>43</c:v> </c:pt> <c:pt idx="5"> <c:v>44</c:v> </c:pt> <c:pt idx="6"> <c:v>45</c:v> </c:pt> <c:pt idx="7"> <c:v>46</c:v> </c:pt> </c:numCache> </c:numRef> </c:xVal> <c:yVal> <c:numRef> <c:f>Template!$N$31:$N$38</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="8"/> </c:numCache> </c:numRef> </c:yVal> <c:smooth val="0"/> </c:ser> <c:dLbls> <c:showLegendKey val="0"/> <c:showVal val="0"/> <c:showCatName val="0"/> <c:showSerName val="0"/> <c:showPercent val="0"/> <c:showBubbleSize val="0"/> </c:dLbls> <c:axId val="-2033363296"/> <c:axId val="-2033362752"/> </c:scatterChart> <c:scatterChart> <c:scatterStyle val="smoothMarker"/> <c:varyColors val="0"/> <c:ser> <c:idx val="2"/> <c:order val="2"/> <c:tx> <c:v>Projection</c:v> </c:tx> <c:spPr> <a:ln w="19050" cap="rnd"> <a:solidFill> <a:srgbClr val="FF0000"/> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:marker> <c:symbol val="none"/> </c:marker> <c:xVal> <c:numRef> <c:f>Template!$L$38:$L$45</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="8"/> <c:pt idx="0"> <c:v>46</c:v> </c:pt> <c:pt idx="1"> <c:v>47</c:v> </c:pt> <c:pt idx="2"> <c:v>48</c:v> </c:pt> <c:pt idx="3"> <c:v>49</c:v> </c:pt> <c:pt idx="4"> <c:v>50</c:v> </c:pt> <c:pt idx="5"> <c:v>51</c:v> </c:pt> <c:pt idx="6"> <c:v>52</c:v> </c:pt> <c:pt idx="7"> <c:v>53</c:v> </c:pt> </c:numCache> </c:numRef> </c:xVal> <c:yVal> <c:numRef> <c:f>Template!$N$38:$N$45</c:f> <c:numCache> <c:formatCode>0</c:formatCode> <c:ptCount val="8"/> <c:pt idx="1"> <c:v>0</c:v> </c:pt> <c:pt idx="2"> <c:v>0</c:v> </c:pt> <c:pt idx="3"> <c:v>0</c:v> </c:pt> <c:pt idx="4"> <c:v>0</c:v> </c:pt> <c:pt idx="5"> <c:v>0</c:v> </c:pt> <c:pt idx="6"> <c:v>0</c:v> </c:pt> <c:pt idx="7"> <c:v>0</c:v> </c:pt> </c:numCache> </c:numRef> </c:yVal> <c:smooth val="0"/> </c:ser> <c:dLbls> <c:showLegendKey val="0"/> <c:showVal val="0"/> <c:showCatName val="0"/> <c:showSerName val="0"/> <c:showPercent val="0"/> <c:showBubbleSize val="0"/> </c:dLbls> <c:axId val="-2033363296"/> <c:axId val="-2033362752"/> </c:scatterChart> <c:scatterChart> <c:scatterStyle val="smoothMarker"/> <c:varyColors val="0"/> <c:ser> <c:idx val="3"/> <c:order val="3"/> <c:tx> <c:v>Factor</c:v> </c:tx> <c:spPr> <a:ln w="19050" cap="rnd"> <a:solidFill> <a:schemeClr val="bg1"> <a:lumMod val="85000"/> </a:schemeClr> </a:solidFill> <a:prstDash val="sysDash"/> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:marker> <c:symbol val="none"/> </c:marker> <c:xVal> <c:numRef> <c:f>Template!$L$31:$L$45</c:f> <c:numCache> <c:formatCode>General</c:formatCode> <c:ptCount val="15"/> <c:pt idx="0"> <c:v>39</c:v> </c:pt> <c:pt idx="1"> <c:v>40</c:v> </c:pt> <c:pt idx="2"> <c:v>41</c:v> </c:pt> <c:pt idx="3"> <c:v>42</c:v> </c:pt> <c:pt idx="4"> <c:v>43</c:v> </c:pt> <c:pt idx="5"> <c:v>44</c:v> </c:pt> <c:pt idx="6"> <c:v>45</c:v> </c:pt> <c:pt idx="7"> <c:v>46</c:v> </c:pt> <c:pt idx="8"> <c:v>47</c:v> </c:pt> <c:pt idx="9"> <c:v>48</c:v> </c:pt> <c:pt idx="10"> <c:v>49</c:v> </c:pt> <c:pt idx="11"> <c:v>50</c:v> </c:pt> <c:pt idx="12"> <c:v>51</c:v> </c:pt> <c:pt idx="13"> <c:v>52</c:v> </c:pt> <c:pt idx="14"> <c:v>53</c:v> </c:pt> </c:numCache> </c:numRef> </c:xVal> <c:yVal> <c:numRef> <c:f>Template!$R$31:$R$45</c:f> <c:numCache> <c:formatCode>0%</c:formatCode> <c:ptCount val="15"/> <c:pt idx="0"> <c:v>0</c:v> </c:pt> <c:pt idx="1"> <c:v>0</c:v> </c:pt> <c:pt idx="2"> <c:v>0</c:v> </c:pt> <c:pt idx="3"> <c:v>0</c:v> </c:pt> <c:pt idx="4"> <c:v>0</c:v> </c:pt> <c:pt idx="5"> <c:v>0</c:v> </c:pt> <c:pt idx="6"> <c:v>0</c:v> </c:pt> <c:pt idx="7"> <c:v>0</c:v> </c:pt> <c:pt idx="8"> <c:v>0</c:v> </c:pt> <c:pt idx="9"> <c:v>0</c:v> </c:pt> <c:pt idx="10"> <c:v>0</c:v> </c:pt> <c:pt idx="11"> <c:v>0</c:v> </c:pt> <c:pt idx="12"> <c:v>0</c:v> </c:pt> <c:pt idx="13"> <c:v>0</c:v> </c:pt> <c:pt idx="14"> <c:v>0</c:v> </c:pt> </c:numCache> </c:numRef> </c:yVal> <c:smooth val="0"/> </c:ser> <c:dLbls> <c:showLegendKey val="0"/> <c:showVal val="0"/> <c:showCatName val="0"/> <c:showSerName val="0"/> <c:showPercent val="0"/> <c:showBubbleSize val="0"/> </c:dLbls> <c:axId val="-2033355680"/> <c:axId val="-2033356768"/> </c:scatterChart> <c:valAx> <c:axId val="-2033363296"/> <c:scaling> <c:orientation val="minMax"/> <c:max val="53"/> <c:min val="39"/> </c:scaling> <c:delete val="0"/> <c:axPos val="b"/> <c:majorGridlines> <c:spPr> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:noFill/> <a:round/> </a:ln> <a:effectLst/> </c:spPr> </c:majorGridlines> <c:numFmt formatCode="General" sourceLinked="1"/> <c:majorTickMark val="none"/> <c:minorTickMark val="none"/> <c:tickLblPos val="nextTo"/> <c:spPr> <a:noFill/> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="25000"/> <a:lumOff val="75000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr rot="-60000000" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr sz="900" b="0" i="0" u="none" strike="noStrike" kern="1200" baseline="0"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="65000"/> <a:lumOff val="35000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> <c:crossAx val="-2033362752"/> <c:crosses val="autoZero"/> <c:crossBetween val="midCat"/> <c:majorUnit val="1"/> </c:valAx> <c:valAx> <c:axId val="-2033362752"/> <c:scaling> <c:orientation val="minMax"/> </c:scaling> <c:delete val="0"/> <c:axPos val="l"/> <c:majorGridlines> <c:spPr> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="15000"/> <a:lumOff val="85000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> </c:majorGridlines> <c:minorGridlines> <c:spPr> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="5000"/> <a:lumOff val="95000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> </c:minorGridlines> <c:numFmt formatCode="General" sourceLinked="1"/> <c:majorTickMark val="none"/> <c:minorTickMark val="none"/> <c:tickLblPos val="nextTo"/> <c:spPr> <a:noFill/> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="25000"/> <a:lumOff val="75000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr rot="-60000000" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr sz="900" b="0" i="0" u="none" strike="noStrike" kern="1200" baseline="0"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="65000"/> <a:lumOff val="35000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> <c:crossAx val="-2033363296"/> <c:crosses val="autoZero"/> <c:crossBetween val="midCat"/> <c:minorUnit val="250"/> </c:valAx> <c:valAx> <c:axId val="-2033356768"/> <c:scaling> <c:orientation val="minMax"/> <c:max val="5"/> <c:min val="0"/> </c:scaling> <c:delete val="0"/> <c:axPos val="r"/> <c:numFmt formatCode="0%" sourceLinked="1"/> <c:majorTickMark val="out"/> <c:minorTickMark val="none"/> <c:tickLblPos val="nextTo"/> <c:spPr> <a:noFill/> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="25000"/> <a:lumOff val="75000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr rot="-60000000" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr sz="900" b="0" i="0" u="none" strike="noStrike" kern="1200" baseline="0"> <a:solidFill> <a:schemeClr val="bg1"> <a:lumMod val="75000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> <c:crossAx val="-2033355680"/> <c:crosses val="max"/> <c:crossBetween val="midCat"/> <c:majorUnit val="0.5"/> </c:valAx> <c:valAx> <c:axId val="-2033355680"/> <c:scaling> <c:orientation val="minMax"/> </c:scaling> <c:delete val="1"/> <c:axPos val="b"/> <c:numFmt formatCode="General" sourceLinked="1"/> <c:majorTickMark val="out"/> <c:minorTickMark val="none"/> <c:tickLblPos val="nextTo"/> <c:crossAx val="-2033356768"/> <c:crosses val="autoZero"/> <c:crossBetween val="midCat"/> </c:valAx> <c:spPr> <a:noFill/> <a:ln> <a:noFill/> </a:ln> <a:effectLst/> </c:spPr> </c:plotArea> <c:legend> <c:legendPos val="b"/> <c:overlay val="0"/> <c:spPr> <a:noFill/> <a:ln> <a:noFill/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr rot="0" spcFirstLastPara="1" vertOverflow="ellipsis" vert="horz" wrap="square" anchor="ctr" anchorCtr="1"/> <a:lstStyle/> <a:p> <a:pPr rtl="0"> <a:defRPr sz="900" b="0" i="0" u="none" strike="noStrike" kern="1200" baseline="0"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="65000"/> <a:lumOff val="35000"/> </a:schemeClr> </a:solidFill> <a:latin typeface="+mn-lt"/> <a:ea typeface="+mn-ea"/> <a:cs typeface="+mn-cs"/> </a:defRPr> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> </c:legend> <c:plotVisOnly val="1"/> <c:dispBlanksAs val="gap"/> <c:showDLblsOverMax val="0"/> </c:chart> <c:spPr> <a:solidFill> <a:schemeClr val="bg1"/> </a:solidFill> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="tx1"> <a:lumMod val="15000"/> <a:lumOff val="85000"/> </a:schemeClr> </a:solidFill> <a:round/> </a:ln> <a:effectLst/> </c:spPr> <c:txPr> <a:bodyPr/> <a:lstStyle/> <a:p> <a:pPr> <a:defRPr/> </a:pPr> <a:endParaRPr lang="en-US"/> </a:p> </c:txPr> <c:printSettings> <c:headerFooter/> <c:pageMargins b="0.75" l="0.7" r="0.7" t="0.75" header="0.3" footer="0.3"/> <c:pageSetup/> </c:printSettings> </c:chartSpace>