You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用EPPlus创建多系列图表?修复系列标题显示异常

问题:EPPlus创建柱状图时系列标题显示异常

我尝试使用EPPlus创建对应以下数据的柱状图:

AreaImportsExports
North America9.0001083714.54751448
South America7.8781373474.878011063
Europe32.4192430339.37317481
Middle East6.85903158712.94288951
Africa7.6115133412.938054884
Asia36.2319663325.32035526

我的实现代码如下:

dataSheet.Cells["A1"].Value = "Area";
dataSheet.Cells["B1"].Value = "Imports";
dataSheet.Cells["C1"].Value = "Exports";
var row = 2;
foreach (var item in items)
{
    dataSheet.Cells["A" + row].Value = item.GeographicalAreaPersianName;
    dataSheet.Cells["B" + row].Value = item.ImportsShare;
    dataSheet.Cells["C" + row].Value = item.ExportsShare;
    row++;
}
var diagram = diagramSheet.Drawings.AddChart("chart", eChartType.ColumnClustered);
for (int i = 2; i <= row; i++)
{
    var series = diagram.Series.Add($"'Data'!B{i}:C{i}", $"'Data'!A{i}:A{i}");
}
diagram.Border.Fill.Color = System.Drawing.Color.Green;

但实际生成的图表中系列标题显示异常,我无法在EPPlus相关资料中找到有效解决方法,请问该如何修正?


解决方案

我来帮你解决这个问题!你现在的问题出在系列的创建逻辑上——你循环每一行添加了单独的系列,这完全搞反了EPPlus中柱状图系列的设计逻辑。

问题原因分析

你的数据结构里,Imports和Exports才是两个独立的数据系列,每个系列应该包含所有地区的对应数据;而你当前的代码是给每个地区创建一个包含该行两列数据的小系列,这就导致系列标题混乱(每个小系列没有正确的名称映射),最终显示异常。

修正后的代码

我们需要调整图表系列的创建方式,直接创建两个对应Imports和Exports的系列,每个系列绑定整列数据,并手动指定系列标题:

// 数据填充部分(你的原有代码无需修改)
dataSheet.Cells["A1"].Value = "Area";
dataSheet.Cells["B1"].Value = "Imports";
dataSheet.Cells["C1"].Value = "Exports";
var row = 2;
foreach (var item in items)
{
    dataSheet.Cells["A" + row].Value = item.GeographicalAreaPersianName;
    dataSheet.Cells["B" + row].Value = item.ImportsShare;
    dataSheet.Cells["C" + row].Value = item.ExportsShare;
    row++;
}

// 修正后的图表创建逻辑
var diagram = diagramSheet.Drawings.AddChart("chart", eChartType.ColumnClustered);

// 添加Imports系列:绑定B2到最后一行的Imports数据,类别轴为A列的地区名称
var importsSeries = diagram.Series.Add($"'Data'!B2:B{row-1}", $"'Data'!A2:A{row-1}");
importsSeries.Header = dataSheet.Cells["B1"].Value.ToString(); // 指定系列标题为"Imports"

// 添加Exports系列:绑定C2到最后一行的Exports数据,类别轴同样为A列的地区名称
var exportsSeries = diagram.Series.Add($"'Data'!C2:C{row-1}", $"'Data'!A2:A{row-1}");
exportsSeries.Header = dataSheet.Cells["C1"].Value.ToString(); // 指定系列标题为"Exports"

// 可选:设置图表标题、调整样式
diagram.Title.Text = "Imports vs Exports by Area";
diagram.Border.Fill.Color = System.Drawing.Color.Green;

修正说明

  1. 系列绑定逻辑:每个系列对应一列完整数据(而非单行两列),这样图表会以Area为横轴,每个地区显示两个柱状条分别代表Imports和Exports。
  2. 手动指定系列标题:通过Series.Header属性直接设置系列名称,确保标题和表头一致,避免EPPlus自动生成的异常标题。
  3. 数据范围计算:row-1是因为循环结束后row的值是最后一行的下一行,所以实际数据行是从2到row-1。

这样修改后,生成的图表就能正确显示系列标题,完全符合你的预期样式。

内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:35