.NET 6+C#环境下,如何仅用可用工具解析服务器上的Excel(.xlsx)文件
适用于C#/.NET 6的免费Excel(.xlsx)解析方案
针对你排除Ole自动化、ACE组件及付费组件的场景,以下两种方案完全满足需求,无需额外服务器依赖:
1. 微软官方Open XML SDK
这是微软为Office Open XML格式(.xlsx属于该格式)提供的免费开源库,无需安装Office或任何额外服务器组件,直接通过NuGet引入即可使用,完全无许可风险。
实现步骤:
- 安装NuGet包:
Install-Package DocumentFormat.OpenXml - 读取示例代码:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.Collections.Generic; public List<List<string>> ReadXlsxViaOpenXml(string filePath) { var sheetData = new List<List<string>>(); using (var doc = SpreadsheetDocument.Open(filePath, false)) { var workbookPart = doc.WorkbookPart; var worksheetPart = workbookPart.WorksheetParts.First(); var rows = worksheetPart.Worksheet.Elements<SheetData>().First().Elements<Row>(); foreach (var row in rows) { var rowValues = new List<string>(); foreach (var cell in row.Elements<Cell>()) { string value = cell.CellValue?.Text ?? string.Empty; // 处理共享字符串类型的单元格 if (cell.DataType is not null && cell.DataType.Value == CellValues.SharedString) { var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); if (stringTable != null) { value = stringTable.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(value)).InnerText; } } rowValues.Add(value); } sheetData.Add(rowValues); } } return sheetData; }
注意:该库需要手动处理单元格的数据类型(如共享字符串、数字格式转换等),适合需要精细控制Excel解析逻辑的场景。
2. EPPlus LGPL开源版本
EPPlus是一款封装更友好的Excel操作库,5.x及之前的部分版本采用LGPL开源许可,非商用场景可免费使用,API更直观,上手成本更低。
实现步骤:
- 安装NuGet包:
Install-Package EPPlus -Version 5.8.1(此版本为LGPL许可的稳定版本) - 读取示例代码:
using OfficeOpenXml; using System.Collections.Generic; using System.IO; public List<List<string>> ReadXlsxViaEPPlus(string filePath) { var sheetData = new List<List<string>>(); // 非商用场景设置许可上下文 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(new FileInfo(filePath))) { var worksheet = package.Workbook.Worksheets.First(); int maxRow = worksheet.Dimension.End.Row; int maxCol = worksheet.Dimension.End.Column; for (int row = 1; row <= maxRow; row++) { var rowValues = new List<string>(); for (int col = 1; col <= maxCol; col++) { rowValues.Add(worksheet.Cells[row, col].Text ?? string.Empty); } sheetData.Add(rowValues); } } return sheetData; }
注意:商用场景需确认EPPlus的许可条款,若不符合LGPL要求则需使用其商业版本,但你的场景排除了付费组件,非商用场景可放心使用。
内容的提问来源于stack exchange,提问作者Sonnich Jensen
相关产品推荐
相关产品推荐

