VSTO - 使用Excel加載項生成表和圖表


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM