NPOI和ClosedXML
在Unity中操作Excel,到底使用哪个库呢?
🔍 快速结论(优先推荐):
如果你是: | 推荐使用 |
---|---|
Unity 项目,兼容性优先、跨平台稳定 | ✅ NPOI(推荐) |
非 Unity 项目,如纯 .NET 工具或编辑器插件 | ✅ ClosedXML |
🧩 详细对比:NPOI vs ClosedXML(Unity 环境适配)
特性 | NPOI | ClosedXML |
---|---|---|
✅ 是否兼容 Unity | ✅ 非常好(长期使用验证) | ⚠️ 依赖 System.Drawing,Unity 中容易出错 |
📦 是否需要 DLL 拓展 | 有预编译版本或 UnityPackage 支持 | 需要手动移除不兼容的 System.Drawing 引用 |
📄 支持格式 | .xls , .xlsx |
.xlsx |
👩💻 使用复杂度 | 中等 | 简单、语法类似 LINQ |
🌍 跨平台(Mac/Linux/Android) | ✅ 支持良好 | ⚠️ 需改造,Unity中易崩 |
📦 文件大小 | 中 | 大,依赖多 |
📈 运行效率 | 快 | 略慢,但更现代 |
🧰 编辑器内使用 | ✅ Editor 窗口集成容易 | ❌ 容易因为依赖崩溃 Unity |
✅ 推荐:Unity 项目中使用 NPOI
- 🎯 社区广泛验证
- ✅ 支持
.xlsx
(XSSF) 与.xls
(HSSF) - ✅ 可用于编辑器工具、运行时读取配置等场景
⚠️ 不推荐在 Unity 中使用 ClosedXML 的原因:
-
ClosedXML 依赖 OpenXML SDK + System.Drawing.Common
Unity 并不完全支持这两个组件,尤其在 Mac 和安卓环境中容易出现崩溃或构建错误。 -
ClosedXML 体积庞大
需要引入很多 .NET 库和 NuGet 包,对 Unity 项目不友好。
✅ 我的建议:
-
你在 Unity 中开发任务系统、红点系统、Excel 导入工具 → 100% 推荐 NPOI
-
如果你真的想用 ClosedXML,建议:
- 仅在 外部 .NET 工具项目中 使用(例如生成 JSON 然后导入 Unity)
- 不建议嵌入到 Unity 项目里
🎁 附:NPOI + Unity 使用小技巧
- 只引入
NPOI.XSSF
、NPOI.HSSF
、NPOI.SS
DLL,放入Plugins/NPOI/
- 不要引入
System.Drawing.*
- 只使用
.xlsx
文件即可,避免.xls
的老格式兼容问题
NPOI (.NET POI)
优点
- 纯C#实现:无需COM组件或Office安装,跨平台性好(Windows、macOS、Linux)。
- 轻量级:无需依赖其他DLL,适合Unity项目的性能要求。
- 功能全面:支持Excel 97-2003 (.xls) 和 Excel 2007+ (.xlsx) 格式。
- 开源免费:适合商业项目。
缺点
- API复杂:代码量较大,使用不够直观。
- 社区支持有限:中文资料较多,但最新版本更新较慢。
适用场景
- 需要跨平台兼容性(如在Linux服务器上处理Excel)。
- 项目对性能要求高,需轻量级解决方案。
- 需兼容旧版Excel格式(.xls)。
ClosedXML
优点
- 现代API:代码简洁,支持链式调用,开发效率高。
- 功能丰富:支持高级样式、图表、数据验证等复杂操作。
- 社区活跃:更新频繁,文档完善。
缺点
- 依赖较多:需要额外的DLL,可能增加包体大小。
- 跨平台限制:在某些非Windows平台可能存在兼容性问题(如IL2CPP编译错误)。
适用场景
- 开发Windows平台的Unity项目(如编辑器扩展)。
- 需要快速实现复杂Excel操作(如样式设计、图表生成)。
- 追求代码简洁和开发效率。
Unity集成建议
- NPOI集成示例
- 下载NPOI DLL(推荐2.5.6版本,兼容性好)。
- 将DLL放入
Assets/Plugins
文件夹。 - 示例代码:
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
public class ExcelManager
{
public void ReadExcel(string filePath)
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new XSSFWorkbook(fs);
ISheet sheet = workbook.GetSheetAt(0);
// 读取数据
for (int row = 0; row <= sheet.LastRowNum; row++)
{
IRow dataRow = sheet.GetRow(row);
if (dataRow != null)
{
string cellValue = dataRow.GetCell(0)?.ToString();
Debug.Log($"Row {row}, Cell 0: {cellValue}");
}
}
}
}
}
- ClosedXML集成示例
- 下载ClosedXML和相关依赖DLL。
- 将DLL放入
Assets/Plugins
文件夹(注意:需兼容.NET Standard 2.0)。 - 示例代码:
using ClosedXML.Excel;
using System.IO;
public class ExcelManager
{
public void ReadExcel(string filePath)
{
using (var workbook = new XLWorkbook(filePath))
{
var worksheet = workbook.Worksheet(1);
var range = worksheet.RangeUsed();
foreach (var row in range.Rows())
{
string cellValue = row.Cell(1).GetString();
Debug.Log($"Row {row.RowNumber()}, Cell 1: {cellValue}");
}
}
}
}
性能与兼容性
- 性能:NPOI在读取大型Excel时略快,ClosedXML在写入复杂样式时更高效。
- 兼容性:
- NPOI需注意Unity版本对.NET的支持(如IL2CPP编译可能报错,需添加
link.xml
)。 - ClosedXML在非Windows平台可能因依赖问题导致运行时错误。
- NPOI需注意Unity版本对.NET的支持(如IL2CPP编译可能报错,需添加
总结
- 优先选择NPOI:如果需要跨平台支持、轻量级方案,或需兼容旧版Excel。
- 优先选择ClosedXML:如果开发Windows项目,追求代码简洁,且需要高级Excel功能。
根据项目需求权衡利弊,建议先在测试环境验证所选库的兼容性和性能。