不推荐新项目使用 Microsoft.Office.Interop.Excel 自动生成图表,因其依赖本地 Excel、易卡死报错、无法跨平台;应优先选用 EPPlus v6+ 等无依赖方案。

用 Microsoft.Office.Interop.Excel 画图前先确认你真需要它
直接说结论:不推荐新项目用 Microsoft.Office.Interop.Excel 自动生成图表,尤其在服务器环境或无人值守场景下。它依赖本地安装的 Excel 桌面程序,容易卡死、报错、权限异常,且无法跨平台。
常见错误现象:COMException: 拒绝访问、RPC_E_SERVERFAULT、进程残留(Excel 进程不退出)、生成图表后样式错乱或数据不刷新。
- 仅适合 Windows 桌面端、有用户交互、已明确装了 Office 的内部工具
- 若需导出图表为图片/PDF/无依赖分发,优先考虑
EPPlus(v6+)或NPOI -
Interop对图表类型支持全但控制粒度粗,比如改柱状图颜色得靠Series.Format.Fill链式调用,稍错就静默失败
EPPlus v6+ 怎么加柱状图和折线图(不依赖 Excel 安装)
EPPlus 从 v6 开始原生支持图表(ExcelChart),无需 COM,纯内存操作,生成的 .xlsx 文件可直接被 Excel 打开并正常显示图表。
使用场景:导出带图表的报表、定时任务生成数据看板、Web 后端返回含图表的 Excel。
- 必须引用
EPPlusv6.2+(旧版无图表 API);NuGet 包名:EPPlus - 图表数据源必须是工作表中真实存在的单元格区域(不能是数组或临时数据)
- 折线图和柱状图创建方式类似,区别在
ChartType枚举值:eChartType.ColumnClusteredvseChartType.Line - 性能好,但不支持 3D 图表、组合图(如柱+折线同图)或动态公式驱动的数据源
简短示例:
var chart = worksheet.Drawings.AddChart("chart1", eChartType.ColumnClustered);
chart.SetPosition(5, 0, 10, 0); // 行偏移、列偏移
chart.SetSize(400, 300);
chart.Series.Add(worksheet.Cells["B2:B6"], worksheet.Cells["A2:A6"]); // 值、类别
饼图怎么填数据才不会“只显示一个扇区”
用 EPPlus 加饼图时,最常踩的坑是数据区域选错——饼图只接受「单列数值 + 单列标签」,且不能含标题行(除非显式跳过)。
错误现象:生成的饼图只有一个扇区,占比 100%,其余数据消失;或报 NullReferenceException 在 Series.Add。
- 确保值区域(
B2:B5)是连续数字列,无空单元格、无文本、无公式错误 - 标签区域(
A2:A5)必须与值区域行数严格一致,且不能包含合计行或空行 - 如果原始数据带标题,别把标题单元格传进去;可用
worksheet.Cells["A2:A5"]显式避开第 1 行 -
EPPlus饼图不支持「分离扇区」或「爆炸效果」等高级样式(v6.3 仍缺失)
为什么用 NPOI 画图会失败或图表空白
NPOI 当前(v2.7.x)对图表支持极弱:只能读取已有图表,几乎不能新建。试图调用 XSSFDrawing.CreateChart 会抛 NotSupportedException 或生成损坏文件。
这不是你代码写错了,是库本身限制。官方 GitHub 上相关 issue 标记为 “low priority” 已多年。
- 别浪费时间查
NPOI图表文档——它没实现 - 若项目已深度绑定
NPOI且必须加图,唯一可行路径:用NPOI写好数据,再用EPPlus打开同一文件补图表(注意文件流别冲突) - 服务器部署时,
EPPlus要求System.Drawing.Common在 Linux 上需额外装 libgdiplus,Windows 无需
真正麻烦的从来不是“怎么画出来”,而是“画完能不能稳定打开、数据会不会丢、换台电脑还灵不灵”。Interop 看似简单,实际埋雷最多;EPPlus 路子正,但得盯紧版本和数据结构。


















