现在Visual Studio 2010中有了对可选参数的支持,整个代码简洁多了。
当我们找到统计的起止范围后,我们就可以计算这个范围内的工作时间的总和。这里,为了展示对Excel的操作,我们使用Excel的求和公式SUM来计算这些单元格的和。
// 得到某个时间段内工作时间最多的员工的ID
private void buttonGet_Click(object sender, EventArgs e)
{
// …
double fTotalTime = 0;
char cTotalIndex = 'A';
// 统计A到J列的总工作时间
for (char cColIndex = 'B'; cColIndex < 'J'; ++cColIndex)
{
// 构造单元格计算范围
strCellFrom = cColIndex.ToString() + nFromIndex.ToString();
strCellTo = cColIndex.ToString() + nToIndex.ToString();
// 计算单元格范围内的总工作时间
double fWorkTime = CalculateRange( strCellFrom, strCellTo);
// 记录较大的工作时间和单元格的列索引值
if (fWorkTime > fTotalTime)
{
fTotalTime = fWorkTime;
cTotalIndex = cColIndex;
}
}
// 得到工作时间最长的ID
string strMessage;
string strID;
string strIDCellAddress = cTotalIndex.ToString() + Convert.ToString(1);
Range IDRange = Globals.Sheet1.Range[ strIDCellAddress];
strID = IDRange.Text.ToString();
// 构造输出消息
strMessage = "从" + comboBoxFrom.SelectedItem.ToString()
+ "到" + comboBoxTo.SelectedItem.ToString() + "\n"
+ strID + "已经工作了" + fTotalTime + "小时。";
// 显示消息框
MessageBox.Show( strMessage );
}
// 计算单元格范围内的总工作时间
private double CalculateRange(string strCellFrom, string strCellTo)
{
// 创建NamedRange
// 使用一个临时单元格作为结果单元格
NamedRange retRange =
Globals.Sheet1.Controls.AddNamedRange(
Globals.Sheet1.Range["A100"],
"RetRange" + strCellFrom + strCellTo);
// 构造Excel公式
string strFormula;
strFormula = "=SUM(" + strCellFrom + ":" + strCellTo + ")";
// 设置结果单元格的公式
retRange.Formula = strFormula;
retRange.FormulaHidden = true;
// 执行计算
retRange.Calculate();
// 从结果单元格获取计算结果
double fRet;
string strRet = retRange.Value2.ToString();
fRet = Convert.ToDouble( strRet );
return fRet;
}
private void buttonGet_Click(object sender, EventArgs e)
{
// …
double fTotalTime = 0;
char cTotalIndex = 'A';
// 统计A到J列的总工作时间
for (char cColIndex = 'B'; cColIndex < 'J'; ++cColIndex)
{
// 构造单元格计算范围
strCellFrom = cColIndex.ToString() + nFromIndex.ToString();
strCellTo = cColIndex.ToString() + nToIndex.ToString();
// 计算单元格范围内的总工作时间
double fWorkTime = CalculateRange( strCellFrom, strCellTo);
// 记录较大的工作时间和单元格的列索引值
if (fWorkTime > fTotalTime)
{
fTotalTime = fWorkTime;
cTotalIndex = cColIndex;
}
}
// 得到工作时间最长的ID
string strMessage;
string strID;
string strIDCellAddress = cTotalIndex.ToString() + Convert.ToString(1);
Range IDRange = Globals.Sheet1.Range[ strIDCellAddress];
strID = IDRange.Text.ToString();
// 构造输出消息
strMessage = "从" + comboBoxFrom.SelectedItem.ToString()
+ "到" + comboBoxTo.SelectedItem.ToString() + "\n"
+ strID + "已经工作了" + fTotalTime + "小时。";
// 显示消息框
MessageBox.Show( strMessage );
}
// 计算单元格范围内的总工作时间
private double CalculateRange(string strCellFrom, string strCellTo)
{
// 创建NamedRange
// 使用一个临时单元格作为结果单元格
NamedRange retRange =
Globals.Sheet1.Controls.AddNamedRange(
Globals.Sheet1.Range["A100"],
"RetRange" + strCellFrom + strCellTo);
// 构造Excel公式
string strFormula;
strFormula = "=SUM(" + strCellFrom + ":" + strCellTo + ")";
// 设置结果单元格的公式
retRange.Formula = strFormula;
retRange.FormulaHidden = true;
// 执行计算
retRange.Calculate();
// 从结果单元格获取计算结果
double fRet;
string strRet = retRange.Value2.ToString();
fRet = Convert.ToDouble( strRet );
return fRet;
}
这时,当我们在活动面板中选择时期范围,然后点击“查询”按钮,插件就会为我们统计这段时间范围内工作时间最多的员工ID,并以消息的形式报告给我们。
图10 Excel数据处理结果
至此,我们已经完成了在Visual Studio 2010中开发三种Office插件应用的整个历程。强大的Visual Studio 2010给Office开发带来了新的动力,使得Office开发如虎添翼,成为一个成熟的并广为接受的开发平台。