2010-12-02 4 views
0

У меня есть довольно большой и сложный файл Excel 2007 и ячейка с формулой, которая ссылается на ячейку на другом листе. Я пробовал так много вещей, чтобы попытаться получить значение (как в том, которое я вижу при загрузке в самом Excel), но в основном связано с попыткой получить дочерние объекты OpenXmlPart. Значение ячейки 40178, но в файле нет списка с таким количеством индексов. Формула в ячейке - это «« Контрольный лист ввода »! $ F $ 8». Я (возможно, глупо), полагая, что эту строку можно использовать непосредственно в OpenXML API для чтения значения из ячейки, на которую ссылается эта строка, но я не прав?Чтение значения формулы ячейки Excel 2007 с использованием C#

Если кто-то может сказать мне, как получить значение из правильной ячейки, исходя из формулы, я был бы очень доволен - я до сих пор основывал свою работу на коде, предоставленном страницей справки Microsoft (ужасной): http://msdn.microsoft.com/en-us/library/cc850837.aspx

Спасибо,

Мэтт.

ответ

0

Возможно, вы можете использовать этот код для чтения каждого значения ячейки. U может соответствующим образом изменить код, так как теперь этот код считывает значения из файла excel и возвращает список значений:

Сначала положите это: с помощью 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(); 
     } 
    }