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):
Imports System.Net Public Class TableAndChartPane
Public Sub New()
InitializeComponent()
PopulateListObjectHeaderCheckBoxList() 'Populate the chart data source combo box.
chartDataSourceComboBox.Items.Add("Open")
chartDataSourceComboBox.Items.Add("High")
chartDataSourceComboBox.Items.Add("Low")
chartDataSourceComboBox.Items.Add("Close")
chartDataSourceComboBox.Items.Add("Volume")
chartDataSourceComboBox.Items.Add("Adj_Close") 'Populate the chart style combo box.
ChartStyleComboBox.Items.Add("line")
ChartStyleComboBox.Items.Add("Column")
ChartStyleComboBox.Items.Add("Area") 'Populate the chart style combo box.
ChartColorThemeComboBox.Items.Add("Gray background")
ChartColorThemeComboBox.Items.Add("Blue background")
ChartColorThemeComboBox.Items.Add("White background") End Sub Dim _vstoWorkSheet As Microsoft.Office.Tools.Excel.Worksheet
Dim _worksheetInteropObject As Excel.Worksheet
Dim _listObject As Microsoft.Office.Tools.Excel.ListObject = Nothing
Dim _chart As Microsoft.Office.Tools.Excel.Chart = Nothing Public ReadOnly Property VstoWorksheet() As Microsoft.Office.Tools.Excel.Worksheet
Get
If _vstoWorkSheet Is Nothing Then
If _worksheetInteropObject Is Nothing Then
_vstoWorkSheet = Globals.Factory.GetVstoObject(DirectCast(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(), Excel.Worksheet))
Else
_vstoWorkSheet = Globals.Factory.GetVstoObject(_worksheetInteropObject)
End If
End If _vstoWorkSheet.Activate()
Return _vstoWorkSheet
End Get
End Property Public Sub SetWorksheet(worksheetInteropObject As Excel.Worksheet)
_worksheetInteropObject = worksheetInteropObject
_vstoWorkSheet = Nothing
End Sub Private Sub PopulateListObjectHeaderCheckBoxList()
ListObjectHeaders.Items.Add("Date", True)
ListObjectHeaders.Items.Add("Open", True)
ListObjectHeaders.Items.Add("High", True)
ListObjectHeaders.Items.Add("Low", True)
ListObjectHeaders.Items.Add("Close", True)
ListObjectHeaders.Items.Add("Volume", True)
ListObjectHeaders.Items.Add("Adj Close", True)
End Sub ' When user chooses the checkbox, generate a new sheet, a table of data, and a chart.
' If the sheet, table, and chart already exist, delete them.
Private Sub ListObject_Check(sender As Object, e As EventArgs) Handles ListObjectCheckBox.Click
Dim listObjectName As String = "stockHistoryListObject"
Dim chartName As String = "stockHistoryChart" If DirectCast(sender, System.Windows.Forms.CheckBox).Checked Then
If dateTimePicker1.Value.[Date] >= DateTime.Now.[Date] Then MessageBox.Show("Please choose a starting date before today's date")
DirectCast(sender, System.Windows.Forms.CheckBox).Checked = False
Else
Dim selection As Excel.Range = SelectedRange
Dim tickerSymbol As String = selection.Value2 Dim data As List(Of HistoricalStock) = Nothing
Try
data = GetDataUpdatesFoOneDataSource(tickerSymbol, dateTimePicker1.Value.[Date].ToString())
Catch generatedExceptionName As Exception
MessageBox.Show("Unable to return data. Please ensure that you select a valid stock ticker symbol" & " in your worksheet and then try again")
DirectCast(sender, System.Windows.Forms.CheckBox).Checked = False
Return
End Try CreateNewSheet() If selection IsNot Nothing Then
_listObject = VstoWorksheet.Controls.AddListObject(Globals.ThisAddIn.Application.Range("A1"), listObjectName)
groupBox1.Enabled = True
groupBox2.Enabled = True
groupBox3.Enabled = True _listObject.DataBindings.Clear()
_listObject.SetDataBinding(data) Dim counter As Integer = For Each range As Excel.Range In _listObject.HeaderRowRange.Cells
range.Value2 = ListObjectHeaders.Items(counter)
counter +=
Next AddChart(chartName) End If
End If
Else
VstoWorksheet.Controls.Remove(listObjectName)
VstoWorksheet.Controls.Remove(chartName)
VstoWorksheet.Delete()
SetWorksheet(Globals.ThisAddIn.Application.ActiveWorkbook.Sheets()) groupBox1.Enabled = False
groupBox2.Enabled = False
groupBox3.Enabled = False
End If
End Sub Private Sub CreateNewSheet() Dim newWorksheet As Excel.Worksheet
newWorksheet = DirectCast(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)
newWorksheet.Name = "Price history"
SetWorksheet(newWorksheet)
End Sub Private ReadOnly Property SelectedRange() As Excel.Range
Get
Dim selection As Excel.Range = TryCast(VstoWorksheet.Application.Selection, Excel.Range) If selection IsNot Nothing AndAlso selection.Worksheet.Name = VstoWorksheet.Name Then
Return selection
End If Return Nothing
End Get
End Property ' Define a class to hold information from the stock service.
Public Class HistoricalStock
Public Property [Date]() As DateTime
Get
Return m_Date
End Get
Set(value As DateTime)
m_Date = value
End Set
End Property
Private m_Date As DateTime
Public Property Open() As Double
Get
Return m_Open
End Get
Set(value As Double)
m_Open = value
End Set
End Property
Private m_Open As Double
Public Property High() As Double
Get
Return m_High
End Get
Set(value As Double)
m_High = value
End Set
End Property
Private m_High As Double
Public Property Low() As Double
Get
Return m_Low
End Get
Set(value As Double)
m_Low = value
End Set
End Property
Private m_Low As Double
Public Property Close() As Double
Get
Return m_Close
End Get
Set(value As Double)
m_Close = value
End Set
End Property
Private m_Close As Double
Public Property Volume() As Double
Get
Return m_Volume
End Get
Set(value As Double)
m_Volume = value
End Set
End Property
Private m_Volume As Double
Public Property AdjClose() As Double
Get
Return m_AdjClose
End Get
Set(value As Double)
m_AdjClose = value
End Set
End Property
Private m_AdjClose As Double
End Class ' Query the stock service.
Public Function GetDataUpdatesFoOneDataSource(ticker As String, mostRecentDate As String) As List(Of HistoricalStock)
Dim _startDate As DateTime = DateTime.Now.[Date]
Dim _endDate As DateTime
_endDate = Convert.ToDateTime(mostRecentDate) Dim retval As New List(Of HistoricalStock)() If _startDate.[Date] <> _endDate.[Date] Then
Dim _startMonthTemp As Integer = _startDate.Month -
Dim _startMonth As String = _startMonthTemp.ToString()
Dim _startDay As String = _startDate.Day.ToString()
Dim _startYear As String = _startDate.Year.ToString() _endDate = _endDate.AddDays()
Dim _endMonthTemp As Integer = _endDate.Month -
Dim _endMonth As String = _endMonthTemp.ToString()
Dim _endDay As String = _endDate.Day.ToString()
Dim _endYear As String = _endDate.Year.ToString() Using web As New WebClient()
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" Dim data As String = web.DownloadString(_inputString) data = data.Replace("r", "")
Dim rows As String() = data.Split(ControlChars.Lf) 'First row is headers so Ignore it
For i As Integer = To rows.Length -
If rows(i).Replace("n", "").Trim() = "" Then
Continue For
End If
Dim cols As String() = rows(i).Split(","c)
Dim hs As New HistoricalStock()
hs.[Date] = Convert.ToDateTime(cols())
hs.Open = Convert.ToDouble(cols())
hs.High = Convert.ToDouble(cols())
hs.Low = Convert.ToDouble(cols())
hs.Close = Convert.ToDouble(cols())
hs.Volume = Convert.ToDouble(cols())
hs.AdjClose = Convert.ToDouble(cols())
retval.Add(hs)
Next If retval.Count > Then
If retval().[Date] = retval().[Date] Then
retval.RemoveAt()
End If
End If
End Using
End If
Return retval
End Function Private Sub AddChart(chartName As String) Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
Globals.Factory.GetVstoObject(NativeWorksheet) Dim cells As Excel.Range = worksheet.Range("I1", "O22")
Dim chart As Microsoft.Office.Tools.Excel.Chart = worksheet.Controls.AddChart(cells, chartName)
chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlLine
chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
_chart = chart
End Sub Private Sub ListObjectHeaders_Click(sender As Object, e As EventArgs) Handles ListObjectHeaders.Click
Dim columnToHide As Excel.Range = Nothing Select Case ListObjectHeaders.SelectedItem.ToString()
Case "Date"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "Open"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "High"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "Low"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "Close"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "Volume"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
Case "Adj Close"
columnToHide = _listObject.ListColumns().Range.EntireColumn
Exit Select
End Select If columnToHide.Hidden = False Then
columnToHide.Hidden = True
Else
columnToHide.Hidden = False
End If End Sub
Private Sub BlackStyle_CheckedChanged(sender As Object, e As EventArgs) Handles BlackStyle.CheckedChanged
_listObject.TableStyle = "TableStyleMedium1"
End Sub Private Sub BlueStyle_CheckedChanged(sender As Object, e As EventArgs) Handles BlueStyle.CheckedChanged
_listObject.TableStyle = "TableStyleMedium2"
End Sub Private Sub OrangeStyle_CheckedChanged(sender As Object, e As EventArgs) Handles OrangeStyle.CheckedChanged
_listObject.TableStyle = "TableStyleMedium3"
End Sub Private Sub GrayStyle_CheckedChanged(sender As Object, e As EventArgs) Handles GrayStyle.CheckedChanged
_listObject.TableStyle = "TableStyleMedium4"
End Sub Private Sub GreenStyle_CheckedChanged(sender As Object, e As EventArgs) Handles GreenStyle.CheckedChanged
_listObject.TableStyle = "TableStyleMedium7"
End Sub Private Sub chartDataSourceComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles chartDataSourceComboBox.SelectedIndexChanged
Select Case chartDataSourceComboBox.Text
Case "Open"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case "High"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case "Low"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case "Close"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case "Volume"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case "Adj_Close"
_chart.SetSourceData(_listObject.ListColumns().Range.EntireColumn)
Exit Select
Case Else
MessageBox.Show("Invalid Selection")
Exit Select
End Select
End Sub Private Sub ChartStyleComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ChartStyleComboBox.SelectedIndexChanged
Select Case ChartStyleComboBox.Text
Case "Line"
_chart.ChartType = Excel.XlChartType.xlLine
Exit Select
Case "Column"
_chart.ChartType = Excel.XlChartType.xlColumnClustered
Exit Select
Case "Area"
_chart.ChartType = Excel.XlChartType.xlArea
Exit Select
Case Else
MessageBox.Show("Invalid Selection")
Exit Select
End Select
End Sub Private Sub ChartColorThemeComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ChartColorThemeComboBox.SelectedIndexChanged
Select Case ChartColorThemeComboBox.Text
Case "White background"
_chart.ChartStyle =
Exit Select
Case "Blue background"
_chart.ChartStyle =
Exit Select
Case "Gray background"
_chart.ChartStyle =
Exit Select
Case Else
MessageBox.Show("Invalid Selection")
Exit Select
End Select
End Sub Private Sub TableAndChartPane_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub
End Class
代码(ThisAddin.vb):
Public Class ThisAddIn
Dim _tableAndChartPane As TableAndChartPane
Dim _taskPane As CustomTaskPane
Private Sub ThisAddIn_Startup() Handles Me.Startup
_tableAndChartPane = New TableAndChartPane()
_taskPane = Me.CustomTaskPanes.Add(_tableAndChartPane, "Tables and Charts")
_taskPane.Visible = True
_taskPane.Width =
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
End Class
VSTO - 使用Excel加载项生成表和图表的更多相关文章
- Office加载项
出自我的个人主页 Alvin Blog 前言 前一段时间公司做了有关Excel 加载项的开发,也遇到了很多坑,所以在此记录一下,有两个原因,1.留给以后在用到加载项的时候,复习所用,避免 跳进同一个坑 ...
- Office加载项安装
出自我的个人主页 Alvin Blog 前言 Excel加载项离不开安装,Excel加载项本身安装及其简单,但这是在申请下来Office开发者账户之后,再次之前都得自行安装 线上安装 微软申请开发者账 ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法
为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中 功能概述 修复ExcelCom加载项常见问题,如每次需重新勾选COM加载项或COM加 ...
- Windows -- 从注册表删除IE浏览器加载项
Windows -- 从注册表删除IE浏览器加载项 1. 一部分加载项从注册表以下位置直接删除 2. 一部分扩展项从注册表以下位置直接删除
- 下载安装与配置Excel 2013数据挖掘加载项(SQL Server 2012 SP1 + SQLServer2012_DMAddin.msi)
一.系统要求 在安装这个数据挖掘加载项前,你的机器必须要可以支持如下的相关系统设备: (1)操作系统:windows 7 和 windows 8,暂时不支持 windows 10. (2)excel ...
- 关于XLL加载项动态加载、卸载的演示及XLL函数自定义类型注册的演示
1.在XLL中,把函数定义成不同的类型,在Excel中的实际效果也不同,具体如下: pxMacroType value ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
- [转]每次打开IE9就会跳出管理加载项的窗口
当您打开IE9就跳出管理加载项的窗口,这一般是由于使用优化软件对系统进行优化清理后导致了注册表的错误.上次我们就为大家介绍了关于IE9启动后自动弹出管理加载项窗口的问题,这两个问题非常类似,引发问题的 ...
随机推荐
- 《HTTP 权威指南》笔记:第十二章 基本认证体制
导言 客户端可以通过网络来得到想要的信息,但是有一些信息并不能是对所有人都能看到的,因此必须有一种认证机制.服务器需要通过这种方式来了解用户身份,一旦服务器知道了用户的身份,就可以让用户能够访问请求的 ...
- Ruby 基础教程 第一部分总结
第一部分:Ruby 初体验 第一章: Ruby 初探 前言 开头的这一章节讲了一些十分基础的内容,重要的几个话题有: ruby 命令的执行方法 对象.方法的概念 常见的打印方法 ruby 命令的执行方 ...
- centos7: php7.2.9安装配置
下载php http://cn2.php.net/distributions/php-7.2.9.tar.gz 解压到: /usr/local/src/ 接下来进行参数配置,配置前如果没有libxml ...
- BGP - 3,BGP重要概念(EBGP,IBGP,防环/黑洞/全互连/同步)
1,防环/黑洞/同步/全互连(为出现大于号,现在通常都是要下一跳可达+关同步) a)EBGP邻居传来的路由可以通过AS_PATH防环,所以收到的不会有问题,因此直接是优化的(>),也就是直接装表 ...
- 在word中粘贴的图片为什么显示不完整
一.背景 整理系统测试说明文档,截得图片粘贴到word中显示不完整. 二.错误问题 问题:在word中粘贴的图片为什么显示不完整,如图所示: 三.分析问题: 原因是原来设置的行间距是固定值,图片也作一 ...
- 漏洞复现——tomcat远程代码执行漏洞
漏洞描述: 当存在该漏洞的Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT请求方法,攻击者可通过构造的攻击请求向服务器上传包含任意代码的 JSP 文件,造成任意代码执行 影响范 ...
- HTTP的连接过程
一.HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1.域名解析 2.发起TCP的3次握手 3. Web浏览器向Web服务器发送http请求命令 ...
- Nodejs--url模块
由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数. url 模块中的 parse 函数可以用于解析url中的参数. url ...
- 前端页面兼容ie8解决方法
一.通用兼容文件的引用: 1.HTML5标签兼容方案:html5shiv.js GitHub地址:https://github.com/aFarkas/html5shiv/ IE8不支持HTML5的新 ...
- Oracle12c版本中未归档隐藏参数
In this post, I will give a list of all undocumented parameters in Oracle 12.1.0.1c. Here is a query ...