PAYATHON 2026

.NET MAUI 有免费跨平台库可生成带样式的 XLS 和 XLSX 吗?

数据阿明

可以将 NPOI 的 Apache-2.0 许可版本列为候选,例如 NPOI 2.7.6。它可以生成 XLS、XLSX 文件并设置单元格样式。不过,现有资料无法保证它在你的 Android、iOS 和 Windows 发布配置中都无需适配。建议先在实际发布配置中验证导出,再确定是否选用。

为什么需要指定 NPOI 版本?

NPOI 2.7.6 的 NuGet 页面标注其采用 Apache-2.0 许可,可以作为免费方案评估。使用时需要遵守该许可及各依赖的许可要求。NPOI 2.7.6 包信息

从 2.8.0 起,项目为二进制发行包和 NuGet 包增加了维护费 EULA,涉及产生收入的用户或组织。因此,不能认为所有版本和使用场景都免费。NPOI 项目说明

XLS 和 XLSX 分别如何生成?

NPOI 使用不同的工作簿实现处理这两种格式:

格式实现文件类型
XLSHSSFWorkbookExcel 97-2003,BIFF8 二进制格式
XLSXXSSFWorkbookOffice Open XML 格式

两种实现可以通过 IWorkbook 接口共用逻辑。文件扩展名必须与工作簿实现一致,直接修改扩展名不能将 XLSX 转为 XLS。NPOI 格式对照

NPOI 支持单元格样式和数据格式,使用时不需要安装 Microsoft Office,也不需要使用 Excel COM Interop,符合移动端导出的基本方向。NPOI 功能说明

如何生成带字体、颜色、边框和数字格式的文件?

安装时可以指定版本:

dotnet add package NPOI --version 2.7.6

下面的示例返回文件字节,可以接入 MAUI 的文件保存或分享流程。示例只展示生成逻辑,尚未在你的各平台项目中运行验证。

using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

public static class ReportExporter
{
    public static byte[] CreateReport(bool useXlsx)
    {
        using IWorkbook workbook = useXlsx
            ? new XSSFWorkbook()
            : new HSSFWorkbook();

        var sheet = workbook.CreateSheet("Report");
        sheet.SetColumnWidth(0, 24 * 256);

        var font = workbook.CreateFont();
        font.IsBold = true;
        font.Color = IndexedColors.White.Index;

        var headerStyle = workbook.CreateCellStyle();
        headerStyle.SetFont(font);
        headerStyle.FillForegroundColor = IndexedColors.DarkBlue.Index;
        headerStyle.FillPattern = FillPattern.SolidForeground;
        headerStyle.BorderTop = BorderStyle.Thin;
        headerStyle.BorderBottom = BorderStyle.Thin;
        headerStyle.BorderLeft = BorderStyle.Thin;
        headerStyle.BorderRight = BorderStyle.Thin;

        var header = sheet.CreateRow(0).CreateCell(0);
        header.SetCellValue("Amount");
        header.CellStyle = headerStyle;

        var numberStyle = workbook.CreateCellStyle();
        numberStyle.DataFormat = workbook.CreateDataFormat()
            .GetFormat("#,##0.00");

        var value = sheet.CreateRow(1).CreateCell(0);
        value.SetCellValue(1234.5);
        value.CellStyle = numberStyle;

        using var output = new MemoryStream();
        workbook.Write(output, leaveOpen: true);
        return output.ToArray();
    }
}

调用 CreateReport(false) 时使用 .xls 扩展名;调用 CreateReport(true) 时使用 .xlsx 扩展名。数字按数值类型写入,再设置显示格式,可以保留后续计算能力。

在 MAUI 中还需要验证什么?

NPOI 2.7.6 提供 .NET Standard 等目标框架,但 NuGet 中 Android、iOS 的 computed 兼容标记是基于框架兼容性推导的,并不代表经过真机测试。它还有 SixLabors.Fonts、SixLabors.ImageSharp 等依赖,因此不能称为没有依赖的库。目标框架与依赖列表

建议按以下顺序验证:

  1. 在 Android、iOS 和 Windows 的 Release 构建中分别生成 XLS、XLSX,尤其要覆盖 iOS 真机以及实际使用的 AOT、裁剪配置。
  2. 用 Excel 打开导出文件,检查中文、填充色、边框和数字格式,确认没有文件修复提示。
  3. 先使用示例中的固定列宽,再单独验证自动列宽、图片处理等功能。将字体名称写入文件与在设备上测量字体是不同操作,后者更容易受运行环境影响。
  4. 检查最终解析到的依赖版本及许可。固定 NPOI 版本不等于固定全部传递依赖,也不保证旧版本持续获得维护。

XLS 每张工作表最多支持 65,536 行、256 列。数据量超过限制时,需要拆分工作表或使用 XLSX。格式容量限制

如果你的硬性条件是“免费且已确认三个平台全部无兼容问题”,仅凭上述文档还无法作出保证。可以先用 NPOI 2.7.6 做实际验证,再根据依赖、发布配置和导出功能判断是否适用。

备注:内容仅供参考。