此示例显示如何创建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