2010-09-20 2 views
1

J'ai besoin de lire une feuille XML Spread Sheet 2003 dans un projet et j'ai un problème avec les colonnes.Lire XML Spread Sheet 2003 par colonne en C#

Cet exemple montre que vous avez roi de modèle mes données sont:

 
Name Of | FirstName | SecondName | ... | ... 

Monday |  1  |  2  | 3 | 2 

Tuesday |  0  |  1  | 1 | ? 

Wednesday | 2  |  ?  | ? | ? 

J'ai besoin d'extraire toutes les données dans chaque colonne et le problème est ici: C# lire cette XML Étendre la ligne de la feuille par ligne seulement et avec cet exemple, je ne sais pas comment je peux avoir exactement toutes les données pour chaque colonne. De plus je ne peux pas savoir à l'avance les données.

est ici le début de mon code

var queryPeriodSheet = from worksheet in data.Descendants(ss + "Worksheet") 
           where worksheet.Attribute(ss + "Name").Value == "sheet1" 
           select worksheet; 

var rows = from row in queryPeriodSheet.Descendants(ss + "Row") 
select row; 

...

J'ai besoin de votre aide,

Merci

Répondre

1

Vous devez regarder l'attribut ss: Index dans chaque élément de cellule dans chaque ligne car il n'y a pas d'éléments XML pour les cellules vides.

J'utilise le code suivant pour rechercher du texte dans une cellule spécifique dans une rangée:

/// <summary> 
    /// 
    /// </summary> 
    /// <param name="rowElement"></param> 
    /// <param name="cellIndex">0-based cell index.</param> 
    /// <returns></returns> 
    public string GetCellData(XmlElement rowElement, int cellIndex) 
    { 
     XmlNodeList cellElements = rowElement.SelectNodes("ss:Cell", xmlnsManager); 
     if (cellElements != null) 
     { 
      int elementIndex = 0; 

      foreach (XmlElement cellElement in cellElements) 
      { 
       // Special case: cells can be skipped. If so, there is a ss:Index attribute that contains the 1-based index of the cell. 
       if (cellElement.HasAttribute("ss:Index")) 
       { 
        elementIndex = Convert.ToInt32(cellElement.GetAttribute("ss:Index")) - 1; 
       } 

       // If cell has been skipped. 
       if (cellIndex < elementIndex) 
        return null; 

       if (cellIndex == elementIndex) 
        return cellElement.InnerText.Trim(); 

       elementIndex++; 
      } 
     } 
     return null; 
    }