2010-12-02 36 views
0

J'ai un fichier Excel 2007 assez volumineux et complexe et une cellule dont la formule fait référence à une cellule dans une autre feuille de calcul. J'ai essayé tant de choses pour essayer d'obtenir la valeur (comme dans celui que je peux voir quand il est chargé dans Excel lui-même) mais surtout pour essayer d'obtenir des objets enfants d'OpenXmlPart. La valeur de la cellule est 40178, mais il n'y a pas de liste dans le fichier avec autant d'index. La formule dans la cellule est "'Input Control Sheet'! $ F $ 8". Je suis (peut-être stupidement) en supposant que cette chaîne peut être utilisée directement sur l'API OpenXML pour lire la valeur de la cellule référencée par cette chaîne, mais ai-je tort?Lecture d'une valeur de formule de cellule Excel 2007 à l'aide de C#

Si quelqu'un pouvait me dire comment obtenir la valeur de la cellule correcte basée sur la formule, je serais très heureux - J'ai basé mon travail jusqu'à présent sur le code fourni par Microsoft (terrible) page d'aide: http://msdn.microsoft.com/en-us/library/cc850837.aspx

Merci,

Matt.

Répondre

0

Vous pouvez probablement utiliser ce code pour lire chaque valeur de cellule. U peut modifier le code en conséquence, pour l'instant ce code est en train de lire les valeurs du fichier Excel et retourner la liste des valeurs lues:

d'abord mis ceci: avec Excel = Microsoft.Office.Interop.Excel;

private List<string> GetKeywordsList(string xlsFilePath) 
    { 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     Excel.Range range; 
     string str; 
     int rCnt = 0; 
     int cCnt = 0; 

     List<string> keywords = new List<string>(); 
     xlApp = new Excel.ApplicationClass(); 
     xlWorkBook = xlApp.Workbooks.Open(xlsFilePath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     range = xlWorkSheet.UsedRange; 
     for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++) 
     { 
      for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++) 
      { 

       if (!(((range.Cells[rCnt, cCnt] as Excel.Range).Value2) == null)) 
       { 
        if ((range.Cells[rCnt, cCnt] as Excel.Range).Value2.GetType().ToString() == "System.Double") 
        { 
         double d1 = (Double)(range.Cells[rCnt, cCnt] as Excel.Range).Value2; 
         str = Convert.ToString(d1); 
         keywords.Add(str); 
        } 
        else 
        { 
         str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2; 
         keywords.Add(str); 
        } 
       } 
      } 

     } 

     xlWorkBook.Close(true, null, null); 
     xlApp.Quit(); 

     ReleaseObject(xlWorkSheet); 
     ReleaseObject(xlWorkBook); 
     ReleaseObject(xlApp); 
     return keywords; 

    } 

private void ReleaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    }