OpenXML C#新手求助:如何按工作表名称读取Excel数据
按工作表名称读取Excel行数据(OpenXML C#)
嘿,很高兴你已经开始用OpenXML操作Excel啦!你当前的代码能读取第一个工作表,要实现按指定名称读取工作表的话,核心是先通过工作表名称找到对应的Sheet对象,再关联到对应的WorksheetPart,我来帮你调整代码并解释细节:
核心思路
Excel的Workbook里存储了所有工作表的元信息(就是Sheet元素),每个Sheet包含了工作表名称和对应的部件ID。我们需要:
- 遍历
Workbook下的所有Sheet,找到名称匹配的那个 - 通过
Sheet的ID获取对应的WorksheetPart - 之后就可以像你原来的代码那样遍历行和单元格了
完整示例代码
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
相关产品推荐
相关产品推荐

