Как я могу вернуть ранее созданный Excel ListObject? - PullRequest
0 голосов
/ 23 февраля 2010

Я создаю ListObject в Excel, используя VSTO следующим образом:

ListObject lo = ws_vsto.Controls.AddListObject(range, "MyList");

(Переменная диапазона - это ранее определенный диапазон.)

Если я затем перебираю коллекцию Controls рабочего листа, я могу найти этот ListObject.

Однако, если я сохраню книгу и снова открою ее, коллекция Controls будет пустой. Как я могу вернуть этот ListObject после повторного открытия, чтобы продолжить работу с ним?

EDIT

У меня есть немного дальше:

        var wb = Globals.ThisAddIn.Application.ActiveWorkbook;
        var wb_vsto = wb.GetVstoObject();


        foreach (Excel.Worksheet ws in wb.Worksheets)
        {
            var wsv = ws.GetVstoObject();
            foreach (Excel.ListObject l in ws.ListObjects)
            {
                MessageBox.Show(l.Name);
                var lo = wsv.Controls.AddListObject(l);
                Excel.Range range = lo.Range;
                range.Activate();
           }
        }

Когда я попадаю на строку var lo =, у меня есть ListObject, добавленный в коллекцию Controls и доступный для использования. Однако это свойство DataSource содержит значение null. Есть ли простой способ вернуть исходный источник данных?

Затем я подумал о восстановлении источника данных на основе информации в диапазоне. Строка range.Activate () выбирает список в Excel (так что я знаю, что это правильно). Однако я не могу на всю жизнь понять, как вывести данные из этого диапазона и получить адрес диапазона. В документации MSDN говорится о свойстве Address, но, похоже, оно не существует. (Документация MSDN для VSTO в лучшем случае кажется странной).

Ответы [ 4 ]

4 голосов
/ 05 декабря 2012

Я внес следующие изменения в исходный код. Вам нужно вернуть VSTO Listobject с завода.

        var wb = Globals.ThisAddIn.Application.ActiveWorkbook;
        var wb_vsto = wb.GetVstoObject();


        foreach (Excel.Worksheet ws in wb.Worksheets)
        {
            var wsv = ws.GetVstoObject();
            foreach (Excel.ListObject l in ws.ListObjects)
            {
                MessageBox.Show(l.Name);
                //var lo = wsv.Controls.AddListObject(l);
                Microsoft.Office.Tools.Excel.ListObject lo = 
                          Globals.Factory.GetVstoObject(l);
                // I can now get at the datasource if neede
                var ds = lo.DataSource;
                // In my case the datasource was DataTable.
                DataTable t = (DataTable)d;

                if (t.Rows.Count > 0)
                {
                    foreach (DataRow r in t.Rows)
                    {
                    // Access row data.
                    }
                }
                //Excel.Range range = lo.Range;
                //range.Activate();
           }
        }
1 голос
/ 01 сентября 2010

о вашем первом вопросе, Вы создали список объектов с кодом

ListObject lo = ws_vsto.Controls.AddListObject(range, "MyList");

Чтобы восстановить объект после сохранения / повторного ввода книги, попробуйте следующую строку кода:

ListObject lo = Globals.Factory.GetVstoObject(Worksheet.ListObjects["MyList"]);
1 голос
/ 29 апреля 2010

Вы пробовали? Microsoft.Office.Tools.Excel.ListObject lo = Microsoft.Office.Tools.Excel.ListObject.GetVstoObject (l) (это C # Я не уверен в VB)

С MSDN GetVstoObject , обязательно прочитайте замечания.

0 голосов
/ 15 ноября 2011

Вы просто не можете вернуть элемент управления ListObject, который вы создали динмически во время выполнения. это из документации MSDN .

По умолчанию динамически создаваемые объекты списка не сохраняются в лист в качестве основного элемента управления, когда лист закрыт.

Единственный способ вернуть мой ListObject - это создать их непосредственно на листах моего шаблона во время разработки.

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