在開發.NET應用中可能會遇到須要生成帶圖表(Chart)的Excel報表的需求,特別是在一些ASP.NET網站中,有時候咱們並不能保證Web服務器上必定安裝了Office組件,因此使用微軟的Office來生成Excel並不保證在全部狀況下都使用,有時候即便Web服務器上安裝了Office也會出現一些運行權限方面的緣由到致使調用Excel組件生成Excel失敗,因此在這裏介紹一種無需安裝Office而且無需較高權限就能生成Excel的方法。數據庫
EPPlus簡介c#
在介紹EPPlus以前,首先要介紹一下Office Open XML。如下文字來自於維基百科(網址:Office Open XML,有刪節):服務器
Office Open XML(縮寫:Open XML、OpenXML或OOXML),是由Microsoft開發的一種以XML爲基礎並以ZIP格式壓縮的電子文件,支持Word、Excel、Office Note、PPT等文件格式。OOXML在2006年12月成爲了ECMA規範的一部分,編號爲ECMA-376;並於2008年4月國際標準化組織(ISO)的表決,在兩個月公佈爲ISO/IEC 29500國際標準。從Microsoft Office 2007開始,Office Open XML文件格式已經成爲Microsoft Office默認的文件格式。Microsoft Office 2010支持對ECMA-376標準文檔的讀操做,ISO/IEC 29500 Transitional的讀/寫,ISO/IEC 29500 Strict的讀取。Microsoft Office 2013同時支持ISO/IEC 29500 Strict的讀寫操做。微信
EPPlus就是一個經過Open XML方式來讀寫Office文件的開源.NET類庫,因此使用它生成Office文件徹底不須要Microsoft Office(固然若是你需須要查看生成的文件就須要Office了)。它的官方網址是:http://epplus.codeplex.com/。若是須要體驗本文中提到的效果,須要從這個網址下載最新版本的類庫,我如今使用的這個名爲EPPlus.dll類庫僅658K,很是方便部署。dom
代碼示例ide
爲了演示EPPlus的用法,這裏寫了一個簡單的例子,在這個例子裏演示模擬了幾大公司實際業績與計劃業績的百分比,若是這個百分比大於95%則會將所在的單元格顯示爲綠色,若是小於90%則會顯示爲紅色,不然就顯示爲×××,而且還會生成一個圖標來直觀表示每個月實際完成狀況與計劃的百分比。網站
完整代碼以下:spa
/* ******************************************************************************** * * Project A report project * Module Name Excel Report * Author Zhou, Jin-Qiao (周金橋) * Creation Date [11/03/2013] * Description Generate Excel Report with Chat demo by Epplus * * Copyright 2013 zhoufoxcn. * ******************************************************************************** */ using System; using System.Data; using System.Drawing; using System.IO; using OfficeOpenXml; using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.Style; namespace ExcelReportApplication { /// <summary> /// 使用EPPlus生成帶圖表(Chart)的Excel文件的例子,注意在運行的機器上無需安裝Office,由於EPPlus是使用基於OpenXML技術生成的Excel文件。 /// 任何網站和我的都可在不對本代碼作任何修改的狀況下轉載本文及本文中示例的代碼用於非商業用途,任何除去版權的行爲均爲侵權。 /// 做者:周公(周金橋) /// 建立日期:2013-11-03 /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com /// 新浪微博地址:http://weibo.com/zhoufoxcn public class ExcelExportPage { private static readonly string[] MonthNames = new string[] { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}; //private static readonly string[] CommpanyNames = new string[] { "Microsoft", "IBM", "Oracle", "Amazon", "Google", "Facebook", "Twitter", "Paypal", "Yahoo", "HP" }; private static readonly string[] CommpanyNames = new string[] { "Microsoft", "IBM", "Oracle", "Google","Yahoo", "HP" }; static void Main(string[] args) { ExcelExportPage.GenerateExcelReport(); } /// <summary> /// 周公(周金橋)說明:這個方法就是主要演示如何生成帶圖表(Chart)的Excel文件的例子 /// </summary> public static void GenerateExcelReport() { string fileName = "ExcelReport-"+DateTime.Now.ToString("yyyy_MM_dd_HHmmss") + ".xlsx"; string reportTitle = "2013年度五大公司實際狀況與原計劃的百分比"; FileInfo file = new FileInfo("C:\\"+fileName); using (ExcelPackage package = new ExcelPackage(file)) { ExcelWorksheet worksheet = null; ExcelChartSerie chartSerie = null; ExcelLineChart chart = null; #region research worksheet = package.Workbook.Worksheets.Add("Data"); DataTable dataPercent = GetDataPercent(); //chart = Worksheet.Drawings.AddChart("ColumnStackedChart", eChartType.Line) as ExcelLineChart; chart = worksheet.Drawings.AddChart("ColumnStackedChart", eChartType.LineMarkers) as ExcelLineChart;//設置圖表樣式 chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.Title.Text = reportTitle;//設置圖表的名稱 //chart.SetPosition(200, 50);//設置圖表位置 chart.SetSize(800, 400);//設置圖表大小 chart.ShowHiddenData = true; //chart.YAxis.MinorUnit = 1; chart.XAxis.MinorUnit = 1;//設置X軸的最小刻度 //chart.DataLabel.ShowCategory = true; chart.DataLabel.ShowPercent = true;//顯示百分比 //設置月份 for (int col = 1; col <= dataPercent.Columns.Count; col++) { worksheet.Cells[1, col].Value = dataPercent.Columns[col - 1].ColumnName; } //設置數據 for (int row = 1; row <= dataPercent.Rows.Count; row++) { for (int col = 1; col <= dataPercent.Columns.Count; col++) { string strValue = dataPercent.Rows[row - 1][col - 1].ToString(); if (col == 1) { worksheet.Cells[row + 1, col].Value = strValue; } else { double realValue = double.Parse(strValue); worksheet.Cells[row + 1, col].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[row + 1, col].Style.Numberformat.Format = "#0\\.00%";//設置數據的格式爲百分比 worksheet.Cells[row + 1, col].Value = realValue; if (realValue< 0.90d)//若是小於90%則該單元格底色顯示爲紅色 { worksheet.Cells[row + 1, col].Style.Fill.BackgroundColor.SetColor(Color.Red); } else if (realValue>= 0.90d && realValue <= 0.95d)//若是在90%與95%之間則該單元格底色顯示爲××× { worksheet.Cells[row + 1, col].Style.Fill.BackgroundColor.SetColor(Color.Yellow); } else { worksheet.Cells[row + 1, col].Style.Fill.BackgroundColor.SetColor(Color.Green);//若是大於95%則該單元格底色顯示爲綠色 } } } //chartSerie = chart.Series.Add(worksheet.Cells["A2:M2"], worksheet.Cells["B1:M1"]); //chartSerie.HeaderAddress = worksheet.Cells["A2"]; //chart.Series.Add()方法所需參數爲:chart.Series.Add(X軸數據區,Y軸數據區) chartSerie = chart.Series.Add(worksheet.Cells[row + 1, 2, row + 1, 2 + dataPercent.Columns.Count - 2], worksheet.Cells["B1:M1"]); chartSerie.HeaderAddress = worksheet.Cells[row + 1, 1];//設置每條線的名稱 } //由於假定每家公司至少完成了80%以上,因此這裏設置Y軸的最小刻度爲80%,這樣使圖表上的折線更清晰 chart.YAxis.MinValue = 0.8d; //chart.SetPosition(200, 50);//能夠經過制定左上角座標來設置圖表位置 //經過指定圖表左上角所在的行和列及對應偏移來指定圖表位置 //這裏CommpanyNames.Length + 1及3分別表示行和列 chart.SetPosition(CommpanyNames.Length + 1, 10, 3, 20); #endregion research package.Save();//保存文件 } } /// <summary> /// 生成數據,因爲這一步不是主要邏輯,因此採用隨機生成數據的方式,實際中可根據須要從數據庫或其它數據源中讀取須要的數據 /// </summary> /// <returns></returns> private static DataTable GetDataPercent() { DataTable data = new DataTable(); DataRow row = null; Random random=new Random(); data.Columns.Add(new DataColumn("公司名", typeof(string))); foreach(string monthName in MonthNames){ data.Columns.Add(new DataColumn(monthName, typeof(double))); } //每一個公司每個月的百分比表示完成的業績與計劃的百分比 for (int i = 0; i < CommpanyNames.Length; i++) { row = data.NewRow(); row[0] = CommpanyNames[i]; for (int j = 1; j <= MonthNames.Length; j++) { //這裏採用了隨機生成數據,但假定每家公司至少完成了計劃的85%以上 row[j] = 0.85d + random.Next(0, 15) / 100d; } data.Rows.Add(row); } return data; } } }
最終生成的Excel文件內容以下:.net
周公(周金橋)code
2013年11月4日凌晨於武漢
更多資訊,請關注本人微信訂閱號: