令人驚豔的Excel程式庫 - ClosedXML
作者:微軟 MVP 黑暗執行緒
出處:http://blog.darkthread.net/post-2012-12-28-closedxml.aspx
處理ReportViewer匯出檔的比武大會 上,NPOI與EPPlus都敗下陣來,Open XML SDK雖然勝出,但在應用呼叫上繁瑣難搞,用起來總覺礙手礙腳。在研究Open XML SDK設定工作表保護 的過程,發現新大陸 - 另一套Open Source的Excel程式庫,ClosedXML 。
簡單整理ClosedXML特色如下: [list=1][*]程式庫很俏皮地命名為ClosedXML,事實它高度依賴Open XML
SDK,在引用時,程式必須一併參考DocumentFormat.OpenXml.dll。ClosedXML切入的角度是為Open XML
SDK提供容易操作的程式介面,而事實證明它做得很成功,程式介面的確非常簡潔易用。 [*]以Open XML SDK為基礎,所以只支援xlsx,不支援xls格式。[*]CodePlex上就文件與範例,內容十分完整 ,很容易上手。[*]支援NuGet安裝,加入時會一併帶入Open XML SDK參照,安裝簡單。
圖片:
![圖片:]()
[*]ClosedXML的很多Method在設計上仿照Excel VBA慣例,例如: sheet.Cell("A1").Value=Boo"、sheet.Range("A1:C5")選取範圍,用起來相當簡單直覺。 [*]很重要的一點,先前讓EPPLUS及NPOI灰頭土臉的ReportViewer匯出檔測試,ClosedXML輕易過關,產出結果與Excel相容,程式碼又比Open XML SDK簡短易理解,大勝! (以下範例順便展示了保護工作表功能,一行搞定。) 排版顯示純文字
圖片:
![圖片:]()
[/list]
初步評估,ClosedXML支援不少Excel VBA風格的簡潔API,在ReportViewer匯出檔案相容性測試又比NPOI及EPPlus好,看起來很值得一試!
最後不能免俗地,比照NPOI 、EPPlus ,要用ClosedXML試做網站檔案結構轉Excel的範例:
排版顯示純文字
程式簡潔度與EPPlus相近,結果也正確無誤,ClosedXML勝出之處在於產出檔與Excel相容度較高,是一套值得推薦的Excel程式庫。
圖片:
作者:微軟 MVP 黑暗執行緒
出處:http://blog.darkthread.net/post-2012-12-28-closedxml.aspx
處理ReportViewer匯出檔的比武大會 上,NPOI與EPPlus都敗下陣來,Open XML SDK雖然勝出,但在應用呼叫上繁瑣難搞,用起來總覺礙手礙腳。在研究Open XML SDK設定工作表保護 的過程,發現新大陸 - 另一套Open Source的Excel程式庫,ClosedXML 。
簡單整理ClosedXML特色如下: [list=1][*]程式庫很俏皮地命名為ClosedXML,事實它高度依賴Open XML
SDK,在引用時,程式必須一併參考DocumentFormat.OpenXml.dll。ClosedXML切入的角度是為Open XML
SDK提供容易操作的程式介面,而事實證明它做得很成功,程式介面的確非常簡潔易用。 [*]以Open XML SDK為基礎,所以只支援xlsx,不支援xls格式。[*]CodePlex上就文件與範例,內容十分完整 ,很容易上手。[*]支援NuGet安裝,加入時會一併帶入Open XML SDK參照,安裝簡單。


[*]ClosedXML的很多Method在設計上仿照Excel VBA慣例,例如: sheet.Cell("A1").Value=Boo"、sheet.Range("A1:C5")選取範圍,用起來相當簡單直覺。 [*]很重要的一點,先前讓EPPLUS及NPOI灰頭土臉的ReportViewer匯出檔測試,ClosedXML輕易過關,產出結果與Excel相容,程式碼又比Open XML SDK簡短易理解,大勝! (以下範例順便展示了保護工作表功能,一行搞定。) 排版顯示純文字
以下內容為程式語法:
//ClosedXML
var wb=new XLWorkbook(src);
var ws=wb.Worksheets.First();
ws.Cells("A1").Value=已修改";
ws.Protect("LetMeEdit");
wb.SaveAs(@"d:\temp\closedXml.xlsx");
//ClosedXML
var wb=new XLWorkbook(src);
var ws=wb.Worksheets.First();
ws.Cells("A1").Value=已修改";
ws.Protect("LetMeEdit");
wb.SaveAs(@"d:\temp\closedXml.xlsx");


