sonny3g Ответов: 2

Как я могу прочитать значение формулы в ячейке вместо формулы с C#?


Я могу прочитать целевую ячейку, но ячейка использует формулу для вычисления значения. То, что нужно, - это вычисленное значение, а не формула. Как это сделать с помощью C# и OpenXml?

Спасибо.

re is more of the code.  

        public void ReadMyData()//double idx) // idx = xmHt + bf + heavy duty
        {

            string fileName = @"c:\cax\resource\bpsys\programs\dose_data.xlsx";
            string sheetName = "RFML_DATA";
            string addressName = "A1";
            double idx = 77.50;
            int count = 1;
            string key = "";
            string myData = idx.ToString();
            try
            {
                do
                {
                    addressName = "A" + count.ToString();
                    key = GetCellValue(fileName, sheetName, addressName);
                    count++;
                }
                while (key != myData);
            }
            catch (ArgumentException e)
            {
                MessageBox.Show(e.Message);
            }
        }

        // GetCellValue code:
        // Adapted from "How to: retrieve the values of cells in a spreadsheet document (open xml sdk)"
        // 
        // Retrieve the value of a cell, given a file name, sheet name, and address name.
        public static string GetCellValue(string fileName, string sheetName, string addressName)
        {
            string value = null;

            // Open the spreadsheet document for read-only access.
            using (DOpkg.SpreadsheetDocument document = DOpkg.SpreadsheetDocument.Open(fileName, false))
            {
                // Retrieve a reference to the workbook part.
                DOpkg.WorkbookPart wbPart = document.WorkbookPart;

                // Find the sheet with the supplied name, and then use that 
                // Sheet object to retrieve a reference to the first worksheet.
                DOxls.Sheet theSheet = wbPart.Workbook.Descendants<doxls.sheet>().Where(s => s.Name == sheetName).FirstOrDefault();

                // Throw an exception if there is no sheet.
                if (theSheet == null)
                {
                    throw new ArgumentException("sheetName");
                }

                // Retrieve a reference to the worksheet part.
                DOpkg.WorksheetPart wsPart = (DOpkg.WorksheetPart)(wbPart.GetPartById(theSheet.Id));

                // Use its Worksheet property to get a reference to the cell 
                // whose address matches the address you supplied.
                DOxls.Cell theCell = wsPart.Worksheet.Descendants<doxls.cell>().Where(c => c.CellReference == addressName).FirstOrDefault();

                // If the cell does not exist, return an empty string.
                if (theCell != null)
                {
                    value = theCell.InnerText;

                    // If the cell represents an integer number, you are done.  For dates, this code returns the serialized value that 
                    // represents the date. The code handles strings and Booleans individually. For shared strings, the code 
                    // looks up the corresponding value in the shared string table. For Booleans, the code converts the value into 
                    // the words TRUE or FALSE.
                    if (theCell.DataType != null)
                    {
                        switch (theCell.DataType.Value)
                        {
                            case DOxls.CellValues.SharedString:

                                // For shared strings, look up the value in the shared strings table.
                                var stringTable = wbPart.GetPartsOfType<dopkg.sharedstringtablepart>().FirstOrDefault();

                                // If the shared string table is missing, something is wrong. Return the index that is in
                                // the cell. Otherwise, look up the correct text in the table.
                                if (stringTable != null)
                                {
                                    value = stringTable.Share


Что я уже пробовал:

стоимость = перевод.SharedStringTable.ElementAt(int.Parse(value)).Через свойство innerText;

Patrice T

Попробуйте дать контекст (например, попробуйте прочитать значение ячейки в Excel.
Попробуйте привести пример.
попробуйте показать свой код и объяснить проблему.

sonny3g

Спасибо, новичок на этом форуме и еще не знаю всех входов-выходов. Что же касается вопроса, то его решение настолько просто, что мне становится неловко. Мне нужно было использовать " result = thecurrentcell.CellValue.InnerText;" вместо "result = thecurrentcell.Внутренний текст;". Теперь я получаю значение вместо формулы.

Patrice T

Приятно видеть, что она решена.
Если решение 1 Было полезным, примите его, в противном случае добавьте свое собственное решение и примите его.
Принятие решения говорит eceryone, что вопрос решен;

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

2 Ответов

Рейтинг:
1

sonny3g

Мне нужно было использовать " result = thecurrentcell.CellValue.InnerText;" вместо "result = thecurrentcell.Внутренний текст;". Теперь я получаю значение вместо формулы.