Чтение значения формулы ячейки Excel 2007 с использованием C # - PullRequest
0 голосов
/ 02 декабря 2010

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

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

Спасибо,

мат.

1 Ответ

0 голосов
/ 02 декабря 2010

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

Сначала укажите это: using 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();
        }
    }
...