【问题标题】:Read excel by sheet name with OpenXML使用 OpenXML 按工作表名称读取 excel
【发布时间】:2018-04-22 12:25:03
【问题描述】:

我是 OpenXML c# 的新手,我想从 excel 文件中读取行。但我需要按名称阅读 excel 表。这是我读取第一张纸的示例代码:

 using (var spreadSheet = SpreadsheetDocument.Open(path, true))
                {
                    WorkbookPart workbookPart = spreadSheet.WorkbookPart;
                    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

                    foreach (Row r in sheetData.Elements<Row>())
                    {
                        foreach (Cell c in r.Elements<Cell>())
                        {
                            if (c.DataType != null && c.DataType == CellValues.SharedString)
                            {
                               // reading cells
                            }
                        }
                    }

但是如何通过工作表名称找到并读取单元格。

【问题讨论】:

    标签: c# excel openxml openxml-sdk


    【解决方案1】:

    我已经按照下面的代码 sn-p 完成了它。它基本上是 Workbook->Spreadsheet->Sheet 然后获取工作表的 Name 属性。

    基本的底层 xml 如下所示:

    <x:workbook>
     <x:sheets>
        <x:sheet name="Sheet1" sheetId="1" r:id="rId1" />
        <x:sheet name="TEST sheet Name" sheetId="2" r:id="rId2" />
      </x:sheets>
    </x:workbook>
    

    id 值是 Open XML 包在内部用于识别每个工作表并将其与其他 XML 部分链接的值。这就是为什么识别名称之后的代码行使用GetPartById 来获取WorksheetPart

    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(path, false))
    {
        WorkbookPart bkPart = doc.WorkbookPart;
        DocumentFormat.OpenXml.Spreadsheet.Workbook workbook = bkPart.Workbook;
        DocumentFormat.OpenXml.Spreadsheet.Sheet s = workbook.Descendants<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Where(sht => sht.Name == "Sheet1").FirstOrDefault();
        WorksheetPart wsPart = (WorksheetPart)bkPart.GetPartById(s.Id);
        DocumentFormat.OpenXml.Spreadsheet.SheetData sheetdata = wsPart.Worksheet.Elements<DocumentFormat.OpenXml.Spreadsheet.SheetData>().FirstOrDefault();
    
        foreach (DocumentFormat.OpenXml.Spreadsheet.Row r in sheetdata.Elements<DocumentFormat.OpenXml.Spreadsheet.Row>())
        {
            DocumentFormat.OpenXml.Spreadsheet.Cell c = r.Elements<DocumentFormat.OpenXml.Spreadsheet.Cell>().First();
            txt += c.CellValue.Text + Environment.NewLine;
        }
        this.txtMessages.Text += txt;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多