如何用EPPlus创建多系列图表?修复系列标题显示异常
问题:EPPlus创建柱状图时系列标题显示异常
我尝试使用EPPlus创建对应以下数据的柱状图:
| Area | Imports | Exports |
|---|---|---|
| North America | 9.00010837 | 14.54751448 |
| South America | 7.878137347 | 4.878011063 |
| Europe | 32.41924303 | 39.37317481 |
| Middle East | 6.859031587 | 12.94288951 |
| Africa | 7.611513341 | 2.938054884 |
| Asia | 36.23196633 | 25.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;
修正说明
- 系列绑定逻辑:每个系列对应一列完整数据(而非单行两列),这样图表会以
Area为横轴,每个地区显示两个柱状条分别代表Imports和Exports。 - 手动指定系列标题:通过
Series.Header属性直接设置系列名称,确保标题和表头一致,避免EPPlus自动生成的异常标题。 - 数据范围计算:
row-1是因为循环结束后row的值是最后一行的下一行,所以实际数据行是从2到row-1。
这样修改后,生成的图表就能正确显示系列标题,完全符合你的预期样式。
内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli
相关产品推荐
相关产品推荐

