C # Excel VSTO - можно ли переместить сводную таблицу?

Я пытаюсь переместить сводную таблицу в VSTO, и у меня ничего не получается. Моя логика заключалась в том, чтобы найти диапазон сводной таблицы, вырезать его и вставить в новый диапазон, где я уверен, что на листе нет данных.

    public static void MovePivotTable(string sheetName, PivotTable pivotTable, int newX, int newY, int width, int height)
    {
        try
        {
            Worksheet worksheet = GetOrCreateWorksheet(sheetName);

            Range topLeft = (Range)worksheet.Cells[newX, newY];
            Range bottomRight = (Range)worksheet.Cells[newX + width, newY + height];
            Range newRange = worksheet.get_Range(topLeft, bottomRight);

            pivotTable.TableRange1.Cut(Missing.Value);

            newRange.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone,
                Missing.Value, Missing.Value);

            return;
        }
        catch (Exception)
        {
        }
        finally
        {
        }
    }

Однако я всегда получаю исключение. Либо: - Сбой PasteSpecial. - Что-то вроде того, что невозможно изменить сводную таблицу.

Кто-нибудь когда-нибудь делал это? Могут ли они подтвердить, что это действительно возможно или нет? Любой пример кода?

Большое спасибо, Шон


person sean.net    schedule 19.12.2011    source источник
comment
какую библиотеку вы используете для управления листом excel?   -  person Emmanuel N    schedule 19.12.2011


Ответы (1)


Две вещи:

TableRange1 не включает заголовок сводной таблицы, поэтому вы получаете сообщение об ошибке «Невозможно изменить». Используйте TableRange2, чтобы выбрать всю сводную таблицу.

Кроме того, вы не можете использовать PasteSpecial для Cut, поэтому просто используйте аргумент Destination метода Cut. Вот как это будет выглядеть в VB:

pivotTable.TableRange2.Cut Destination:=NewRange
person Doug Glancy    schedule 19.12.2011
comment
Привет, спасибо за ответ. К сожалению, он все еще вылетает с той же ошибкой. Пробовал делать range.cut(destination), range.copy(отсутствует) + range.delete(отсутствует) + worksheet.paste(newRange) и все равно не повезло. - person sean.net; 20.12.2011
comment
Вы этого не говорите, но я предполагаю, что вы также пробовали TableRange2. Я бы попробовал это с простым диапазоном, например Activesheet.Range(A1). Кроме того, вы указали две ошибки в исходном вопросе. Пожалуйста, будьте более конкретными. - person Doug Glancy; 20.12.2011
comment
Я испробовал широкий спектр решений этой проблемы и на протяжении всего тестирования наткнулся на невозможность изменить сводную таблицу. это случилось однажды, и я не совсем помню, как воспроизвести его, но я помню, что сообщение было примерно таким. вторая ошибка - сбой метода вырезания объекта. Опять же, я почти уверен, что это сообщение об ошибке (оно появляется на французском языке, так что я считаю, что это правильный перевод с английского сообщения). Наконец, я безуспешно попробовал TableRange2. Я попробую с простым диапазоном, как вы предлагаете - person sean.net; 21.12.2011