繁体   English   中英

如何找回以前创建的Excel ListObject?

[英]How can I get back a previously created Excel ListObject?

我正在使用VSTO在Excel中创建ListObject,如下所示:

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

(范围变量是先前定义的范围。)

如果然后遍历工作表控件集合,则可以找到该ListObject。

但是,如果我保存工作簿并重新打开它,则控件集合为空。 重新打开后如何重新获得此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);
                Excel.Range range = lo.Range;
                range.Activate();
           }
        }

当我到达var lo =行时,我有一个ListObject添加到Controls集合中并且可以使用。 但是,它的DataSource属性为null。 是否有一种简单的方法来取回原始数据源?

然后,我考虑根据范围内的信息重建数据源。 range.Activate()行选择Excel中的列表(所以我知道它有正确的选择)。 但是,我无法终生解决如何使数据超出该范围并获取该范围的地址。 MSDN文档讨论了Address属性,但这似乎并不存在。 (有关VSTO的MSDN文档充其量似乎充其量)。

我对初始代码进行了以下更改。 您需要从工厂取回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();
           }
        }

你有没有尝试过? Microsoft.Office.Tools.Excel.ListObject lo = Microsoft.Office.Tools.Excel.ListObject.GetVstoObject(l)(它是C#,我不确定在VB中)

MSDN GetVstoObject中 ,请务必阅读这些说明。

关于第一个问题,您使用代码创建了listOject

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

要在保存/删除工作簿后恢复对象,请尝试以下代码:

ListObject lo = Globals.Factory.GetVstoObject(Worksheet.ListObjects["MyList"]);

您根本无法获取在运行时动态创建的ListObject控件。 这来自MSDN文档

默认情况下,关闭工作表时,动态创建的列表对象不会作为宿主控件保留在工作表中。

我可以获取ListObject的唯一方法是在设计时直接在模板的工作表中创建它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM