如何在没有工作表名称的情况下引用当前工作表数据

我打算使用Java库POI从Excel模板中读取表单,填充数据并将其存储到重复n次的目标工作簿。 模板/主表单包含一个graphics,graphics的“系列值”必须由表单名称组成,例如=sheet1!$D$52:$D$310

我觉得这会干扰我对模板的理解,因为克隆的表单将不可避免地需要新的名字,图表系列将不能再引用它们。

有没有办法很容易地解决这个问题,或者通过图表系列做些聪明的事情或者在POI中做点什么?

促进对答案的评论….

通常build议的方法是创build一些命名范围,指向文件的虚拟位。 在文件中创build一个或多个图表,使用命名的范围来提供数据。 调整你的图表,直到他们看起来正确。

然后,在POI中,添加您的数据。 这可以通过追加行,或通过添加新的工作表。无论为你工作! 完成后,使用POI更新命名范围以指向新数据。 保存,在Excel中加载,并享受shiny的graphics!

你唯一需要处理的事情就是不要在你的图表上做任何与幻灯片相关的绘图或评论,也不要试图用评论或图表克隆表格。 图片克隆没有(当前)修复绘图引用,所以事情冒险然后出错,绘制相关的东西,如graphics。 只要你在你的处理过程中只克隆非graphics表单,你应该用命名的范围方法

我在.NET中使用EPPlus库,但我希望这个技巧也可以工作。

假设:

  • 你有一个名为“TEMPLATE”的工作表
  • 您已经在Excel中创build了图表
  • 你只是以此为出发点。 它适合我,但可能更复杂,以适应特殊情况。
  • 您的图表(在Excel本身内创build)已经将系列设置为指向工作表上的数据,并且您打算从代码中更新此数据。 如果你打算插入行或列,下面的这个简单的方法将会失败。

一旦我克隆了一个工作表(ws),我只需遍历图表,并通过在<c:f>findXML中的元素来修改系列引用,例如<c:f>TEMPLATE!$D$31:$D$45</c:f>然后我只是将这个Xml更改为我的克隆工作表的正确名称。

  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" + "!"); } } 

这里是ChartXml的完整示例Xml,它是包含多个系列的graphics。 上面的代码设法修复克隆工作表的引用。

 <?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>