使用 epplus 复制 Excel 图表线
Duplicate Excel graph line using epplus
我正在使用 epplus
编辑现有的 excel 文件。 excel 文件由几个 sheet 组成,在其中一个 sheet 中,我有一个图表指向另一个 sheet 中的数据。
接下来,我将其中一个数据 sheets(比如 sheet A)复制到另一个数据(sheet B)。我想更新我的图表并向其添加一条指向 sheet B 的线。我不知道数据在哪一列中。我的想法是从对应于 sheet A 的数据的图表行中获取此信息。
我可以找到sheet A对应的serie
,但是我看不到关于列的信息在哪里。
如何提取此信息?
所以在没有得到答案之后,我通过反射破解了它并获取了底层的私有字段。这不是我想要做的,但它暂时解决了我的问题。
在此示例中,oldSheetName
是我要复制其行的 sheet。我希望有一天这对某人有所帮助。
foreach (ExcelChartSerie serie in chart.Series)
{
if (!serie.HeaderAddress.Address.Contains(oldSheetName)) continue;
FieldInfo property = serie.GetType().GetField("_node", BindingFlags.NonPublic | BindingFlags.Instance);
XmlNode node = property.GetValue(serie) as XmlNode;
string xval = node["c:xVal"]?["c:numRef"]?["c:f"]?.InnerText
.Replace(oldSheetName + "!", "").Replace("$", "") ?? "";
string yval = node["c:yVal"]?["c:numRef"]?["c:f"]?.InnerText
.Replace(oldSheetName + "!", "").Replace("$", "") ?? "";
var newSerie = chart.Series.Add(newSheet.Cells[xval], newSheet.Cells[yval]);
newSerie.HeaderAddress = new ExcelAddress(serie.HeaderAddress.Address.Replace(oldSheetName, newSheet.Name));
break;
}
我正在使用 epplus
编辑现有的 excel 文件。 excel 文件由几个 sheet 组成,在其中一个 sheet 中,我有一个图表指向另一个 sheet 中的数据。
接下来,我将其中一个数据 sheets(比如 sheet A)复制到另一个数据(sheet B)。我想更新我的图表并向其添加一条指向 sheet B 的线。我不知道数据在哪一列中。我的想法是从对应于 sheet A 的数据的图表行中获取此信息。
我可以找到sheet A对应的serie
,但是我看不到关于列的信息在哪里。
如何提取此信息?
所以在没有得到答案之后,我通过反射破解了它并获取了底层的私有字段。这不是我想要做的,但它暂时解决了我的问题。
在此示例中,oldSheetName
是我要复制其行的 sheet。我希望有一天这对某人有所帮助。
foreach (ExcelChartSerie serie in chart.Series)
{
if (!serie.HeaderAddress.Address.Contains(oldSheetName)) continue;
FieldInfo property = serie.GetType().GetField("_node", BindingFlags.NonPublic | BindingFlags.Instance);
XmlNode node = property.GetValue(serie) as XmlNode;
string xval = node["c:xVal"]?["c:numRef"]?["c:f"]?.InnerText
.Replace(oldSheetName + "!", "").Replace("$", "") ?? "";
string yval = node["c:yVal"]?["c:numRef"]?["c:f"]?.InnerText
.Replace(oldSheetName + "!", "").Replace("$", "") ?? "";
var newSerie = chart.Series.Add(newSheet.Cells[xval], newSheet.Cells[yval]);
newSerie.HeaderAddress = new ExcelAddress(serie.HeaderAddress.Address.Replace(oldSheetName, newSheet.Name));
break;
}