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

OpenXML C#新手求助:如何按工作表名称读取Excel数据

按工作表名称读取Excel行数据(OpenXML C#)

嘿,很高兴你已经开始用OpenXML操作Excel啦!你当前的代码能读取第一个工作表,要实现按指定名称读取工作表的话,核心是先通过工作表名称找到对应的Sheet对象,再关联到对应的WorksheetPart,我来帮你调整代码并解释细节:

核心思路

Excel的Workbook里存储了所有工作表的元信息(就是Sheet元素),每个Sheet包含了工作表名称和对应的部件ID。我们需要:

  1. 遍历Workbook下的所有Sheet,找到名称匹配的那个
  2. 通过Sheet的ID获取对应的WorksheetPart
  3. 之后就可以像你原来的代码那样遍历行和单元格了

完整示例代码

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Linq;

// 替换成你的Excel文件路径
string path = @"C:\YourFile.xlsx";
// 替换成你要读取的工作表名称
string targetSheetName = "销售数据";

using (var spreadSheet = SpreadsheetDocument.Open(path, false)) // 只读模式设为false更安全
{
    WorkbookPart workbookPart = spreadSheet.WorkbookPart;
    Workbook workbook = workbookPart.Workbook;

    // 按名称查找目标工作表(忽略大小写,避免大小写不一致的问题)
    Sheet targetSheet = workbook.Descendants<Sheet>()
        .FirstOrDefault(s => s.Name.Equals(targetSheetName, StringComparison.OrdinalIgnoreCase));

    if (targetSheet == null)
    {
        Console.WriteLine($"找不到名为「{targetSheetName}」的工作表");
        return;
    }

    // 通过Sheet的ID获取对应的WorksheetPart
    WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(targetSheet.Id);
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    // 遍历每一行
    foreach (Row r in sheetData.Elements<Row>())
    {
        // 遍历当前行的每个单元格
        foreach (Cell c in r.Elements<Cell>())
        {
            // 获取单元格值(注意处理共享字符串的情况)
            string cellValue = c.CellValue?.Text;
            if (c.DataType != null && c.DataType.Value == CellValues.SharedString)
            {
                // 从共享字符串表中获取实际文本
                var sharedStringPart = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                if (sharedStringPart != null)
                {
                    cellValue = sharedStringPart.SharedStringTable.ElementAt(int.Parse(cellValue)).InnerText;
                }
            }

            // 这里可以根据需求处理单元格数据,比如打印或存入集合
            Console.Write($"{cellValue}\t");
        }
        Console.WriteLine(); // 换行,区分不同行
    }
}

几个关键注意点

  • 只读模式:如果只是读取数据,把SpreadsheetDocument.Open的第二个参数设为false(只读),避免意外修改文件
  • 大小写兼容:用StringComparison.OrdinalIgnoreCase做名称匹配,防止因为工作表名称大小写不一致导致找不到目标表
  • 共享字符串处理:OpenXML会把重复的文本存入共享字符串表,此时单元格的CellValue是索引值,需要从SharedStringTablePart中获取实际文本
  • 空值判断:一定要判断targetSheet是否为null,避免传入不存在的工作表名称时抛出空引用异常

内容的提问来源于stack exchange,提问作者barteloma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:02