能否在C#中使用EPPlus基于内存数据而非工作表数据创建Excel图表?
EPPlus能否直接用内存数据创建Excel图表系列?
不行,EPPlus目前不支持直接通过内存中的原始数据(如数组、列表)创建图表系列。原因在于:
- Excel的图表机制本质上依赖工作表单元格作为数据源,EPPlus的API设计严格遵循Excel文件格式规范,
Series.Add方法仅接受ExcelRange类型的参数,无法直接传入内存数据集合。 - 即使你希望导出后图表不关联数据,也必须先将数据写入工作表(哪怕是隐藏的),否则Excel无法生成有效的图表对象。
替代方案:使用隐藏工作表存放数据
如果不想让用户看到数据源,可以创建一个隐藏的工作表来存储内存数据,再基于这个隐藏表的单元格区域创建图表。示例代码如下:
// 创建隐藏工作表用于存储内存数据 var hiddenDataSheet = package.Workbook.Worksheets.Add("HiddenData"); hiddenDataSheet.Hidden = eWorkSheetHidden.Hidden; // 假设xAxisData是X轴数据列表,yPlanData/yActualData/yForecastData是Y轴数据列表 int rowCount = xAxisData.Count; // 写入X轴数据 for (int i = 0; i < rowCount; i++) { hiddenDataSheet.Cells[i+3, 1].Value = xAxisData[i]; } // 写入Plan数据 for (int i = 0; i < rowCount; i++) { hiddenDataSheet.Cells[i+3, 2].Value = yPlanData[i]; } // 写入Actual数据 for (int i = 0; i < rowCount; i++) { hiddenDataSheet.Cells[i+3, 3].Value = yActualData[i]; } // 写入Forecast数据 for (int i = 0; i < rowCount; i++) { hiddenDataSheet.Cells[i+3, 4].Value = yForecastData[i]; } // 创建图表(数据源指向隐藏工作表) var weekly = worksheetWeekly.Drawings.AddChart("Weekly", eChartType.Area); weekly.SetPosition(1, 0, 1, 0); weekly.SetSize(1300, 500); weekly.Title.Text = "Weekly Plan vs Actual vs Forecast - " + historyModel.WBSCode; weekly.YAxis.Title.Text = headers[0].UOM; var series1 = weekly.Series.Add(hiddenDataSheet.Cells["B3:B" + (rowCount+2)], hiddenDataSheet.Cells["A3:A" + (rowCount+2)]); var series2 = weekly.Series.Add(hiddenDataSheet.Cells["C3:C" + (rowCount+2)], hiddenDataSheet.Cells["A3:A" + (rowCount+2)]); var series3 = weekly.Series.Add(hiddenDataSheet.Cells["D3:D" + (rowCount+2)], hiddenDataSheet.Cells["A3:A" + (rowCount+2)]); series1.Header = "Plan"; series2.Header = "Actual"; series3.Header = "Forecast";
这种方式既避免了在可见工作表中展示复杂数据,又符合EPPlus和Excel的格式要求,生成的图表可以正常显示,且用户不会看到背后的数据源。
内容的提问来源于stack exchange,提问作者Andrew Casey
相关产品推荐
相关产品推荐

