[转]比NPOI更討喜的Excel元件-EPPlus

本文转自:http://blog.darkthread.net/post-2012-05-12-epplus.aspx

前陣子發表 【潛盾機】將檔案結構匯成Excel文件,從網友佑翔的留言(特此感謝),認識了一顆被我錯過的l好元件 -- EPPlus!

NPOI源於POI,在很多介面設計上,帶點Java的觀點與風格,雖然能實現各項Excel操作,但函數介面及呼叫步驟,總讓.NET老鳥感覺不順手,就像用筷子吃手扒雞一樣彆扭。例如: 要寫入文字到新的Cell,必須先CreateRow(),再CreateCell(),而不像在Excel VBA透過.Cells(rowIndex, colIndex)一次到位。

LinqToExcel的出現為讀取Excel提供方便的額外選擇,能用熟悉的LINQ語法查詢Excel內容是件暢快的事,只可惜LinqToExcel只限於讀取,要產生Excel,還是得回歸NPOI。

EPPlus是一個起始於2009年底的Open Source專案,目標鎖定在伺服器端產生Office Open XML Excel檔(Excel 2007/2010的xlsx,不包含Excel 2003 xls),提供比NPOI更直覺、更簡便的API介面! 用.Cells[rowIndex, colIndex]就能直接存取欄位,甚至用.Cells[r1, c1, r2, c2]就能取得一段選取範圍,再一口氣改變它們的樣式;而要指定字型顏色時,使用Cells[…].Style.Font.Color.SetColor(Color.Red)就能搞定,不像NPOI需要CreateFont(), CreateCellStyle(), SetFont(), SetCellStyle()一長串操作。這才是.NET客心中理想的好元件呀~~

不過我不禁好奇,為何先前很少聽人提起,幾無知名度。私自揣摩,猜想可能與EPPlus只支援xlsx,無法相容於Excel 2003的xls格式,在需顧及不特定使用群時會有Excel版本門檻的考量。(雖然微軟提供免費的Excel檢視工具,但需要額外安裝仍會有部署面的考量) 另一方面,這個元件採用LGPL授權,代表如果要包含在產品中散佈,產品也必須Open Source(非100%要Open Source,授權限制可參見下方newbie的留言),也會造成一些軟體廠商採用上的疑慮。再者,微軟本身提供Open XML SDK,已涵蓋Excel檔的操作,有些開發者已直接採用SDK,沒想到再花時間評估更便捷元件(呼應了我在前篇文章的感嘆,有小錦囊後真的會讓人錯過其他更犀利的選擇),也可能是原因之一。

依我的看法,隨著時光飛逝,舊版Excel相容的重要性會逐年下降,而應用於網站時,只要不是販售網站程式本體,倒不必擔憂LGPL的限制(可參照先前的討論)。至於與Open XML SDK相比,初看語法,EPPlus確實如網友所說,具有"只見新人笑,不見舊人哭"的魅力! 真的可以跟NPOI說Bye Bye囉,在直覺易用上也已把Open XML SDK比下去。總評之後,EPPlus應是可以安心採用的解決方案。

好東西當然要也要實測體驗一下威力,就同樣用上回的檔案結構匯出Excel案例吧! 這回改用EPPlus來處理寫成Excel的部分。

要在專案中引用EPPlus,最快的方法一樣是透過NuGet: (還不會用NuGet的人,有沒有覺得自己已經輸在起跑點上?)

參考Zeeshan Umar的文章,三兩下就改好程式:

