.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 使用不同的工作簿实现处理这两种格式:
| 格式 | 实现 | 文件类型 |
|---|---|---|
| XLS | HSSFWorkbook | Excel 97-2003,BIFF8 二进制格式 |
| XLSX | XSSFWorkbook | Office 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 等依赖,因此不能称为没有依赖的库。目标框架与依赖列表
建议按以下顺序验证:
- 在 Android、iOS 和 Windows 的 Release 构建中分别生成 XLS、XLSX,尤其要覆盖 iOS 真机以及实际使用的 AOT、裁剪配置。
- 用 Excel 打开导出文件,检查中文、填充色、边框和数字格式,确认没有文件修复提示。
- 先使用示例中的固定列宽,再单独验证自动列宽、图片处理等功能。将字体名称写入文件与在设备上测量字体是不同操作,后者更容易受运行环境影响。
- 检查最终解析到的依赖版本及许可。固定 NPOI 版本不等于固定全部传递依赖,也不保证旧版本持续获得维护。
XLS 每张工作表最多支持 65,536 行、256 列。数据量超过限制时,需要拆分工作表或使用 XLSX。格式容量限制
如果你的硬性条件是“免费且已确认三个平台全部无兼容问题”,仅凭上述文档还无法作出保证。可以先用 NPOI 2.7.6 做实际验证,再根据依赖、发布配置和导出功能判断是否适用。
备注:内容仅供参考。
