ylbtech-LanguageSamples-OfficeSample(COM 互操作)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OfficeSample(COM 互操作)

 

1.A,示例(Sample) 返回顶部

本示例演示如何使用称为“COM 互操作”、“省略 ref”、“索引属性”、“命名参数”和“可选参数”的 C# 4.0 功能来创建与 Microsoft Office 进行通信的 C# 应用程序。 传统上,为了访问 Word、Excel 等 Microsoft Office 应用程序,C# 开发人员不得不编写相对冗长的代码。 新增的 C# 4.0 功能极大简化了对 Office API 的调用。

请看本示例中所用 Microsoft Office 方法的以下声明:

void PasteSpecial(ref object IconIndex = null, ref object Link = null,
    ref object Placement = null, ref object DisplayAsIcon = null,
    ref object DataType = null, ref object IconFileName = null,
    ref object IconLabel = null);

可以看到,此方法接受相当多的参数。 在 C# 中,开发人员传统上必须填写每个参数,即使进行这一调用的开发人员本欲通过支持可选参数来简化其使用也是如此。 在 C# 4.0 中,利用新增的对命名参数和可选参数的支持,开发人员可以仅指定所需参数,其他参数则使用其默认值:

word.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);

在对 PasteSpecial 方法的调用中,LinkDisplayAsIcon 参数是显式命名的,且设置为值 true。 所有其他参数都默认为 Office API 开发人员在内部指定的值,如上面的签名所示。

您可以创建自己的支持命名参数和可选参数的调用。 请看以下示例:

public void M(int x, int y = 5, int z = 7) { }

在此方法中,为参数 y 和 z 分配了默认值。 对此方法的调用如下所示:

M(1, 2, 3); // M 的普通调用
M(1, 2); // 省略 z,等效于 M(1, 2, 7)
M(1);  // 同时省略 y 和 z,等效于 M(1, 5, 7)
M(1, z: 3); // 通过名称传递 z
M(x: 1, z: 3); // 通过名称同时传递 x 和 z
M(z: 3, x: 1); // 反转实参的顺序

通过 C# 4.0 新增的动态功能,C# 开发人员可以更加方便地对 Office 编程。 现在,Office 中使用的类型可供 C# 开发人员调用,如同以 dynamic 类型对它们进行了声明一样。 下面是设置单元格属性的传统方式:

((Excel.Range)excel.Cells[1, 1]).Value2 = "ID";

现在,在 C# 4.0 中,开发人员可以编写如下所示的代码:

X1.Cells[1, 1].Value = "ID";

借助索引属性功能,可以进一步简化调用,如下所示:

xl.Cells[1, 1] = "ID";

最后要介绍的是 No-PIA 功能,Office 开发人员一定会对它感兴趣。 主互操作程序集从 COM 接口生成,可在设计时提供有用的类型支持。 不过在运行时,这些程序集会增加程序的大小,可能导致版本控制问题。 利用 No-PIA 功能,可以继续在设计时使用 PIA,但在运行时省略 PIA。 C# 编译器将程序实际使用的小部分 PIA 直接复制到其程序集中。 您不再需要在程序的分发中包括 PIA。

1.B,示例代码(Sample Code)返回顶部

1.B.1, Program.cs

// 版权所有(C) Microsoft Corporation。保留所有权利。
// 此代码的发布遵从
// Microsoft 公共许可(MS-PL,http://opensource.org/licenses/ms-pl.html)的条款。
//
using System;
using System.Collections.Generic;

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;

public class Account
{
    public int ID { get; set; }
    public double Balance { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        var checkAccounts = new List<Account> {
                   new Account {
                                      ID = 345,
                                      Balance = 541.27
                               },
                   new Account {
                                      ID = 123,
                                      Balance = -127.44
                               }
               };

        DisplayInExcel(checkAccounts, (account, cell) =>
        {
            // 此多行 lambda 表达式将设置
            // 自定义处理规则。
            cell.Value = account.ID;
            cell.Offset[0, 1].Value = account.Balance;

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

        var word = new Word.Application();
        word.Visible = true;
        word.Documents.Add();
        word.Selection.PasteSpecial(Link: true, DisplayAsIcon: true);
    }

    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] = "ID";
        xl.Cells[1, 2] = " Balance";
        xl.Cells[2, 1].Select();
        foreach (var ac in accounts)
        {
            DisplayFunc(ac, xl.ActiveCell);
            xl.ActiveCell.Offset[1, 0].Select();
        }

        xl.Range["A1:B3"].Copy();
        //xl.get_Range("A1:B3").Copy();

        xl.Columns[1].AutoFit();
        xl.Columns[2].AutoFit();
    }
}
View Code

1.B.2,

1.C,下载地址(Free Download)返回顶部

 

warn 作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted on 2015-01-01 23:38  ylbtech  阅读(176)  评论(0编辑  收藏  举报