Reading Excel using OpenXML

Posted on Microsoft .NET Support Team See other posts from Microsoft .NET Support Team
Published on Wed, 08 May 2013 13:31:00 +0000 Indexed on 2013/06/24 16:32 UTC
Read the original article Hit count: 167

Filed under:


public DataTable ReadDataFromExcel()
       {
        string filePath = @"c:/temp/temp.xlsx";
           using (SpreadsheetDocument LobjDocument = SpreadsheetDocument.Open(filePath, false))
           {
           
               WorkbookPart LobjWorkbookPart = LobjDocument.WorkbookPart;
               Sheet LobjSheetToImport = LobjWorkbookPart.Workbook.Descendants<Sheet>().First<Sheet>();
               WorksheetPart LobjWorksheetPart = (WorksheetPart)(LobjWorkbookPart.GetPartById(LobjSheetToImport.Id));
               SheetData LobjSheetData = LobjWorksheetPart.Worksheet.Elements<SheetData>().First();

               //Read only the data rows and skip all the header rows.
               int LiRowIterator = 1;

               //  for progress bar
               int LiTotal = LobjSheetData.Elements<Row>().Count() - MobjImportMapper.HeaderRowIndex;
               // =================

               foreach (Row LobjRowItem in LobjSheetData.Elements<Row>().Skip(6))
               {

                   DataRow LdrDataRow = LdtExcelData.NewRow();
                   int LiColumnIndex = 0;
                   int LiHasData = 0;
                   LdrDataRow[LiColumnIndex] = LobjRowItem.RowIndex; //LiRowIterator;
                   LiColumnIndex++;


                   //TODO: handle restriction of column range.
                   foreach (Cell LobjCellItem in LobjRowItem.Elements<Cell>().Where(PobjCell
                       => ImportHelper.GetColumnIndexFromExcelColumnName(ImportHelper.GetColumnName(PobjCell.CellReference))
                       <= MobjImportMapper.LastColumnIndex))
                   {
                    
                       // Gets the column index of the cell with data
                       int LiCellColumnIndex = 10;
                       if (LiColumnIndex < LiCellColumnIndex)
                       {
                           do
                           {
                               LdrDataRow[LiColumnIndex] = string.Empty;
                               LiColumnIndex++;
                           }
                           while (LiColumnIndex < LiCellColumnIndex);
                       }

                       string LstrCellValue = LobjCellItem.InnerText;

                       if (LobjCellItem.DataType != null)
                       {
                           switch (LobjCellItem.DataType.Value)
                           {
                               case CellValues.SharedString:
                                   var LobjStringTable = LobjWorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                                   DocumentFormat.OpenXml.OpenXmlElement LXMLElment = null;
                                   string LstrXMLString = String.Empty;
                                   if (LobjStringTable != null)
                                   {
                                       LstrXMLString =
                                           LobjStringTable.SharedStringTable.ElementAt(int.Parse(LstrCellValue, CultureInfo.InvariantCulture)).InnerXml;

                                       if (LstrXMLString.IndexOf("<x:rPh", StringComparison.CurrentCulture) != -1)
                                       {
                                           LXMLElment = LobjStringTable.SharedStringTable.ElementAt(int.Parse(LstrCellValue, CultureInfo.InvariantCulture)).FirstChild;
                                           LstrCellValue = LXMLElment.InnerText;
                                       }
                                       else
                                       {
                                           LstrCellValue = LobjStringTable.SharedStringTable.ElementAt(int.Parse(LstrCellValue, CultureInfo.InvariantCulture)).InnerText;

                                       }
                                   }
                                   break;
                               default:
                                   break;
                           }
                       }
                       LdrDataRow[LiColumnIndex] = LstrCellValue.Trim();
                       if (!string.IsNullOrEmpty(LstrCellValue))
                           LiHasData++;
                      LiColumnIndex++;
                   }

                   if (LiHasData > 0)
                   {
                       LiRowIterator++;
                       LdtExcelData.Rows.Add(LdrDataRow);
                   }
               }
           }
          

           return LdtExcelData;
       }

© Microsoft .NET Support Team or respective owner