我可以将Microsoft.Office.Interop.Excel.Chart对象转换为Microsoft.Office.Tools.Excel.Chart对象吗?

时间:2010-08-05 14:09:56

标签: vb.net excel interop vsto charts

基本上我在VB.NET 2010中编写了一个Excel 2007项目,允许您创建具有相当大交互性的图表。我希望用户能够保存并重新打开此工作簿,并且在任何已创建的图表中仍然具有该交互性,因此他们不必重新创建它们。

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

有更好的方法吗?我应该从一开始就使用Interop图表吗?

2 个答案:

答案 0 :(得分:1)

根据MSDN article,您可以使用HasVstoObject和GetVstoObject方法转换native object into a host control.但是文档没有特别提及图表对象。

答案 1 :(得分: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