zoukankan      html  css  js  c++  java
  • VSTO

    此示例显示如何创建Excel的加载项,使用户可以在其工作表中选择库存符号,然后生成一个新工作表,显示库存的历史性能。 工作表包含数据表和图表。

    介绍
    Excel加载项通常不知道工作表包含什么。典型的加载项解决方案使用户在自定义UI或工作表单元格中选择的信息来为Excel中未内置的用户执行某种服务。

    此示例中的加载项为通过使用工作表计划退休的人员提供服务。该加载项假设用户将在其工作表中的某处存在股票或共同基金符号列表。用户选择一个符号,然后从自定义任务窗格中生成一个包含历史股价表的新工作表,以及一段时间内显示股票表现的图表。

    以下是您学到的几件事情:

    1.如何创建与工作表交互的自定义​​任务窗格。
    2.如何从服务获取数据并在解决方案中使用该数据。
    3.如何生成新的工作表,列表对象(表)以及从服务中显示数据的图表
    4.如何使用户可以使用控件自定义任务窗格来更改列表对象和图表的外观和内容。
    5.当用户在自定义任务窗格中选择控件时,如何删除列表对象,图表和工作表。
     

    要求
    要运行此示例,您将需要Visual Studio 2013和Excel 2013或Excel 2010.有关您通常需要开发Office解决方案的更多信息,请参阅配置计算机来开发Office解决方案。

    创建实例

    生成表格,表格和数据图表:

    1.按F5。
    2.在Excel中,创建一个新的工作表。
    3.工作表侧面显示一个自定义任务窗格。
    4.在单元格中输入诸如“MSFT”之类的股票代码。
    5.在工作表中选择另一个空白单元格,然后选择包含刚刚添加的符号的单元格。
    6.在任务窗格中,选择开始日期,然后选择显示所选符号的价格历史记录复选框

        一张新工作表打开,一张历史价格表与图表一起出现。

    要通过使用任务窗格中的控件修改表和图表的内容和外观:

    1.在任务窗格中,选择表格中的任何一个标题(例如:high或close),以便在表格中显示和隐藏该列。
    2.通过选择任何无线电彩色单选按钮更改表格的颜色主题。
    3.通过使用任务窗格底部附近的任何组合框,更改图表显示的数据列,图表的样式或图表的颜色。
    删除表格、图表和工作表

    清除所选符号的显示价格历史记录复选框以删除工作表及其上的控件

    更多信息
    有关Visual Studio Tools for Office(VSTO)的更多信息:http://msdn.microsoft.com/en-us/vsto/default.aspx。

    工程文件结构:

    创建窗体界面(TableAndChartPane.vb)

    代码(TableAndChartPane.vb):

      1 Imports System.Net
      2 
      3 Public Class TableAndChartPane
      4     Public Sub New()
      5         InitializeComponent()
      6         PopulateListObjectHeaderCheckBoxList()
      7 
      8         'Populate the chart data source combo box.
      9         chartDataSourceComboBox.Items.Add("Open")
     10         chartDataSourceComboBox.Items.Add("High")
     11         chartDataSourceComboBox.Items.Add("Low")
     12         chartDataSourceComboBox.Items.Add("Close")
     13         chartDataSourceComboBox.Items.Add("Volume")
     14         chartDataSourceComboBox.Items.Add("Adj_Close")
     15 
     16         'Populate the chart style combo box.
     17         ChartStyleComboBox.Items.Add("line")
     18         ChartStyleComboBox.Items.Add("Column")
     19         ChartStyleComboBox.Items.Add("Area")
     20 
     21         'Populate the chart style combo box.
     22         ChartColorThemeComboBox.Items.Add("Gray background")
     23         ChartColorThemeComboBox.Items.Add("Blue background")
     24         ChartColorThemeComboBox.Items.Add("White background")
     25 
     26     End Sub
     27 
     28     Dim _vstoWorkSheet As Microsoft.Office.Tools.Excel.Worksheet
     29     Dim _worksheetInteropObject As Excel.Worksheet
     30     Dim _listObject As Microsoft.Office.Tools.Excel.ListObject = Nothing
     31     Dim _chart As Microsoft.Office.Tools.Excel.Chart = Nothing
     32 
     33 
     34     Public ReadOnly Property VstoWorksheet() As Microsoft.Office.Tools.Excel.Worksheet
     35         Get
     36             If _vstoWorkSheet Is Nothing Then
     37                 If _worksheetInteropObject Is Nothing Then
     38                     _vstoWorkSheet = Globals.Factory.GetVstoObject(DirectCast(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), Excel.Worksheet))
     39                 Else
     40                     _vstoWorkSheet = Globals.Factory.GetVstoObject(_worksheetInteropObject)
     41                 End If
     42             End If
     43 
     44             _vstoWorkSheet.Activate()
     45             Return _vstoWorkSheet
     46         End Get
     47     End Property
     48 
     49     Public Sub SetWorksheet(worksheetInteropObject As Excel.Worksheet)
     50         _worksheetInteropObject = worksheetInteropObject
     51         _vstoWorkSheet = Nothing
     52     End Sub
     53 
     54     Private Sub PopulateListObjectHeaderCheckBoxList()
     55         ListObjectHeaders.Items.Add("Date", True)
     56         ListObjectHeaders.Items.Add("Open", True)
     57         ListObjectHeaders.Items.Add("High", True)
     58         ListObjectHeaders.Items.Add("Low", True)
     59         ListObjectHeaders.Items.Add("Close", True)
     60         ListObjectHeaders.Items.Add("Volume", True)
     61         ListObjectHeaders.Items.Add("Adj Close", True)
     62     End Sub
     63 
     64     ' When user chooses the checkbox, generate a new sheet, a table of data, and a chart.
     65     ' If the sheet, table, and chart already exist, delete them.
     66     Private Sub ListObject_Check(sender As Object, e As EventArgs) Handles ListObjectCheckBox.Click
     67         Dim listObjectName As String = "stockHistoryListObject"
     68         Dim chartName As String = "stockHistoryChart"
     69 
     70         If DirectCast(sender, System.Windows.Forms.CheckBox).Checked Then
     71             If dateTimePicker1.Value.[Date] >= DateTime.Now.[Date] Then
     72 
     73                 MessageBox.Show("Please choose a starting date before today's date")
     74                 DirectCast(sender, System.Windows.Forms.CheckBox).Checked = False
     75             Else
     76                 Dim selection As Excel.Range = SelectedRange
     77                 Dim tickerSymbol As String = selection.Value2
     78 
     79                 Dim data As List(Of HistoricalStock) = Nothing
     80                 Try
     81                     data = GetDataUpdatesFoOneDataSource(tickerSymbol, dateTimePicker1.Value.[Date].ToString())
     82                 Catch generatedExceptionName As Exception
     83                     MessageBox.Show("Unable to return data. Please ensure that you select a valid stock ticker symbol" & " in your worksheet and then try again")
     84                     DirectCast(sender, System.Windows.Forms.CheckBox).Checked = False
     85                     Return
     86                 End Try
     87 
     88                 CreateNewSheet()
     89 
     90                 If selection IsNot Nothing Then
     91                     _listObject = VstoWorksheet.Controls.AddListObject(Globals.ThisAddIn.Application.Range("A1"), listObjectName)
     92                     groupBox1.Enabled = True
     93                     groupBox2.Enabled = True
     94                     groupBox3.Enabled = True
     95 
     96                     _listObject.DataBindings.Clear()
     97                     _listObject.SetDataBinding(data)
     98 
     99                     Dim counter As Integer = 0
    100 
    101                     For Each range As Excel.Range In _listObject.HeaderRowRange.Cells
    102                         range.Value2 = ListObjectHeaders.Items(counter)
    103                         counter += 1
    104                     Next
    105 
    106                     AddChart(chartName)
    107 
    108                 End If
    109             End If
    110         Else
    111             VstoWorksheet.Controls.Remove(listObjectName)
    112             VstoWorksheet.Controls.Remove(chartName)
    113             VstoWorksheet.Delete()
    114             SetWorksheet(Globals.ThisAddIn.Application.ActiveWorkbook.Sheets(1))
    115 
    116             groupBox1.Enabled = False
    117             groupBox2.Enabled = False
    118             groupBox3.Enabled = False
    119         End If
    120     End Sub
    121 
    122     Private Sub CreateNewSheet()
    123 
    124         Dim newWorksheet As Excel.Worksheet
    125         newWorksheet = DirectCast(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)
    126         newWorksheet.Name = "Price history"
    127         SetWorksheet(newWorksheet)
    128     End Sub
    129 
    130     Private ReadOnly Property SelectedRange() As Excel.Range
    131         Get
    132             Dim selection As Excel.Range = TryCast(VstoWorksheet.Application.Selection, Excel.Range)
    133 
    134             If selection IsNot Nothing AndAlso selection.Worksheet.Name = VstoWorksheet.Name Then
    135                 Return selection
    136             End If
    137 
    138             Return Nothing
    139         End Get
    140     End Property
    141 
    142     ' Define a class to hold information from the stock service.
    143     Public Class HistoricalStock
    144         Public Property [Date]() As DateTime
    145             Get
    146                 Return m_Date
    147             End Get
    148             Set(value As DateTime)
    149                 m_Date = value
    150             End Set
    151         End Property
    152         Private m_Date As DateTime
    153         Public Property Open() As Double
    154             Get
    155                 Return m_Open
    156             End Get
    157             Set(value As Double)
    158                 m_Open = value
    159             End Set
    160         End Property
    161         Private m_Open As Double
    162         Public Property High() As Double
    163             Get
    164                 Return m_High
    165             End Get
    166             Set(value As Double)
    167                 m_High = value
    168             End Set
    169         End Property
    170         Private m_High As Double
    171         Public Property Low() As Double
    172             Get
    173                 Return m_Low
    174             End Get
    175             Set(value As Double)
    176                 m_Low = value
    177             End Set
    178         End Property
    179         Private m_Low As Double
    180         Public Property Close() As Double
    181             Get
    182                 Return m_Close
    183             End Get
    184             Set(value As Double)
    185                 m_Close = value
    186             End Set
    187         End Property
    188         Private m_Close As Double
    189         Public Property Volume() As Double
    190             Get
    191                 Return m_Volume
    192             End Get
    193             Set(value As Double)
    194                 m_Volume = value
    195             End Set
    196         End Property
    197         Private m_Volume As Double
    198         Public Property AdjClose() As Double
    199             Get
    200                 Return m_AdjClose
    201             End Get
    202             Set(value As Double)
    203                 m_AdjClose = value
    204             End Set
    205         End Property
    206         Private m_AdjClose As Double
    207     End Class
    208 
    209     ' Query the stock service.
    210     Public Function GetDataUpdatesFoOneDataSource(ticker As String, mostRecentDate As String) As List(Of HistoricalStock)
    211         Dim _startDate As DateTime = DateTime.Now.[Date]
    212         Dim _endDate As DateTime
    213         _endDate = Convert.ToDateTime(mostRecentDate)
    214 
    215         Dim retval As New List(Of HistoricalStock)()
    216 
    217         If _startDate.[Date] <> _endDate.[Date] Then
    218             Dim _startMonthTemp As Integer = _startDate.Month - 1
    219             Dim _startMonth As String = _startMonthTemp.ToString()
    220             Dim _startDay As String = _startDate.Day.ToString()
    221             Dim _startYear As String = _startDate.Year.ToString()
    222 
    223             _endDate = _endDate.AddDays(1)
    224             Dim _endMonthTemp As Integer = _endDate.Month - 1
    225             Dim _endMonth As String = _endMonthTemp.ToString()
    226             Dim _endDay As String = _endDate.Day.ToString()
    227             Dim _endYear As String = _endDate.Year.ToString()
    228 
    229             Using web As New WebClient()
    230                 Dim _inputString As String = "http://ichart.finance.yahoo.com/table.csv?s=" & ticker & "&d=" & _startMonth & "&e=" & _startDay & "&f=" & _startYear & "&g=d&a=" & _endMonth & "&b=" & _endDay & "&c=" & _endYear & "&ignore=.csv"
    231 
    232                 Dim data As String = web.DownloadString(_inputString)
    233 
    234                 data = data.Replace("r", "")
    235                 Dim rows As String() = data.Split(ControlChars.Lf)
    236 
    237                 'First row is headers so Ignore it                
    238                 For i As Integer = 1 To rows.Length - 1
    239                     If rows(i).Replace("n", "").Trim() = "" Then
    240                         Continue For
    241                     End If
    242                     Dim cols As String() = rows(i).Split(","c)
    243                     Dim hs As New HistoricalStock()
    244                     hs.[Date] = Convert.ToDateTime(cols(0))
    245                     hs.Open = Convert.ToDouble(cols(1))
    246                     hs.High = Convert.ToDouble(cols(2))
    247                     hs.Low = Convert.ToDouble(cols(3))
    248                     hs.Close = Convert.ToDouble(cols(4))
    249                     hs.Volume = Convert.ToDouble(cols(5))
    250                     hs.AdjClose = Convert.ToDouble(cols(6))
    251                     retval.Add(hs)
    252                 Next
    253 
    254                 If retval.Count > 1 Then
    255                     If retval(0).[Date] = retval(1).[Date] Then
    256                         retval.RemoveAt(0)
    257                     End If
    258                 End If
    259             End Using
    260         End If
    261         Return retval
    262     End Function
    263 
    264     Private Sub AddChart(chartName As String)
    265 
    266         Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
    267             Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet
    268 
    269         Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
    270             Globals.Factory.GetVstoObject(NativeWorksheet)
    271 
    272         Dim cells As Excel.Range = worksheet.Range("I1", "O22")
    273         Dim chart As Microsoft.Office.Tools.Excel.Chart = worksheet.Controls.AddChart(cells, chartName)
    274         chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlLine
    275         chart.SetSourceData(_listObject.ListColumns(5).Range.EntireColumn)
    276         _chart = chart
    277     End Sub
    278 
    279     Private Sub ListObjectHeaders_Click(sender As Object, e As EventArgs) Handles ListObjectHeaders.Click
    280         Dim columnToHide As Excel.Range = Nothing
    281 
    282         Select Case ListObjectHeaders.SelectedItem.ToString()
    283             Case "Date"
    284                 columnToHide = _listObject.ListColumns(1).Range.EntireColumn
    285                 Exit Select
    286             Case "Open"
    287                 columnToHide = _listObject.ListColumns(2).Range.EntireColumn
    288                 Exit Select
    289             Case "High"
    290                 columnToHide = _listObject.ListColumns(3).Range.EntireColumn
    291                 Exit Select
    292             Case "Low"
    293                 columnToHide = _listObject.ListColumns(4).Range.EntireColumn
    294                 Exit Select
    295             Case "Close"
    296                 columnToHide = _listObject.ListColumns(5).Range.EntireColumn
    297                 Exit Select
    298             Case "Volume"
    299                 columnToHide = _listObject.ListColumns(6).Range.EntireColumn
    300                 Exit Select
    301             Case "Adj Close"
    302                 columnToHide = _listObject.ListColumns(7).Range.EntireColumn
    303                 Exit Select
    304         End Select
    305 
    306         If columnToHide.Hidden = False Then
    307             columnToHide.Hidden = True
    308         Else
    309             columnToHide.Hidden = False
    310         End If
    311 
    312     End Sub
    313     Private Sub BlackStyle_CheckedChanged(sender As Object, e As EventArgs) Handles BlackStyle.CheckedChanged
    314         _listObject.TableStyle = "TableStyleMedium1"
    315     End Sub
    316 
    317     Private Sub BlueStyle_CheckedChanged(sender As Object, e As EventArgs) Handles BlueStyle.CheckedChanged
    318         _listObject.TableStyle = "TableStyleMedium2"
    319     End Sub
    320 
    321     Private Sub OrangeStyle_CheckedChanged(sender As Object, e As EventArgs) Handles OrangeStyle.CheckedChanged
    322         _listObject.TableStyle = "TableStyleMedium3"
    323     End Sub
    324 
    325     Private Sub GrayStyle_CheckedChanged(sender As Object, e As EventArgs) Handles GrayStyle.CheckedChanged
    326         _listObject.TableStyle = "TableStyleMedium4"
    327     End Sub
    328 
    329     Private Sub GreenStyle_CheckedChanged(sender As Object, e As EventArgs) Handles GreenStyle.CheckedChanged
    330         _listObject.TableStyle = "TableStyleMedium7"
    331     End Sub
    332 
    333     Private Sub chartDataSourceComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles chartDataSourceComboBox.SelectedIndexChanged
    334         Select Case chartDataSourceComboBox.Text
    335             Case "Open"
    336                 _chart.SetSourceData(_listObject.ListColumns(2).Range.EntireColumn)
    337                 Exit Select
    338             Case "High"
    339                 _chart.SetSourceData(_listObject.ListColumns(3).Range.EntireColumn)
    340                 Exit Select
    341             Case "Low"
    342                 _chart.SetSourceData(_listObject.ListColumns(4).Range.EntireColumn)
    343                 Exit Select
    344             Case "Close"
    345                 _chart.SetSourceData(_listObject.ListColumns(5).Range.EntireColumn)
    346                 Exit Select
    347             Case "Volume"
    348                 _chart.SetSourceData(_listObject.ListColumns(6).Range.EntireColumn)
    349                 Exit Select
    350             Case "Adj_Close"
    351                 _chart.SetSourceData(_listObject.ListColumns(7).Range.EntireColumn)
    352                 Exit Select
    353             Case Else
    354                 MessageBox.Show("Invalid Selection")
    355                 Exit Select
    356         End Select
    357     End Sub
    358 
    359     Private Sub ChartStyleComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ChartStyleComboBox.SelectedIndexChanged
    360         Select Case ChartStyleComboBox.Text
    361             Case "Line"
    362                 _chart.ChartType = Excel.XlChartType.xlLine
    363                 Exit Select
    364             Case "Column"
    365                 _chart.ChartType = Excel.XlChartType.xlColumnClustered
    366                 Exit Select
    367             Case "Area"
    368                 _chart.ChartType = Excel.XlChartType.xlArea
    369                 Exit Select
    370             Case Else
    371                 MessageBox.Show("Invalid Selection")
    372                 Exit Select
    373         End Select
    374     End Sub
    375 
    376     Private Sub ChartColorThemeComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ChartColorThemeComboBox.SelectedIndexChanged
    377         Select Case ChartColorThemeComboBox.Text
    378             Case "White background"
    379                 _chart.ChartStyle = 227
    380                 Exit Select
    381             Case "Blue background"
    382                 _chart.ChartStyle = 229
    383                 Exit Select
    384             Case "Gray background"
    385                 _chart.ChartStyle = 236
    386                 Exit Select
    387             Case Else
    388                 MessageBox.Show("Invalid Selection")
    389                 Exit Select
    390         End Select
    391     End Sub
    392 
    393 
    394 
    395 
    396     Private Sub TableAndChartPane_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    397 
    398     End Sub
    399 End Class

    代码(ThisAddin.vb):

     1 Public Class ThisAddIn
     2 
     3     Dim _tableAndChartPane As TableAndChartPane
     4     Dim _taskPane As CustomTaskPane
     5     Private Sub ThisAddIn_Startup() Handles Me.Startup
     6 
     7         _tableAndChartPane = New TableAndChartPane()
     8         _taskPane = Me.CustomTaskPanes.Add(_tableAndChartPane, "Tables and Charts")
     9         _taskPane.Visible = True
    10         _taskPane.Width = 250
    11 
    12     End Sub
    13 
    14     Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
    15 
    16     End Sub
    17 
    18 End Class
  • 相关阅读:
    为什么富人越来越富,穷人越来越穷?
    计算几何基础_点_向量_极角排序
    滑窗模板_双向队列
    后缀数组
    AC自动机
    RMQ_ST表
    二叉树求逆序对(伪AC 23333)
    分块
    莫队
    树状数组_二维
  • 原文地址:https://www.cnblogs.com/xiehaofeng/p/7491589.html
Copyright © 2011-2022 走看看