如何用C# .NET Core 6.0读取SharePoint中的Excel并转为C#对象?
方案1:使用Microsoft Graph API(推荐,适配现代SharePoint/OneDrive)
前置准备
- 在Azure AD注册应用,授予
Files.Read或Sites.Read.All权限(根据访问范围选择) - 安装NuGet包:
Microsoft.Graph、Microsoft.Graph.Auth、EPPlus(用于Excel解析)
代码实现
- 初始化Graph客户端并获取文件流
using Microsoft.Graph; using Azure.Identity; using OfficeOpenXml; // 配置认证参数 var scopes = new[] { "https://graph.microsoft.com/.default" }; var tenantId = "你的租户ID"; var clientId = "你的应用ID"; var clientSecret = "你的应用密钥"; // 创建Graph客户端 var clientCredential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(clientCredential, scopes); // 目标文件的标识(可通过Graph Explorer获取站点、库、文件ID) var siteId = "xxx"; var driveId = "xxx"; var fileId = "xxx"; // 下载文件流 var stream = await graphClient.Sites[siteId].Drives[driveId].Items[fileId].Content.Request().GetAsync();
- 解析Excel并映射为C#对象
// 定义业务实体类 public class Employee { public string Name { get; set; } public int Age { get; set; } public string Department { get; set; } } // 解析Excel内容 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 非商用场景,商用需购买授权 using (var package = new ExcelPackage(stream)) { var worksheet = package.Workbook.Worksheets.First(); var employees = new List<Employee>(); // 从第2行开始读取(假设第1行是表头) for (int row = 2; row <= worksheet.Dimension.End.Row; row++) { employees.Add(new Employee { Name = worksheet.Cells[row, 1].Text, Age = int.Parse(worksheet.Cells[row, 2].Text), Department = worksheet.Cells[row, 3].Text }); } // employees即为转换后的C#对象列表 }
方案2:使用SharePoint CSOM(适配经典SharePoint Online)
前置准备
- 安装NuGet包:
Microsoft.SharePointOnline.CSOM、EPPlus
代码实现
- 连接SharePoint并获取文件流
using Microsoft.SharePoint.Client; using OfficeOpenXml; using System.Security; var siteUrl = "你的SharePoint站点URL"; var username = "你的账号"; var password = "你的密码"; using (var context = new ClientContext(siteUrl)) { // 设置认证信息 var securePassword = new SecureString(); foreach (char c in password) securePassword.AppendChar(c); context.Credentials = new SharePointOnlineCredentials(username, securePassword); // 获取目标文件(示例:文档库名为"Documents",通过ID获取文件) var list = context.Web.Lists.GetByTitle("Documents"); var item = list.GetItemById(1); context.Load(item, i => i.File); await context.ExecuteQueryAsync(); // 下载文件流 var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, item.File.ServerRelativeUrl); var stream = fileInfo.Stream;
- 解析Excel并转换为C#对象(同方案1的解析逻辑)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(stream)) { var worksheet = package.Workbook.Worksheets.First(); var employees = new List<Employee>(); for (int row = 2; row <= worksheet.Dimension.End.Row; row++) { employees.Add(new Employee { Name = worksheet.Cells[row, 1].Text, Age = int.Parse(worksheet.Cells[row, 2].Text), Department = worksheet.Cells[row, 3].Text }); } } }
常见问题排查
- 权限异常:确认应用/账号拥有目标文件的读取权限,Graph API需检查Azure AD权限是否完成授权
- 路径错误:核实站点ID、库ID、文件ID或ServerRelativeUrl的正确性,可通过Graph Explorer或SharePoint后台获取
- 格式不兼容:EPPlus仅支持
.xlsx格式,若需处理.xls文件,可替换为NPOI库
内容的提问来源于stack exchange,提问作者Meeran S
相关产品推荐
相关产品推荐

