上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程。本次我们来给COM加载项添加一些功能:从SharePoint 2010的文档库中下载一个Excel文档到本地。
本系列所有示例代码均在 Visual Studio 2010 Ultimate RC + Office 2010 Professional Plus Beta x64 上测试通过。
1、首先创建一个Shared AddIn项目(具体细节请参阅上一篇文章):
2、添加引用:
Microsoft.SharePoint
System.Windows.Forms
System.Drawing
System.DirectoryServices
3、在Connect类中创建Application和COMAddIn的实例:
/// The object for implementing an Add-in.
/// </summary>
/// <seealso class='IDTExtensibility2' />
[GuidAttribute( " 6D3788F4-9529-429E-BA5D-09695F85687A " ), ProgId( " SimpleExcelServicesDemo.Connect " )]
public class Connect : Object, Extensibility.IDTExtensibility2
{
private Microsoft.Office.Interop.Excel.Application app;
private Microsoft.Office.Core.COMAddIn addIn;
3、在OnConnection事件里初始化:
{
this .app = application as Microsoft.Office.Interop.Excel.Application;
this .addIn = addInInst as Microsoft.Office.Core.COMAddIn;
}
4、在OnStartupComplete事件中设置一个按钮,关联事件处理逻辑:
{
CommandBars commandBars;
CommandBar standardBar下载数据;
CommandBarButton simpleButton下载数据;
commandBars = this .app.CommandBars;
// Get the standard CommandBar from Word
standardBar下载数据 = commandBars[ " Standard " ];
try
{
// try to reuse the button is hasn't already been deleted
simpleButton下载数据 = (CommandBarButton)standardBar下载数据.Controls[ " 下载数据 " ];
}
catch (System.Exception)
{
// If it's not there add a new button
simpleButton下载数据 = (CommandBarButton)standardBar下载数据.Controls.Add( 1 );
simpleButton下载数据.Caption = " 下载数据 " ;
simpleButton下载数据.Style = MsoButtonStyle.msoButtonCaption;
}
// Make sure the button is visible
simpleButton下载数据.Visible = true ;
simpleButton下载数据.Click += new _CommandBarButtonEvents_ClickEventHandler(btnDownload_Click);
standardBar下载数据 = null ;
commandBars = null ;
}
5、做一个域用户验证,当用户输入了合法的与用户名和密码后,才允许下载。这里添加了一个WindowsForm到项目中:
6、域用户验证逻辑,我本机是一台域控制器BROOKS.COM,使用的静态IP: 192.168.1.100,【LDAP://192.168.1.100/DC=BROOKS,DC=com】是LDAP的路径语法:
{
if ( this .txt用户名.Text.Trim() == string .Empty)
{
MessageBox.Show( " 用户名不能为空! " );
this .txt用户名.Focus();
return true ;
}
if ( this .txt密码.Text.Trim() == string .Empty)
{
MessageBox.Show( " 密码不能为空! " );
this .txt密码.Focus();
return true ;
}
if ( this .fn域用户验证( @" LDAP://192.168.1.100/DC=BROOKS,DC=com " , this .txt用户名.Text.Trim(), this .txt密码.Text.Trim()))
{
MessageBox.Show( " 您输入的用户名或密码错误,请重新输入! " );
this .txt密码.Clear();
this .txt密码.Focus();
return true ;
}
return false ;
}
private bool fn域用户验证( string path, string username, string pwd)
{
try
{
DirectoryEntry entry = new DirectoryEntry(path, username, pwd);
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = " (SAMAccountName= " + username + " ) " ;
SearchResult result = search.FindOne();
if ( null == result)
{
return true ;
}
else
{
return false ;
}
}
catch
{
return true ;
}
}
7、使用Windows Server 2008 R2的AD管理器创建一个域用户:test
8、在Connect中编写下载文件逻辑:
SharePoint 2010 网站是:http://brookspc/sites/doc,我们要下载的就是其Document库中的Excel Services Test.xlsx。
{
// 保存文件
using (SPSite site = new SPSite( " http://brookspc/sites/doc " ))
{
SPWeb web = site.OpenWeb();
string __fileName = " http://brookspc/sites/doc/Documents/Excel Services Test.xlsx " ;
SPFile file = web.GetFile(__fileName);
string __localFilePath = @" C:\ExcelServices.xlsx " ;
// 将文件下载到本地
byte [] content = file.OpenBinary();
if (File.Exists(__localFilePath))
{
File.Delete(__localFilePath);
}
FileStream fs = new FileStream(__localFilePath, FileMode.Create);
fs.Write(content, 0 , content.Length);
fs.Flush();
fs.Close();
}
}
9、按钮事件处理逻辑:
{
FrmLogin login = new FrmLogin();
if (login.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this .fn下载文件();
}
}
10、编译一下,安装生成的setup.exe:
11、打开Excel,点击【下载数据】:
12、输入域用户名、密码后,点击【登录】,即把SharePoint中的文件下载到了本地,默认在C盘:
小结:
本次只是添加了一些功能,和SharePoint 2010进行了交互,下载了一个文档,其中用到了域用户的验证。后续篇章会继续将VSTO与其他技术进行整合,构建一个完善的解决方案。