Настройка пользовательских данных в буфере обмена в надстройке .NET Excel - PullRequest
1 голос
/ 30 августа 2010

У меня есть надстройка для Excel, написанная на C #, которая имеет некоторый код обработки копирования / вставки.Когда пользователь копирует, я хочу поместить свой собственный объект класса TableData в буфер обмена и получить его обратно, когда пользователь вставит данные на лист.Звучит очень просто, и я нашел в Интернете дюжину статей, но по какой-то причине он не работает в моем коде.

Вот мой класс TableData:

[Serializable]
[Guid("794E06D9-7CE4-40dc-8187-BDC105A0F866")]
public class TableData
{
    public string Name;

    public TableData()
    { }
}

Я даже дал ему GUID дляубедитесь, что он загружает точно такой же класс, даже если он загружается из какой-либо другой сборки (если объект надстройки загружен дважды по какой-либо причине).

Это то, что я делаю, чтобы установить данные при копировании:

TableData data = new TableData();
data.Name = "test";
Clipboard.SetData("MyTable", data);

И при вставке:

TableData data = Clipboard.GetData("MyTable") as TableData;

ЗДЕСЬ >> данные равны нулю, но если я печатаю GetData («MyTable») в ближайшем окне, он показывает поток памяти, который я не смог преобразоватьв TableData, даже используя метод BinaryFormatter :: DeSerialize ()

Я мог бы сделать здесь какую-то глупую ошибку, но я не могу понять это.Кто-нибудь может указать на проблему здесь?

ОБНОВЛЕНО

Это дополнение COM, а не дополнение VSTO.Я установил макросы в методе OnKey, чтобы они вызывались, когда пользователь нажимает клавиши CTRL + C и CTRL + V на листе Excel.Существует отдельный модуль VBA, который обрабатывает эти запросы и направляет их в надстройку .NET.

Application.OnKey("^c", "OnCopy");

Таким образом, вызов переходит к VBA, а затем VBA перезванивает в мою надстройку .NET.Не уверен, что между вызовами участвует какой-то другой процесс.

Работает нормально, если я помещаю и получаю байт [] из буфера обмена, но не для своего пользовательского класса

Ответы [ 3 ]

1 голос
/ 30 августа 2010

Попался !!

Проблема заключалась в том, что код не смог найти того же типа во время вставки. Это потому, что надстройка была в месте, отличном от хост-приложения, то есть Excel. Я попытался сериализовать класс и затем поместить его в буфер обмена. Затем десериализация вернулась к исходному типу, но во время десериализации произошла ошибка, и было выдано «TargetInvocationException *», говорящее «Невозможно найти сборку [полное имя сборки надстройки] ». ..) не создавал никаких исключений, он просто молча обрабатывал его и возвращал NULL.

Решение состоит в том, чтобы обработать событие AppDomain.CurrentDomain.AssemblyResolve и вернуть текущую выполняющуюся сборку, когда приходит запрос на сборку надстройки.

0 голосов
/ 30 августа 2010

В этой статье перечислены некоторые шаги, которые могут помочь. Это включает в себя регистрацию формата буфера обмена, явное создание объекта DataObject и установку его данных в ваши данные TableData, а затем установку данных буфера обмена в DataObject. Это стоит попробовать, так как это всего несколько строк кода.

0 голосов
/ 30 августа 2010

Я создал простое дополнение VSTO с кнопкой «Копировать» и «Вставить» с точным кодом выше.Объект Table правильно доступен в окне вставки.

  1. Как вставка инициируется в вашем дополнении?Из события Excel или из действий пользователя в надстройке?
  2. Это надстройка VSTO, которая использует панель задач?Подробности, пожалуйста.
  3. Происходит ли вставка в другом экземпляре процесса Excel?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...