使用C#读取Excel 2007单元格公式值

时间:2010-12-02 11:41:41

标签: c# excel-2007 formula

我有一个相当大而复杂的Excel 2007文件和一个带有公式的单元格,该公式引用了另一个工作表中的单元格。我已经尝试了很多东西来尝试获取值(就像我在Excel中加载时可以看到的那样)但主要与尝试获取OpenXmlPart的子对象有关。单元格的值是40178,但文件中没有包含那么多索引的列表。单元格中的公式是“'输入控制表'!$ F $ 8”。我(也许是愚蠢地)假设这个字符串可以直接在OpenXML API上使用来从该字符串引用的单元格中读取值,但我错了吗?

如果有人可以告诉我如何根据公式从正确的单元格中获取值,我会非常高兴 - 到目前为止,我的工作基于Microsoft(可怕的)帮助页面提供的代码:{ {3}}

谢谢,

1 个答案:

答案 0 :(得分:0)

您可以使用此代码读取每个单元格值。你可以相应地修改代码,现在这段代码正在读取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();
        }
    }