如何在C# ASP.Net MVC中用Open XML SDK按名称获取Excel工作表?
按名称获取Open XML SDK中的工作表
我太懂这种切换库的不适感了——EPPlus那个按名称取工作表的索引器用得有多顺手,换成Open XML SDK找不到对应方法时就有多挠头,更别说还是因为EPPlus处理宏表的bug不得不换,简直雪上加霜。不过别担心,Open XML里其实也能实现类似的功能,只是需要绕一小步,毕竟它的结构和EPPlus的封装思路不太一样。
核心思路:Sheet元素与Worksheet的关联
Open XML的文档结构里,Sheet对象只是工作表的元数据引用(存了名称、ID这些信息),而实际的工作表内容(比如单元格、格式)都存在WorksheetPart里。所以要按名称获取工作表,得先找到对应的Sheet,再通过它的ID去关联到实际的Worksheet。
代码实现示例
基础版:直接查找
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.Linq; // 打开文档 using (SpreadsheetDocument doc = SpreadsheetDocument.Open("你的文件路径.xlsx", isEditable: false)) { WorkbookPart workbookPart = doc.WorkbookPart; Workbook workbook = workbookPart.Workbook; // 按名称查找Sheet元素 Sheet targetSheet = workbook.Sheets .Elements<Sheet>() .FirstOrDefault(sheet => sheet.Name == "你要找的工作表名称"); if (targetSheet != null) { // 通过Sheet的Id获取对应的WorksheetPart WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(targetSheet.Id); Worksheet worksheet = worksheetPart.Worksheet; // 接下来就可以操作这个worksheet了,比如读取单元格内容 } else { // 处理找不到工作表的情况 } }
进阶版:封装成扩展方法(接近EPPlus的使用体验)
如果想像EPPlus那样用起来更简洁,可以封装一个扩展方法,以后直接调用就行:
public static class OpenXmlWorkbookExtensions { public static Worksheet GetWorksheetByName(this Workbook workbook, string sheetName) { if (workbook == null) throw new ArgumentNullException(nameof(workbook)); if (string.IsNullOrWhiteSpace(sheetName)) throw new ArgumentException("工作表名称不能为空", nameof(sheetName)); Sheet targetSheet = workbook.Sheets .Elements<Sheet>() .FirstOrDefault(s => s.Name.Equals(sheetName, StringComparison.OrdinalIgnoreCase)); if (targetSheet == null) return null; WorkbookPart workbookPart = workbook.WorkbookPart; WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(targetSheet.Id); return worksheetPart.Worksheet; } }
用的时候就和EPPlus差不多了:
using (SpreadsheetDocument doc = SpreadsheetDocument.Open("你的文件路径.xlsx", isEditable: false)) { Workbook workbook = doc.WorkbookPart.Workbook; Worksheet worksheet = workbook.GetWorksheetByName("Sheet1"); if (worksheet != null) { // 开始你的操作 } }
小提示
- 注意大小写:如果你的工作表名称可能有大小写差异,可以用
StringComparison.OrdinalIgnoreCase来忽略大小写匹配,避免因为大小写问题找不到工作表。 - 宏表的处理:既然你是因为宏表bug切换到Open XML,记得Open XML处理启用宏的文件时,要打开
SpreadsheetDocument的OpenSettings,设置AutoSave和处理宏相关的部分,不过这部分和按名称取工作表关联不大,就不多展开了。
内容的提问来源于stack exchange,提问作者user6373040
相关产品推荐
相关产品推荐

