技术开发 频道

Visual Studio 2010特性支持Office

  3. 在Excel中显示账号数据
 
上一步我们完成了数据的准备,下面我们将把这些数据显示到Excel表格中。我们定义一个DisplayInExcel()函数用于创建Excel表格,然后将容器中的账号数据填充到Excel表格中:

public static void DisplayInExcel(IEnumerable<Account> accounts,
                               Action
<Account, Excel.Range> DisplayFunc)
    {
        var xl
= new Excel.Application();
                        
        xl.Workbooks.Add();
        xl.Visible
= true;
        xl.Cells[
1, 1].Value2 = "Name";
        xl.Cells[
1, 2].Value2 = " Balance";
        xl.Cells[
2, 1].Select();
        
foreach (var ac in accounts)
        {
            DisplayFunc(ac, xl.ActiveCell);
            xl.ActiveCell.get_Offset(
1, 0).Select();
        }

        xl.get_Range(
"A1:B3").Copy();
    }

  然后,我们在Main()函数的底部,按照如下的方式调用DisplayInExcel()函数,最终完成Excel表格的创建和数据的填充:

DisplayInExcel(checkAccounts, (account, cell) =>
                  {
                      
// This multiline lambda will set
                      
// custom processing rules.
                      cell.Value2=account.Name;
                      cell.get_Offset(
0, 1).Value2 = account.Balance;

                      
if (account.Balance < 0)
                      {
                          cell.Interior.Color
= 255;
                          cell.get_Offset(
0, 1).Interior.Color = 255;
                      }
                  });

  这里我们使用了Lambda表达式,由它来对数据填充的逻辑进行具体的定义,最终完成数据的填充。同时,它还会检查Balance的值,如果为负值,则将表格填充为红色,表示这个账号已经赤字了。最后,为了使得Excel表格更加美观,我们让Excel表格根据内容自动调整表格的宽度。在DisplayInExcel()函数的末尾,我们添加如下的代码:

xl.Columns[1].AutoFit();
xl.Columns[
2].AutoFit();

  在这里,有过Office开发经验的朋友可能会感到奇怪,AutoFit()函数可以被Columns的返回结果直接调用而无需进行类型转换吗?的确,在C# 3.0中,要想调用AutoFit()函数,必须对Columns的返回值进行类型转换,上面的代码应该写成:

// C# 3.0 code. Not necessary in C# 4.0!
((Range)xl.Columns[1]).AutoFit();
((Range)xl.Columns[
2]).AutoFit();

  但是在C# 4.0中,因为有了dynamic类型的支持,繁琐的类型转换将不再需要。在C# 4.0中,从COM接口返回的Object类型的对象,被自动当做dynamic类型来处理。我们前面曾经介绍过,因为动态类型的迟绑定特性(late binding),dynamic类型可以调用任何函数,所以无需再进行类型转换,也不会产生编译错误。在运行的时候,动态语言运行时(DLR)会动态查找对象真正的类型而调用相应的函数。

0
相关文章