在Ribbon界面中处理数据
到这里为止,我们已经可以以编程的方式控制Ribbon界面了,接下来我们通过在活动面板中添加控件获得用户的输入,对Excel表格中的数据进行处理。
假设我们有这样一份考勤记录表,记录了每个员工每天的总工作时间,我们可以在Visual Studio中将这份考勤记录表设计如下:
图8 设计Excel表格
我们希望能够统计得到某个时间段内,工作时间最长的员工的ID,找到最勤快的人。
首先,我们编辑活动面板,添加两个Combo Box用于用户输入统计的具体时间段:
图9 编辑活动面板
为了便于用户输入合法的查询起止时间,我们在插件加载的时候,就将表中所有记录的时间添加到Combo Box中,用户只需要从其中进行选择就可以了。所以,在MyRibbon类的MyRibbon_Load()函数中添加如下代码:
{
// …
// 获取日期单元格的内容
if (!bLoaded) // 判断是否已经加载
{
// 设置已经加载,防止多次添加值
bLoaded = true;
// 循环遍历所有记录日期的单元格
for (int i = 2; i <= 11; ++i)
{
// 构造单元格的地址
string strCellIndex = "A" + i.ToString();
// 通过全局对象,获取单元格
Range rng = Globals.Sheet1.Range[ strCellIndex ];
// 获取单元格的内容
string strCell = "";
strCell = rng.Text.ToString();
// 通过调用活动面板类ActionsPaneControl1的AddDate函数,
// 给它控制的Combo Box添加可选的日期值
actionsPane1.AddDate(strCell);
}
}
}
另外,我们将ActionsPaneControl1类的AddDate()函数实现如下,利用这个函数,同时向活动面板上的两个Combo Box添加可选值。
{
// 将日期值添加到Combo Box中
comboBoxFrom.Items.Add(strDate);
comboBoxTo.Items.Add(strDate);
}
这样,控件在加载的时候,就会将表格中所有的日期值添加到活动面板的Combo Box中供用户选择。
对Excel数据进行处理
当用户在活动面板中通过Combo Box选择了合适的时间段之后,我们就需要根据用户的输入查询这个时间段内工作时间最多的员工ID。
首先,我们需要根据用户的输入决定统计的日期范围,也就是找出需要统计那几行数据。在活动面板查询按钮的点击动作响应函数中,我们根据用户的输入找到需要统计的范围:
private void buttonGet_Click(object sender, EventArgs e)
{
// 从Combo Box中获得用户输入的日期范围
string strCellFrom = comboBoxFrom.SelectedItem.ToString();
string strCellTo = comboBoxTo.SelectedItem.ToString();
// 根据用户输入,查找需要统计的开始行和结束行
int nFromIndex = FindDateIndex(comboBoxFrom.SelectedItem.ToString());
int nToIndex = FindDateIndex(comboBoxTo.SelectedItem.ToString());
// …
}
// 根据输入的日期字符串查找所在的行
private int FindDateIndex(string strDate)
{
int nCellIndex = 0;
string strCellAddress = "";
Range currentFind = null;
Range allCell = null;
// 所中Excel工作表Sheet1中的所有单元格作为查询范围
allCell = Globals.Sheet1.Range["A1", "F12"];
// 在这些单元格中查找字符串strData,也就是用户输入的日期值
currentFind = allCell.Find( strDate );
if (currentFind != null)
{
// 找到字符串,返回字符串所在单元格的行数
nCellIndex = currentFind.Row;
}
return nCellIndex;
在这段代码中,我们使用了Range类的Find函数,有过Office开发经验的朋友都知道,这是一个多参数函数,在以往的Office开发中,尽管我们只需要一个参数,由于它不支持可选参数,我们必须把所有参数都补齐,使得整个代码看起来相当的繁琐,例如:
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
missing, missing);