排版顯示純文字複製文字

    //加入擴充方法: SetQuickStyle,指定前景色/背景色/水平對齊
    private static void SetQuickStyle(this ExcelRange range,
        Color foreColor,
        Color bgColor = default(Color),
        ExcelHorizontalAlignment hAlign = ExcelHorizontalAlignment.Left)
    {
        range.Style.Font.Color.SetColor(foreColor);
        if (bgColor != default(Color))
        {
            range.Style.Fill.PatternType = ExcelFillStyle.Solid;
            range.Style.Fill.BackgroundColor.SetColor(bgColor);
        }
        range.Style.HorizontalAlignment = hAlign;
    }
 
    /// <summary>
    /// 將目錄下的目錄檔案結構匯出成Excel工作表
    /// </summary>
    /// <param name="dirPath">要匯出的目錄路徑</param>
    /// <param name="excelPath">匯出Excel路徑</param>
    /// <param name="filter">過濾函數,傳入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
        using (ExcelPackage p = new ExcelPackage())
        {
            ExcelWorksheet sheet = p.Workbook.Worksheets.Add("Site Tree");
            int colIdx = 1;
            foreach (string colName in "Path;File;Description".Split(‘;‘))
            {
                sheet.Cells[1, colIdx++].Value = colName;
            }
            //修改標題列Style
            sheet.Cells[1, 1, 1, 3].SetQuickStyle(Color.Yellow, Color.Green,
                    ExcelHorizontalAlignment.Center);
 
            int rowIdx = 2;
            foreach (var item in list)
            {
                //若bypass檢測傳回true,則略過該筆
                if (filter != null && filter(item.Path))
                    continue;
                //將Path放在第一欄(稍後隱藏)
                sheet.Cells[rowIdx, 1].Value = item.Path;
                //存入檔名或目錄名
                sheet.Cells[rowIdx, 2].Value = 
                    new String(‘ ‘, item.Layer * 4) + item.Name;
                if (item.IsFolder)
                {
                    sheet.Cells[rowIdx, 2].SetQuickStyle(Color.Blue);
                }
                rowIdx++;
            }
            //第一欄隱藏
            sheet.Column(1).Hidden = true;
            //自動伸縮欄寬
            sheet.Column(2).AutoFit();
          sheet.Column(2).Width += 2;
          sheet.Column(3).Width = 50;
            //寫入檔案
            p.SaveAs(new FileInfo(excelPath));
        }

//加入擴充方法: SetQuickStyle,指定前景色/背景色/水平對齊
private static void SetQuickStyle(this ExcelRange range,
Color foreColor,
Color bgColor = default(Color),
ExcelHorizontalAlignment hAlign = ExcelHorizontalAlignment.Left)
{
range.Style.Font.Color.SetColor(foreColor);
if (bgColor != default(Color))
{
range.Style.Fill.PatternType = ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(bgColor);
}
range.Style.HorizontalAlignment = hAlign;
}
 
/// <summary>
/// 將目錄下的目錄檔案結構匯出成Excel工作表
/// </summary>
/// <param name="dirPath">要匯出的目錄路徑</param>
/// <param name="excelPath">匯出Excel路徑</param>
/// <param name="filter">過濾函數,傳入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
using (ExcelPackage p = new ExcelPackage())
{
ExcelWorksheet sheet = p.Workbook.Worksheets.Add("Site Tree");
int colIdx = 1;
foreach (string colName in "Path;File;Description".Split(‘;‘))
{
sheet.Cells[1, colIdx++].Value = colName;
}
//修改標題列Style
sheet.Cells[1, 1, 1, 3].SetQuickStyle(Color.Yellow, Color.Green,
ExcelHorizontalAlignment.Center);
 
int rowIdx = 2;
foreach (var item in list)
{
//若bypass檢測傳回true,則略過該筆
if (filter != null && filter(item.Path))
continue;
//將Path放在第一欄(稍後隱藏)
sheet.Cells[rowIdx, 1].Value = item.Path;
//存入檔名或目錄名
sheet.Cells[rowIdx, 2].Value =
new String(‘ ‘, item.Layer * 4) + item.Name;
if (item.IsFolder)
{
sheet.Cells[rowIdx, 2].SetQuickStyle(Color.Blue);
}
rowIdx++;
}
//第一欄隱藏
sheet.Column(1).Hidden = true;
//自動伸縮欄寬
sheet.Column(2).AutoFit();
sheet.Column(2).Width += 2;
sheet.Column(3).Width = 50;
//寫入檔案
p.SaveAs(new FileInfo(excelPath));
}