[/list]
初步評估,ClosedXML支援不少Excel VBA風格的簡潔API,在ReportViewer匯出檔案相容性測試又比NPOI及EPPlus好,看起來很值得一試!
最後不能免俗地,比照NPOI 、EPPlus ,要用ClosedXML試做網站檔案結構轉Excel的範例:
排版顯示純文字
以下內容為程式語法:
/// <summary>
/// 將目錄下的目錄檔案結構匯出成Excel工作表
/// </summary>
/// <param>要匯出的目錄路徑</param>
/// <param>匯出Excel路徑</param>
/// <param>過濾函數,傳入Path進行判斷,傳回true時表排除</param>
/// <returns></returns>
public static void WebTreeToExcel(
string dirPath, string excelPath,
Func<string, bool> filter=null)
{
//將目錄結構整理成清單
List<WebItem> list=new List<WebItem>();
explore(list, dirPath, 0);
//建立Excel
XLWorkbook workbook=new XLWorkbook();
var sheet=workbook.Worksheets.Add("Site Tree");
int colIdx=1;
foreach (string colName in "Path;File;Description".Split(';'))
{
sheet.Cell(1, colIdx++).Value=colName;
}
//修改標題列Style
var header=sheet.Range("A1:C1");
header.Style.Fill.BackgroundColor=XLColor.Green;
header.Style.Font.FontColor=XLColor.Yellow;
header.Style.Alignment.Horizontal=XLAlignmentHorizontalValues.Center;
int rowIdx=2;
foreach (var item in list)
{
//若bypass檢測傳回true,則略過該筆
if (filter != null && filter(item.Path))
continue;
//將Path放在第一欄(稍後隱藏)
sheet.Cell(rowIdx, 1).Value=item.Path;
//存入檔名或目錄名
sheet.Cell(rowIdx, 2).Value =
new String(' ', item.Layer * 4) + item.Name;
if (item.IsFolder)
{
sheet.Cell(rowIdx, 2).Style.Font.FontColor=XLColor.Blue;
}
rowIdx++;
}
//第一欄隱藏
sheet.Column(1).Hide();
//自動伸縮欄寬
sheet.Column(2).AdjustToContents();
sheet.Column(2).Width += 2;
sheet.Column(3).Width=50;
//寫入檔案
workbook.SaveAs(excelPath);
}
/// <summary>
/// 將目錄下的目錄檔案結構匯出成Excel工作表
/// </summary>
/// <param>要匯出的目錄路徑</param>
/// <param>匯出Excel路徑</param>
/// <param>過濾函數,傳入Path進行判斷,傳回true時表排除</param>
/// <returns></returns>
public static void WebTreeToExcel(
string dirPath, string excelPath,
Func<string, bool> filter=null)
{
//將目錄結構整理成清單
List<WebItem> list=new List<WebItem>();
explore(list, dirPath, 0);
//建立Excel
XLWorkbook workbook=new XLWorkbook();
var sheet=workbook.Worksheets.Add("Site Tree");
int colIdx=1;
foreach (string colName in "Path;File;Description".Split(';'))
{
sheet.Cell(1, colIdx++).Value=colName;
}
//修改標題列Style
var header=sheet.Range("A1:C1");
header.Style.Fill.BackgroundColor=XLColor.Green;
header.Style.Font.FontColor=XLColor.Yellow;
header.Style.Alignment.Horizontal=XLAlignmentHorizontalValues.Center;
int rowIdx=2;
foreach (var item in list)
{
//若bypass檢測傳回true,則略過該筆
if (filter != null && filter(item.Path))
continue;
//將Path放在第一欄(稍後隱藏)
sheet.Cell(rowIdx, 1).Value=item.Path;
//存入檔名或目錄名
sheet.Cell(rowIdx, 2).Value =
new String(' ', item.Layer * 4) + item.Name;
if (item.IsFolder)
{
sheet.Cell(rowIdx, 2).Style.Font.FontColor=XLColor.Blue;
}
rowIdx++;
}
//第一欄隱藏
sheet.Column(1).Hide();
//自動伸縮欄寬
sheet.Column(2).AdjustToContents();
sheet.Column(2).Width += 2;
sheet.Column(3).Width=50;
//寫入檔案
workbook.SaveAs(excelPath);
}
程式簡潔度與EPPlus相近,結果也正確無誤,ClosedXML勝出之處在於產出檔與Excel相容度較高,是一套值得推薦的Excel程式庫。

