别用 microsoft.office.interop.excel,尤其在 web api、windows service 或 docker 容器中——会因架构不兼容抛 com 类工厂异常;推荐 epplus 6+(纯托管、零 office 依赖、mit 免费商用),注意不支持 .xls、需 .net 6+、首次使用须设 licensecontext。

别用 Microsoft.Office.Interop.Excel,尤其在 Web API、Windows Service 或 Docker 容器里——它会直接抛 Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed,不是配置问题,是架构不兼容。
EPPlus 是 .NET 6+ 项目读写 Excel 的事实标准
它纯托管、零 Office 依赖、API 直观、MIT 免费商用(6.x 起),且对 .xlsx 格式支持最稳。但注意:不支持 .xls;若必须处理旧文件,先用 LibreOffice 命令行转格式再进流程。
-
EPPlus 6+不再支持.NET Framework 4.6.1以下版本,老项目升级前先核对目标框架 - NuGet 安装命令:
Install-Package EPPlus(别装EPPlus.Core,已停更) - 首次使用需调用
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;(非商业用途)或申请商业许可
LoadFromCollection 导入:别手动遍历 Cells
用 worksheet.Cells["A1"].LoadFromCollection<t>(list, true)</t> 直接映射,比手写循环快 3–5 倍,也避免空指针和越界。
本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看
-
T类属性名必须与 Excel 表头文字**完全一致**(忽略大小写,但空格、标点不能差) - 想匹配中文表头?加
[DisplayName("用户姓名")]特性;想控制列顺序?用[Column(Order = 2)] - 空单元格默认映射为
null(引用类型)或default(T)(值类型),如需跳过整行,得自己后置过滤:.Where(x => !string.IsNullOrWhiteSpace(x.Name))
导出时日期变数字、列宽挤成一条线?这些细节必须手动设
LoadFromCollection 写出的 Excel,时间字段底层是 double 序列号,不设格式就显示为 45123 这类数字;列宽默认为 0,内容全被截断。
- 设日期格式:
worksheet.Column(3).Style.Numberformat.Format = "yyyy-mm-dd";(列索引从 1 开始) - 自动列宽:
worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();,但大数据量时慎用,CPU 占用高 - 导出后必须调
package.SaveAs(new FileInfo("output.xlsx")),只调package.Save()会写进内存流,文件为空
读大文件(>10 万行)不崩的关键就两件事
EPPlus 全部数据进内存,LoadFromCollection 一次性加载百万行极易触发 OutOfMemoryException,且 GC 很难及时回收。
- 导入时务必加
AutoFilter = true参数(即LoadFromCollection(list, true, TableStyles.Medium2)),能显著降低内存峰值 - 真正可靠的大数据方案是分块读:用
worksheet.Cells[row, col].Value循环取值,每 5 万行手动GC.Collect()(仅应急),长期应改用流式库如SpreadsheetLight或自建 Open XML 流写入 - 别信“调大服务器内存就能扛住”——内存涨得比 GC 回收快,进程迟早被系统杀掉










