2010-08-05 219 views
1

基本上我已经在VB.NET 2010中编写了一个Excel 2007项目,它允许您创建具有相当数量交互性的图表。我希望用户能够保存并重新打开此工作簿,并且在任何已创建的图表中仍然具有该交互功能,因此他们不必重新创建它们。我可以将Microsoft.Office.Interop.Excel.Chart对象转换为Microsoft.Office.Tools.Excel.Chart对象吗?

当我创建图表时,我使用Sheet1.Controls.AddChart(...),它返回一个Microsoft.Office.Tools.Excel.Chart,我可以使用它处理事件等。但是,当我重新打开该文件并查看Sheet1.Controls集合时,没有Chart对象。当我需要工具图表时,通过Sheet1.ChartObjects.Chart访问图表会给我Interop图表。

有没有更好的方法来做到这一点?我应该从一开始就使用Interop图表吗?

回答

1

根据MSDN article,您可以使用HasVstoObject和GetVstoObject方法来转换native object into a host control.虽然文档没有具体提及图表对象。

+0

根据http://msdn.microsoft.com/en-us/library/cc442765.aspx: 要重新创建Microsoft.Office.Tools.Excel .Chart主机控件,您必须先删除本机Microsoft.Office.Interop.Excel.Chart,然后使用AddChart(范围,字符串)或AddChart(双精度)重新创建Microsoft.Office.Tools.Excel.Chart。 Double,Double,Double,String)方法。没有添加方法,使您可以基于现有的Microsoft.Office.Interop.Excel.Chart创建新的Microsoft.Office.Tools.Excel.Chart。 所以看起来他们必须在_Startup上完全重新创建。 – Paul 2010-08-05 23:15:34

1

保罗,如果我没有解决您的问题,我会提前道歉。直到现在,我还没有意识到有两种类型的图表,我有兴趣了解与他们的问题。无论如何,经过一番混战之后,我能够创建一个图表,命名它,让它持续下去,并对事件做出反应。它不依赖于互操作的图表,但:

Public Class ThisWorkbook 
    Dim clsChart As cChart 

    Private Sub ThisWorkbook_Startup() Handles Me.Startup 
     Dim coChartObj As Microsoft.Office.Interop.Excel.ChartObject 
     Dim chtMyChart As Microsoft.Office.Interop.Excel.Chart 
     Dim i As Int32 

     With Globals.Sheet1 
      For i = 1 To .ChartObjects.count 
       If .ChartObjects(i).Name = "MyChart" Then 
        chtMyChart = .ChartObjects(i).chart 
        Exit For 
       End If 
      Next i 
      If chtMyChart Is Nothing Then 
       chtMyChart = .Shapes.AddChart.Chart 
       chtMyChart.SetSourceData(.Range("A1:B2")) 
       coChartObj = chtMyChart.Parent 
       coChartObj.Name = "MyChart" 
      End If 
      clsChart = New cChart 
      clsChart.chtChart = chtMyChart 
     End With 
    End Sub 
End Class 

Public Class cChart 
    Public WithEvents chtChart As Microsoft.Office.Interop.Excel.Chart 

    Private Sub chtChart_Resize() Handles chtChart.Resize 
     MessageBox.Show("resize") 
    End Sub 
End Class 
+0

Hi Doug, 你能在你的代码中处理这些图表的事件吗?根据我的经验,我必须使用Microsoft.Office.Tools.Excel.Chart并将其声明为WithEvents,以使其事件正确触发并由我的代码处理。请让我知道(并演示)您是否能够仅通过Interop品种完成此操作。谢谢! – Paul 2010-08-06 13:33:35

+0

Paul,我是一个带有一点.Net的VBA程序员,所以这几乎是我在VBA中做的事情: 我做了一个名为cChart的类(现在显示在我的代码末尾)。它包含一个WithEvents图表,如您所述。我包含一个Resize事件来演示。 然后在我的ThisWorkbook代码我声明clsChart如cChart在顶部和分配新的或先前创建的图表到WITHEVENTS图表中的2行附近的端: clsChart =新cChart clsChart.chtChart = chtMyChart 最好方式来测试这是发布它,打开工作簿,进行更改,保存,重新打开等。 – 2010-08-06 15:43:46

+0

嗨道格,这听起来很合理。我首先使用Tools图表的原因之一是由Sheet1.Controls.AddChart(...)返回的对象类型。我喜欢使用该函数,因为它允许我在参数中设置图表的名称。我会看看我能否找到在Interop版本中工作的方法。我觉得我遇到了一些问题,需要Interop版本才能正确解决问题,但是我刚才尝试这个时候,所以当我有机会的时候我会再试一次。谢谢! – Paul 2010-08-07 03:07:06