Эффективный способ получить имя ячейки с помощью API взаимодействия с Excel

У меня есть некоторая операция, которая требует перебора 3000 ячеек excel. Проблема в том, что этот мой код кажется довольно плохим для производительности. Я провел небольшое исследование с классом «Секундомер», чтобы понять, где я теряю время. Моя операция длится 24 секунды, а всего одна строчка кода там занимает 17 секунд. Я использую этот код, это имя ячейки возврата моего класса из ссылки на ячейку.

public string GetCellName(Range cell)
        {
            string name = "";
            try
            {
                name = cell.Name.Name;
            }
            catch { }
            return name;
        }

Мне кажется очень странным, что этот простой код занимает так много времени. Есть некоторые другие части, которые должны занимать больше времени, например небольшой цикл for с 6-8 элементами. Я попытался написать этот метод следующим образом:

public string GetCellName(Range cell)
        {
            if (cell.Name == null) return "";
            else if (cell.Name.Name == null) return "";
            else return cell.Name.Name;
        }

Но чем он выдает исключение. Есть ли у вас какие-либо предложения о том, как эффективно получить имя ячейки Excel?


person Vajda    schedule 26.01.2012    source источник


Ответы (2)


Я обнаружил, что наиболее эффективным способом является минимизация связи между COM и .NET API. Способ сделать это - использовать

range.get_Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet); 

который возвращает формат XML со всей информацией. Также возможно использование

Range.set_Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet, myStr);

для заполнения диапазона некоторыми значениями.

Таким образом, у вас будет только один вызов COM для получения всех значений, независимо от того, насколько велик ваш диапазон, вместо того, чтобы вызывать его один или несколько раз для каждой ячейки в диапазоне. Таким образом, вы также можете форматировать стили для определенных ячеек/частей диапазона, задавать имя для ячеек/частей диапазона и все остальное.

person Vajda    schedule 02.02.2012

Создайте расширение для объекта типа, поместите его в другое пространство-имя, когда вам понадобится этот метод. Использование MySpaceName.Extensions;

Вот метод:

     public static string ToSafeString(this object value)
    {
        if (value == null)
        {
            return "";
        }
        else
        {
            return value.ToString(); ;
        }
    }

И затем ваша ячейка.ToSafeString()

person Khaldoun    schedule 26.01.2012