我怎样才能找回以前创build的Excel ListObject?

我使用VSTO在Excel中创build一个ListObject,如下所示:

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

(范围variables是以前定义的范围。)

如果我然后通过工作表控件集合,我可以find该ListObject。

但是,如果我保存工作簿并重新打开它,Controls集合是空的。 我怎么能得到这个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属性保存为空。 有没有简单的方法来获取原始数据源?

然后我想到了从范围内的信息重build数据源。 range.Activate()行selectExcel中的列表(所以我知道它是正确的)。 然而,我不能为了我的生活而弄清楚如何从这个范围中获取数据并获得范围的地址。 MSDN文档谈到了地址属性,但是这似乎并不存在。 (VSTO的MSDN文档似乎充满了rope))。

我对初始代码进行了以下更改。 您需要从工厂返回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 ,请务必阅读备注。

关于你的第一个问题,你用代码创build了listOject

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

要保存/重新打开工作簿后恢复对象,请尝试以下代码行:

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

你只是无法取回你在运行时创build的ListObject控件。 这是从MSDN文档 。

默认情况下,在工作表closures时,dynamic创build的列表对象不会作为主机控件持久保存在工作表中。

我可以找回我的ListObject的唯一方法是在devise时直接在我的模板的表单中创build它们。