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