技术开发 频道

详解VSTS与OFFICE的协同开发:Excel篇

  在Ribbon界面中处理数据

  到这里为止,我们已经可以以编程的方式控制Ribbon界面了,接下来我们通过在活动面板中添加控件获得用户的输入,对Excel表格中的数据进行处理。

  假设我们有这样一份考勤记录表,记录了每个员工每天的总工作时间,我们可以在Visual Studio中将这份考勤记录表设计如下:


图8 设计Excel表格

  我们希望能够统计得到某个时间段内,工作时间最长的员工的ID,找到最勤快的人。

  首先,我们编辑活动面板,添加两个Combo Box用于用户输入统计的具体时间段:


图9 编辑活动面板

  为了便于用户输入合法的查询起止时间,我们在插件加载的时候,就将表中所有记录的时间添加到Combo Box中,用户只需要从其中进行选择就可以了。所以,在MyRibbon类的MyRibbon_Load()函数中添加如下代码:

private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
{
            
// …  

            
// 获取日期单元格的内容
            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添加可选值。

public void AddDate(string strDate)
{
            
// 将日期值添加到Combo Box中
            comboBoxFrom.Items.Add(strDate);
            comboBoxTo.Items.Add(strDate);
}

  这样,控件在加载的时候,就会将表格中所有的日期值添加到活动面板的Combo Box中供用户选择。
对Excel数据进行处理

  当用户在活动面板中通过Combo Box选择了合适的时间段之后,我们就需要根据用户的输入查询这个时间段内工作时间最多的员工ID。

首先,我们需要根据用户的输入决定统计的日期范围,也就是找出需要统计那几行数据。在活动面板查询按钮的点击动作响应函数中,我们根据用户的输入找到需要统计的范围:

// 得到某个时间段内工作时间最多的员工的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开发中,尽管我们只需要一个参数,由于它不支持可选参数,我们必须把所有参数都补齐,使得整个代码看起来相当的繁琐,例如:

this.Fruits.Find("apples", missing,
                Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
                Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext,
false,
                missing, missing);
0
相关文章