在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 的原因:

  1. ClosedXML 依赖 OpenXML SDK + System.Drawing.Common
    Unity 并不完全支持这两个组件,尤其在 Mac 和安卓环境中容易出现崩溃或构建错误。

  2. ClosedXML 体积庞大
    需要引入很多 .NET 库和 NuGet 包,对 Unity 项目不友好。


✅ 我的建议:

  • 你在 Unity 中开发任务系统、红点系统、Excel 导入工具100% 推荐 NPOI

  • 如果你真的想用 ClosedXML,建议:

    • 仅在 外部 .NET 工具项目中 使用(例如生成 JSON 然后导入 Unity)
    • 不建议嵌入到 Unity 项目里

🎁 附:NPOI + Unity 使用小技巧

  • 只引入 NPOI.XSSFNPOI.HSSFNPOI.SS DLL,放入 Plugins/NPOI/
  • 不要引入 System.Drawing.*
  • 只使用 .xlsx 文件即可,避免 .xls 的老格式兼容问题

NPOI (.NET POI)

优点

  1. 纯C#实现:无需COM组件或Office安装,跨平台性好(Windows、macOS、Linux)。
  2. 轻量级:无需依赖其他DLL,适合Unity项目的性能要求。
  3. 功能全面:支持Excel 97-2003 (.xls) 和 Excel 2007+ (.xlsx) 格式。
  4. 开源免费:适合商业项目。

缺点

  • API复杂:代码量较大,使用不够直观。
  • 社区支持有限:中文资料较多,但最新版本更新较慢。

适用场景

  • 需要跨平台兼容性(如在Linux服务器上处理Excel)。
  • 项目对性能要求高,需轻量级解决方案。
  • 需兼容旧版Excel格式(.xls)。

ClosedXML

优点

  1. 现代API:代码简洁,支持链式调用,开发效率高。
  2. 功能丰富:支持高级样式、图表、数据验证等复杂操作。
  3. 社区活跃:更新频繁,文档完善。

缺点

  • 依赖较多:需要额外的DLL,可能增加包体大小。
  • 跨平台限制:在某些非Windows平台可能存在兼容性问题(如IL2CPP编译错误)。

适用场景

  • 开发Windows平台的Unity项目(如编辑器扩展)。
  • 需要快速实现复杂Excel操作(如样式设计、图表生成)。
  • 追求代码简洁和开发效率。

Unity集成建议

  1. 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}");
                }
            }
        }
    }
}
  1. 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:如果需要跨平台支持、轻量级方案,或需兼容旧版Excel。
  • 优先选择ClosedXML:如果开发Windows项目,追求代码简洁,且需要高级Excel功能。

根据项目需求权衡利弊,建议先在测试环境验证所选库的兼容性和性能。