Эффективный способ получения имени ячейки с помощью Excel Interop API - PullRequest
0 голосов
/ 26 января 2012

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

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

Мне кажется странным, что этот простой код отнимает столько времени. Есть некоторые другие части, которые должны занять больше времени, например, мало для цикла с 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?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

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

range.get_Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet); 

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

Range.set_Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet, myStr);

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

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

0 голосов
/ 26 января 2012

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

Вот метод:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...