此示例顯示如何創建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