一模一樣的結果,跟上回的NPOI寫法相比,是不是清爽順眼很多呢? 在以xlsx為主的網站應用場合,大家就大膽用下去吧!

时间: 2024-10-13 02:13:09

[转]比NPOI更討喜的Excel元件-EPPlus的相关文章

比NPOI更好用的Excel操作库——EPPlus

提到通过纯.Net读写Excel,一般首先想到的自然是大名鼎鼎的NPOI,就连微软官方的MSDN都有专门的一篇文章来介绍它的用法.今天在一个项目中使用到了导出报表为Excel的功能,便特地的试用了一下,感觉虽然它的功能够强大,但谈不上好用.可能是由于其起源与Java的POI的缘故,大部分的API还透浓浓着Java的味道. 例如,要在一个单元格中写入数据时,必须先CreateRow(),再CreateCell()才能写入,不能使用类似Cells[rowIndex, colIndex]=value之

asp.net使用MVC4框架基于NPOI做导出数据到Excel表

NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本

项目管理甘特图是什么?怎么做才能更高效?(EXCEL制作甘特图详细步骤)

项目管理甘特图是什么?甘特图即Gantt chart,又被称之为横道图.条状图.其命名是由提出者亨利·L·甘特(Henrry L.Ganntt)先生的名字而来的.甘特图是以图示的方式,并通过活动列表和时间刻度,来形象地表示出某些特定项目的活动顺序和持续时间. 关于项目管理甘特图是什么?怎么做才能更高效?(EXCEL制作甘特图详细步骤)可以加群647240543,自己去下载. 甘特图是项目管理中常用的一种图表,与平时常见的统计表格略有不同,它的内容更加复杂,绘制起来也更费力一些.管理项目不容易,可

导出Excel之Epplus使用教程4(其他设置)

导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他设置) 1.嵌入VBA代码 首先将vba代码保存成txt文本格式,然后用epplus去调用这个txt文本文件即可,非常简单,当然要想vba调用成功,前提是你的vba代码是没问题的喽! worksheet.CodeModule.Name = "sheet" ; worksheet.CodeM

导出Excel之Epplus使用教程2(样式设置)

导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他设置) 1.公式计算 excel中离不开各种各样的公式计算,在Epplus中运用公式有两种方式,你都可以尝试一下: worksheet.Cells["D2:D5"].Formula = "B2*C2";//这是乘法的公式,意思是第二列乘以第三列的值赋值给第四列,这种方法

导出Excel之Epplus使用教程1(基本介绍)

1.前言 目前Epplus的介绍中文资料很少,我也一直在摸索中使用它,以下是我在使用过程中得到的经验,写出来供大家参考.本系列共4章: 导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他设置) 2.Epplus介绍 EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组件,在导出

导出Excel之Epplus使用教程3(图表设置)

导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他设置) Epplus的图表实现是很简单的,它支持的图表类型也很多,基本上能满足我们的需求.创建图表分为三步(以柱状图举例): 1.创建图表 ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnCl

NPOI导出多张图片到Excel

常用NPOI导出数据到excel,但没有试过如何导出图片.NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel.在单元格中插入图片主要是用HSSFClientAnchor对象.他有8个参数. HSSFClientAnchor anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2); 前面四个表示在单元格中两个点的位置,后面四个表示是哪个单元格.先看代码. public FileResu

asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格式要求不高,因此只需要在页面上加入一条链接,后台action中读取数据然后通过第三方组件导出,再下载,就能满足这个简单的需求了.首先上bing找了有关数据导出的组件,NPOI是弹出的次数最多的一项,在这里也要说到以前做winform窗体开发用到过水晶报表的方法,其实实现方法比较多,由于以前没接触过N