如何用C#写入.xlsb二进制文件?OpenXML无效且不想用Excel Interop
不依赖Excel Interop的C#写入.xlsb文件方案
方案1:使用EPPlus库
EPPlus从5.x版本开始原生支持Excel二进制格式(.xlsb),非商用场景可免费使用,步骤如下:
- 通过NuGet安装
EPPlus包 - 示例代码:
using OfficeOpenXml; using System.IO; // 设置许可证上下文(非商用场景) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 创建或打开.xlsb文件 using var package = new ExcelPackage(new FileInfo("output.xlsb")); var worksheet = package.Workbook.Worksheets.Add("Sheet1"); // 写入数据 worksheet.Cells["A1"].Value = "ID"; worksheet.Cells["B1"].Value = "Name"; worksheet.Cells["A2"].Value = 1; worksheet.Cells["B2"].Value = "张三"; // 保存文件 package.Save();
方案2:使用NPOI库
NPOI是开源.NET库,支持全系列Excel格式(包括.xlsb),无商用限制:
- 通过NuGet安装
NPOI和NPOI.OOXML包 - 示例代码:
using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using System.IO; // 创建.xlsb工作簿实例 IWorkbook workbook = new XSSFWorkbook(XSSFWorkbookType.XLSB); ISheet sheet = workbook.CreateSheet("Sheet1"); // 写入表头 IRow headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("ID"); headerRow.CreateCell(1).SetCellValue("Name"); // 写入数据行 IRow dataRow = sheet.CreateRow(1); dataRow.CreateCell(0).SetCellValue(1); dataRow.CreateCell(1).SetCellValue("张三"); // 输出到文件 using var fs = new FileStream("output.xlsb", FileMode.Create); workbook.Write(fs);
OpenXML SDK的正确用法(针对你的失败情况)
OpenXML本身支持.xlsb,之前失败大概率是未正确处理二进制包结构。.xlsb与.xlsx的核心区别是用二进制存储XML部件,以下是可运行的示例:
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; // 创建.xlsb文件 using var spreadsheetDocument = SpreadsheetDocument.Create( "output.xlsb", SpreadsheetDocumentType.Workbook); // 添加工作簿部件 var workbookPart = spreadsheetDocument.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); // 添加工作表部件并关联 var worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); var sheets = workbookPart.Workbook.AppendChild(new Sheets()); sheets.Append(new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }); // 获取数据容器并写入内容 var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); // 表头行 sheetData.Append(new Row( new Cell() { CellValue = new CellValue("ID"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("Name"), DataType = CellValues.String } )); // 数据行 sheetData.Append(new Row( new Cell() { CellValue = new CellValue("1"), DataType = CellValues.Number }, new Cell() { CellValue = new CellValue("张三"), DataType = CellValues.String } )); // 保存工作簿 workbookPart.Workbook.Save();
内容的提问来源于stack exchange,提问作者Aakash Joshi
相关产品推荐
相关产品推荐

