2010-12-02 112 views
0

我有一個相當大且複雜的Excel 2007文件和一個公式引用另一個工作表中的單元格的單元格。我嘗試了很多事情來嘗試獲取值(如在Excel中加載時看到的那樣),但主要與嘗試獲取OpenXmlPart的子對象有關。單元格的值是40178,但文件中沒有包含那麼多索引的列表。單元格中的公式是「'輸入控制表'!$ F $ 8」。我(可能是愚蠢的)認爲這個字符串可以直接用在OpenXML API上來讀取該字符串引用的單元格的值,但是我錯了嗎?使用C讀取Excel 2007單元格公式值

如果有人能告訴我如何根據公式從正確的單元格中獲取價值,我會非常高興 - 我一直以來對微軟(糟糕的)幫助頁面提供的代碼做了很多工作: 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(); 
     } 
    } 
相關問題