事先创建一个Excel文件命名为“演示文档.xlsm”的,以实现通过运行名称为“演示”的宏,将A1单元格的内容复制到A2单元格中。
1.在“sheet1”的A1单元格输入“1.0.0.0”,作为excel文件的版本号。
2.通过开发工具中的Visual Basic,为工作簿添加模块,输入以下代码,建立宏
Sub 演示()
Range("A2") = Range("A1")
End Sub
3.文档另存为“演示文档.xlsm”。
(一)新建解决方案和Excel VSTO 工作簿项目
1.创建一个Excel VSTO工作簿的新项目,选择“Excel VSTO工作簿(Visual Basic)”模板,项目名称命名为“ExcelVSTO工作簿”,解决方案名称命名为“Excel 工作簿安装程序”,框架选择“.NET Framework 4.6.1”。
2.在“为应用程序选择文档”界面,选择“复制现有文档”,选择事先设计好的“演示文档.xlsm”,注意选择文档类型对话框为“启用宏的Excel工作簿(*.xlsm)”格式。
(二)设计Excel VSTO工作簿程序
主要是设计菜单项和代码。
1.在“ExcelVSTO工作簿”项目上,点击右键,选择“添加”——“类”,在“添加新项-ExcelVSTO工作簿”界面,选择“office/sharepoint”中的“功能区(可视化设计器)”,点击“添加”后默认建立“Ribbon1.vb”的模块。
2.依次右键点击“Group1”、“TabAddins(内置)”,均选择“ 删除”。
(1)点击左侧的“工具箱”,拖拽“Office 功能区控件”中的Tab按钮到“Ribbon1.vb[设计]”中,修改右侧属性的有关值,如Label改为“工作簿演示”等。
(2)再次点击左侧的“工具箱”,拖拽“Office 功能区控件”中的Group按钮到“Ribbon1.vb[设计]”的“工作簿演示”里面,修改右侧属性的有关值,如Label改为“关于”等。
(3)点击左侧的“工具箱”,拖拽“Office 功能区控件”中的Button按钮到“Ribbon1.vb[设计]”中的帮助里面,修改右侧属性的有关值,如Label改为“复制数据”,ControlSize改为“RibbonControlSizeLarge”,OfficeImageId改为“Copy”等。
(4)重复第(3)点操作,将新的Button的属性,修改Label改为“版本”,ControlSize改为“RibbonControlSizeLarge”,OfficeImageId改为“FieldCodes”等。
3.双击“复制数据”,进入“Ribbon1.vb”的代码编辑界面,在Button1_Click的过程中,输入以下代码
Globals.ThisWorkbook.Application.Run("演示")
4.双击“版本”图标,进入“Ribbon1.vb”的代码编辑界面,在Button2_Click的过程中,输入以下代码
MsgBox("当前程序版本1.0.0.0" & vbNewLine & vbNewLine & "xlsm文件最新版本为V1.0.0")
(三)设定Excel VSTO工作簿版本
1.点击右上角“解决方案资源管理器”界面图标栏的主页右侧的“在解决方案和可用视图之间切换”按钮,将切换到文件夹视图,在“ExcelVSTO工作簿\My Project”文件夹下,双击“AssemblyInfo.vb”文件。
2.在“AssemblyInfo.vb”代码编辑界面,将“
3.再次点击“在解决方案和可用视图之间切换”按钮,双击“Excel VSTO工作簿安装程序.sln”文件,恢复原始界面。
(四)生成Excel VSTo工作簿项目
1.将解决方案配置由Debug改为Release。
2.在“ExcelVSTO工作簿”项目上,点击右键,选择“属性”,在“外接程序安装”界面,选择“签名”中的“为ClickOnce清单签名”,点击“从文件选择”,选择提前编译好的证书文件,本例为“tsgazzb.pfx”,点击“打开”后显示“tsgazzb.pfx”证书的相关内容。
3.在“ExcelVSTO工作簿”项目上,点击右键,选择“生成”,将在此项目的输出目录内,生成一系列文件。
4. 在“ExcelVSTO工作簿”项目上,点击右键,选择“卸载项目”,在“ExcelVSTO工作簿.vbproj”代码编辑界面,搜索SolutionID,将SolutionID元素的 GUID 值复制到记事本留存,下一步将填写使用。在“ExcelVSTO工作簿”项目上,点击右键,选择“重新加载项目”,恢复原始界面。
(一)新建安装包项目
在解决方案“Excel 工作簿安装程序”上,点击右键,选择“添加”——“新建项目”,选择“Setup Project”模板,命名为“安装包”。
(二)连接Excel VSTO 工作簿项目
在“安装包”项目上,点击右键,选择“Add”——“项目输出”,在“添加项目输出组”界面,选择“项目”中的“主输出”,上方下拉菜单选择Excel VSTO工作簿的项目名称“ExcelVSTO工作簿”,其他配置不变,点击确定。
(三)添加Excel VSTO工作簿的部署、应用清单文件
在“安装包”项目上,点击右键,选择“Add”——“文件”,在“Add Files”界面,选择Excel VSTO 工作簿的项目“ExcelVSTO工作簿”文件夹的输出目录。
本例的具体目录如下:
D:\source\repos\Excel 工作簿安装程序\ExcelVSTO工作簿\bin\Release
选择部署文件“ExcelVSTO工作簿.vsto”、应用清单文件“ExcelVSTO工作簿.dll.manifest”,点击“打开”后将导入两个文件到“安装包”项目。
(四)排除Excel VSTO 工作簿项目的依赖项目
点开“安装包”项目的“Detected Dependencies”左侧的箭头,选择除“Microsoft .NET Framework”和任何以“*.Utilities.dll” 结尾的程序集以外的项目,一般情况下选择的数量是6个文件,点击右键,选择“排除”,被选中的文件左侧出现红色禁止图标。
(五)配置运行环境的必备组件
1.对于 Excel VSTO 外接程序项目,安装目标计算机必须满足必备组件的安装前置条件,然后才能正常运行外接程序:
(1)Microsoft .NET Framework:
安装目标计算机的.net Framework版本号高于解决方案要求的版本号的,将不安装该组件。
(2)Microsoft Visual Studio 2010 Tools for Office Runtime:
安装目标计算机的office版本为2013及以上的,将不按照该组件。
2.在“安装包”项目上,点击右键,选择“属性”。
(1)在“安装包属性”界面,点击“Prerequisiter”,在“系统必备”界面,勾选“创建用于安装系统必备组件的安装程序”。
(2)在“请选择要安装的系统必备组件”中,选择“Microsoft .NET Framework 4.*.*(x86和x64)”和“Microsoft Visual Studio 2010 Tools for Office Runtime(x86和x64)”。
(3)在“指定系统必备组件的安装位置”中,选择“从与我的应用程序相同的位置下载系统必备组件”,点击“确定”,退出相应界面。
(4)“安装包属性”界面,还可以修改msi安装包的名称。
(六) 配置启动条件
安装包将通过启动条件来判断安装目标计算机是否具备运行环境的必备组件,如果不具备将阻止外接程序的安装。
1.检测VSTO Runtime
(1)在“安装包”项目上,点击右键,选择“View”——“启动条件”,在“Launch Conditions(安装包)”界面,右键单击“Requirements on Target Machine”,然后单击“添加注册表启动条件”,将在“Search Target Machine”下方添加“Search for RegistryEntry1”项。
(2)点击“Search for RegistryEntry1”项,从右下角的属性界面中,按以下内容修改相关值
(Name):Search for VSTO 2010 Runtime
Property:VSTORUNTIMEREDIST
RegKey:SOFTWARE\Microsoft\VSTO Runtime Setup\v4R
Root:vsdrrHKLM
Value:Version
(3)点击“Condition1”项,从右下角的属性界面中,按以下内容修改相关值
(Name): Verify VSTO 2010 Runtime availability
Condition:VSTORUNTIMEREDIST>="10.0.30319"
InstallURL:空着不填
Message:The Visual Studio 2010 Tools for Office Runtime没有安装,请运行Setup.exe文件安装此插件。
2.检测Office安装的VSTO Runtime
(1)在“Launch Conditions(安装包)”界面,右键单击“Requirements on Target Machine”,然后单击“添加注册表启动条件”,将在“Search Target Machine”下方添加“Search for RegistryEntry1”项。
(2)点击“Search for RegistryEntry1”项,从右下角的属性界面中,按以下内容修改相关值
(Name): Search for Office VSTO Runtime
Property: OfficeRuntime
RegKey:SOFTWARE\Microsoft\VSTO Runtime Setup\v4
Root:vsdrrHKLM
Value:Version
(3)删除“Condition1”项,点击之前设置的“Verify VSTO 2010 Runtime availability”项,从右下角的属性界面中,将“Condition”项修改为以下内容:
VSTORUNTIMEREDIST >="10.0.30319" OR OFFICERUNTIME>="10.0.21022"
其他内容不变。
(一)新建项目
在解决方案“Excel 工作簿安装程序”上,点击右键,选择“添加”——“新建项目”,选择“控制台应用(.NET Framework) C#”模板,
命名为“AddCustomizationCustomAction”,框架依然选择为“.NET Framework 4.6.1”。
(二)添加引用
在“AddCustomizationCustomAction”项目上,点击右键,选择“添加”——“引用”,在“引用管理器-AddCustomizationCustomAction”界面,搜索以下引用并添加。
(1)System.Configuration.Install
(2)Microsoft.VisualStudio.Tools.Applications.Runtime
(3)Microsoft.VisualStudio.Tools.Applications.ServerDocument
如果有需要再添加System.ComponentModel引用。
(三)编辑代码
双击“Program.cs”文件,在代码编辑界面,用以下代码覆盖原有代码。
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using Microsoft.VisualStudio.Tools.Applications;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
namespace AddCustomizationCustomAction
{
[RunInstaller(true)]
public class AddCustomizations : Installer
{
public AddCustomizations() : base() { }
public override void Install(IDictionary savedState)
{
base.Install(savedState);
//Get the CustomActionData Parameters
string documentLocation = Context.Parameters.ContainsKey("documentLocation") ? Context.Parameters["documentLocation"] : String.Empty;
string assemblyLocation = Context.Parameters.ContainsKey("assemblyLocation") ? Context.Parameters["assemblyLocation"] : String.Empty;
string deploymentManifestLocation = Context.Parameters.ContainsKey("deploymentManifestLocation") ? Context.Parameters["deploymentManifestLocation"] : String.Empty;
Guid solutionID = Context.Parameters.ContainsKey("solutionID") ? new Guid(Context.Parameters["solutionID"]) : new Guid();
string newDocLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Path.GetFileName(documentLocation));
try
{
//Move the file and set the Customizations
if (Uri.TryCreate(deploymentManifestLocation, UriKind.Absolute, out Uri docManifestLocationUri))
{
if (File.Exists(newDocLocation))
File.Delete(newDocLocation);
File.Move(documentLocation, newDocLocation);
ServerDocument.RemoveCustomization(newDocLocation);
ServerDocument.AddCustomization(newDocLocation, assemblyLocation,
solutionID, docManifestLocationUri,
true, out string[] nonpublicCachedDataMembers);
}
else
{
LogMessage("The document could not be customized.");
}
}
catch (ArgumentException)
{
LogMessage("The document could not be customized.");
}
catch (DocumentNotCustomizedException)
{
LogMessage("The document could not be customized.");
}
catch (InvalidOperationException)
{
LogMessage("The customization could not be removed.");
}
catch (IOException)
{
LogMessage("The document does not exist or is read-only.");
}
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
DeleteDocument();
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
DeleteDocument();
}
private void DeleteDocument()
{
string documentLocation = Context.Parameters.ContainsKey("documentLocation") ? Context.Parameters["documentLocation"] : String.Empty;
try
{
File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Path.GetFileName(documentLocation)));
}
catch (Exception)
{
LogMessage("The document doesn't exist or is read-only.");
}
}
private void LogMessage(string Message)
{
if (Context.Parameters.ContainsKey("LogFile"))
{
Context.LogMessage(Message);
}
}
static void Main() { }
}
}
其中:
if (File.Exists(newDocLocation))
File.Delete(newDocLocation);
代码会将老版本删除,较新的Excel文档不会因已存在文档而无法复制。
(四)生成项目
在“AddCustomizationCustomAction”项目上,点击右键,选择“生成”,将在此项目的输出目录内,生成一系列文件。
(五)配置用于安装和卸载步骤的自定义操作
1.在“安装包”项目上,点击右键,选择“Add”——“项目输出”,在“添加项目输出组”界面,选择“项目”中的“主输出”,上方下拉菜单选择自定义操作的项目名称“AddCustomizationCustomAction”,其他配置不变,点击确定。
2.在“安装包”项目上,点击右键,选择“View”——“自定义操作”,在“Custom Actions(安装包)”界面,右键单击“Custom Actions”,然后单击“添加自定义操作”。
3. 在 Project 中的“Select Item in Project”对话框中的“Look In”列表中,双击“Application Folder”。 选择“主输出from AddCustomizationCustomAction (active)” ,然后单击“OK”,将自定义操作添加到安装步骤。
4. 在“Install”节点下,右键单击“主输出from AddCustomizationCustomAction (Active)”,然后单击“ 重命名”。 命名自定义操作为“Copy document to My Documents and attach customization”。
5.在“Uninstall”节点下,右键单击“主输出from AddCustomizationCustomAction (Active)”,然后单击“ 重命名”。 命名自定义操作为“Remove document from the Documents folder”。
6.点击“Install”节点下的“Copy document to My Documents and attach customization”,在右下角的属性界面,在 CustomActionData中,输入自定义 DLL 的位置、部署清单和 Microsoft Office 文档的位置,还需要 SolutionID。如果要将任何安装错误记录到文件中,请包含 LogFile 参数(取消其参数,在卸载时可以自动删除安装文件夹,否则log文件删除不掉)。
/assemblyLocation="[TARGETDIR]ExcelVSTO工作簿.dll" /deploymentManifestLocation="[TARGETDIR]ExcelVSTO工作簿.vsto" /documentLocation="[TARGETDIR]演示文档.xlsm" /solutionID="079fb922-36a6-431d-a0e9-a0fe2dfb839d" /LogFile="[TARGETDIR]Setup.log"
7. 点击“Uninstall”节点下的“Remove document from the Documents folder”,在右下角的属性界面,在 CustomActionData中,输入
/documentLocation="[INSTALLDIR] 演示文档.xlsm"
(一)设定安装包版本
点击“安装包”项目,在下方的属性界面,按照以下要求修改相应值:
(1)Author:公司或组织名称,如河北省唐山市××局
(2)DetectNewerInstall:True
(3)Manufacturer:同Author,此项将作为programe file下面的安装文件夹名称
(4)ProductName:改成你想在安装界面显示的名称
(5)RemovePreviousVersions:True
(6)Version:首次一般为“1.0.0”,以后可修改“1.0.1”等,修改后弹出的对话框,请选择“是”。
(二)生成安装程序
1.在“安装包”项目上,点击右键,选择“生成”,将在此项目的输出目录内,生成一系列文件。解决方案有修改时,建议选择“重新生成”,可将所有项目全部生成。
2.选择菜单栏的“全部保存”按钮,将本项目存盘。
(三)运行安装程序
打开windows文件资源管理器,进入“\repos\外接程序安装\安装包\Release”文件夹,将所有文件拷贝到安装目标计算机,运行setup.exe文件进行安装。
(四)项目更新后生成安装包
1.Excel工作簿更新
在“sheet1”的A1单元格输入“1.0.1”
2.VSTO外接程序项目更新
在“Ribbon1.vb[设计]”界面,双击“版本”图标,进入“Ribbon1.vb”的代码编辑界面,在Button1_Click的过程中,输入以下代码
MsgBox("version 1.0.1")
3.修改安装包版本
点击“安装包”项目,在下方的属性界面,将Version修改“1.0.1”等,修改后弹出的对话框,请选择“是”。
4.生成安装包
在“安装包”项目上,点击右键,选择“重新生成”,可将所有项目全部生成。