﻿# 介紹好用的 ExcelPackage 套件

之前我在寫 VSTO 的時候，真是痛苦死了，尤其用 C# 寫 VSTO 才真的是夢魘，不得已只好用 VB.NET 寫 VSTO 的應用。主要的痛苦點在於我必須先去 Excel 錄製 VBA 然後再將程式碼轉成 VB.NET 的格式，過程中有許多物件名稱與用法不太一樣，導致一直在查資料，開發的效率很差。

現在 Office 2007 因為採用了 Open XML 檔案格式，所有的 Office 文件都變成 XML 了，意思也就是說我們日後處理 Office 文件時就可以用更 Smart 的方式做了。

不過並非因為這樣我們就不用學 VSTO 2008，而是簡單的文件處理不再需要使用 VSTO 開發了，有個 [ExcelPackage](http://www.codeplex.com/ExcelPackage/) 套件已經開發出來了，今天的版本是 v1.0.0.1 版，此套件最主要的特色就是可以讀、寫 Excel 2007 的文件而不需要安裝 Office 2007 應用程式！ExcelPackage 主要是用到 [.NET 3.0](https://dotnet.microsoft.com/en-us/download/dotnet-framework "http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=10cc340b-f857-4a14-83f5-25634c3bf043") 的 [System.IO.Package](http://msdn2.microsoft.com/en-us/library/system.io.packaging.aspx "http://msdn2.microsoft.com/en-us/library/system.io.packaging.aspx") 命名空間裡的類別處理 [Open XML format](https://web.archive.org/web/20060822012924/http://blogs.msdn.com:80/excel/archive/2006/07/20/671995.aspx "http://blogs.msdn.com/excel/archive/2006/07/20/671995.aspx") 的檔案，所以才不需要安裝 Office 2007 但一定要安裝 [.NET 3.0](https://dotnet.microsoft.com/en-us/download/dotnet-framework "http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=10cc340b-f857-4a14-83f5-25634c3bf043") 才可以使用。

透過 ExcelPackage 你可以先將要產生的 Excel 檔將格式都先設計好，留下資料的部分透過 ExcelPackage 進行處理，一段 Code 可以省去我打一堆字，看 Code 吧：

```csharp
// 要寫入的 Excel 2007 文件
FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample3.xlsx");

// 要讀入的 Excel 2007 文件範本
FileInfo template = new FileInfo(templateDir.FullName + @"\sample3template.xlsx");

if (!template.Exists) throw new Exception("Template file does not exist! i.e. sample3template.xlsx");

// 讀入 template 修改後直接寫入 newFile
using (ExcelPackage xlPackage = new ExcelPackage(newFile, template))
{
    // 取得 Sales 工作表
    ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets["Sales"];

    if (worksheet != null)
    {
        // 在 Sales 工作表的第 (1, 1) 儲存格寫入一個超連結
        string hyperlink = "mailto:" + "somebody" + "@domain.com";
        worksheet.Cell(1, 1).Hyperlink = new Uri(hyperlink, UriKind.Absolute);
    }

    // 設定文件屬性
    xlPackage.Workbook.Properties.Title = "範例 3";
    xlPackage.Workbook.Properties.Author = "John Tunnicliffe";
    xlPackage.Workbook.Properties.Subject = "ExcelPackage Samples";
    xlPackage.Workbook.Properties.Keywords = "Office Open XML";
    xlPackage.Workbook.Properties.Category = "ExcelPackage Samples";
    xlPackage.Workbook.Properties.Comments = "此範例展示如何建立 Excel 2007 檔案";

    // 設定文件擴充屬性
    xlPackage.Workbook.Properties.Company = "AdventureWorks Inc.";
    xlPackage.Workbook.Properties.HyperlinkBase
        = new Uri("http:/" + "/www.linkedin.com/pub/0/277/8a5");

    // 設定自訂的文件屬性 ( 你可以用在你自己的應用程式裡 )
    xlPackage.Workbook.Properties
        .SetCustomPropertyValue("Checked by", "John Tunnicliffe");
    xlPackage.Workbook.Properties
        .SetCustomPropertyValue("EmployeeID", "1147");
    xlPackage.Workbook.Properties
        .SetCustomPropertyValue("AssemblyName", "ExcelPackage");

    // 存檔，會直接寫入 newFile
    xlPackage.Save();
}
```

這段 Code 是從下載的 ExcelPackage 中的 Sample Code 擷取出來的，我簡化過了，這樣比較好看，完整的 Sample 請到 [ExcelPackage](http://www.codeplex.com/ExcelPackage/) 網站下載。

另外還有個 [WordPackage](http://www.codeplex.com/WordPackage) 還在開發中，我也正在期待這個套件的完成，相信對 Word 文件的處理也會有莫大的助益！
