Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read excel by sheet name with OpenXML

I am new at OpenXML c# and I want to read rows from excel file. But I need to read excel sheet by name. this is my sample code that reads first sheet:

 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
                            }
                        }
                    }

But how can I find by sheet name and read cells.

like image 562
barteloma Avatar asked Apr 22 '18 12:04

barteloma


People also ask

What is OpenXml for Excel?

In the Open XML SDK, the SpreadsheetDocument class represents an Excel document package. To open and work with an Excel document, you create an instance of the SpreadsheetDocument class from the document.

What is DocumentFormat OpenXml?

The Open XML SDK provides tools for working with Office Word, Excel, and PowerPoint documents. It supports scenarios such as: - High-performance generation of word-processing documents, spreadsheets, and presentations. - Populating content in Word files from an XML data source.

Does OpenXml support XLS?

If the file name is not specified, then Excel for . NET infers the file format from the file name extension: files with an "XLSX" and "ZIP" extension are loaded and saved as OpenXml files, by default. Other files are loaded and saved as BIFF8, or . xls, format.


1 Answers

I've done it like in the code snippet below. It's basically Workbook->Spreadsheet->Sheet then getting the Name attribute of the sheet.

The basic underling xml looks like this:

<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>

The id value is what the Open XML package uses internally to identify each sheet and link it with the other XML parts. That's why the line of code that follows identifying the name uses GetPartById to pick up the 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;
}
like image 119
Cindy Meister Avatar answered Nov 14 '22 12:11

Cindy Meister