You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:28:43