在.NET中不安装Office使用EPPlus生成带图表(Chart)的Excel报表
在開(kāi)發(fā).NET應(yīng)用中可能會(huì)遇到需要生成帶圖表(Chart)的Excel報(bào)表的需求,特別是在一些ASP.NET網(wǎng)站中,有時(shí)候我們并不能保證Web服務(wù)器上一定安裝了Office組件,所以使用微軟的Office來(lái)生成Excel并不保證在所有情況下都使用,有時(shí)候即使Web服務(wù)器上安裝了Office也會(huì)出現(xiàn)一些運(yùn)行權(quán)限方面的原因到導(dǎo)致調(diào)用Excel組件生成Excel失敗,所以在這里介紹一種無(wú)需安裝Office并且無(wú)需較高權(quán)限就能生成Excel的方法。
EPPlus簡(jiǎn)介
在介紹EPPlus之前,首先要介紹一下Office Open XML。以下文字來(lái)自于維基百科(網(wǎng)址:Office Open XML,有刪節(jié)):
Office Open XML(縮寫(xiě):Open XML、OpenXML或OOXML),是由Microsoft開(kāi)發(fā)的一種以XML為基礎(chǔ)并以ZIP格式壓縮的電子文件,支持Word、Excel、Office Note、PPT等文件格式。OOXML在2006年12月成為了ECMA規(guī)范的一部分,編號(hào)為ECMA-376;并于2008年4月國(guó)際標(biāo)準(zhǔn)化組織(ISO)的表決,在兩個(gè)月公布為ISO/IEC 29500國(guó)際標(biāo)準(zhǔn)。從Microsoft Office 2007開(kāi)始,Office Open XML文件格式已經(jīng)成為Microsoft Office默認(rèn)的文件格式。Microsoft Office 2010支持對(duì)ECMA-376標(biāo)準(zhǔn)文檔的讀操作,ISO/IEC 29500 Transitional的讀/寫(xiě),ISO/IEC 29500 Strict的讀取。Microsoft Office 2013同時(shí)支持ISO/IEC 29500 Strict的讀寫(xiě)操作。
EPPlus就是一個(gè)通過(guò)Open XML方式來(lái)讀寫(xiě)Office文件的開(kāi)源.NET類(lèi)庫(kù),所以使用它生成Office文件完全不需要Microsoft Office(當(dāng)然如果你需需要查看生成的文件就需要Office了)。它的官方網(wǎng)址是:http://epplus.codeplex.com/。如果需要體驗(yàn)本文中提到的效果,需要從這個(gè)網(wǎng)址下載最新版本的類(lèi)庫(kù),我現(xiàn)在使用的這個(gè)名為EPPlus.dll類(lèi)庫(kù)僅658K,非常方便部署。
代碼示例
為了演示EPPlus的用法,這里寫(xiě)了一個(gè)簡(jiǎn)單的例子,在這個(gè)例子里演示模擬了幾大公司實(shí)際業(yè)績(jī)與計(jì)劃業(yè)績(jī)的百分比,如果這個(gè)百分比大于95%則會(huì)將所在的單元格顯示為綠色,如果小于90%則會(huì)顯示為紅色,否則就顯示為黃色,并且還會(huì)生成一個(gè)圖標(biāo)來(lái)直觀(guān)表示每月實(shí)際完成情況與計(jì)劃的百分比。
完整代碼如下:
/***********************************************************************************????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文件的例子,注意在運(yùn)行的機(jī)器上無(wú)需安裝Office,因?yàn)镋PPlus是使用基于OpenXML技術(shù)生成的Excel文件。///?任何網(wǎng)站和個(gè)人均可在不對(duì)本代碼做任何修改的情況下轉(zhuǎn)載本文及本文中示例的代碼用于非商業(yè)用途,任何除去版權(quán)的行為均為侵權(quán)。///?作者:周公(周金橋)?///?創(chuàng)建日期:2013-11-03?///?博客地址:http://blog.csdn.net/zhoufoxcn?http://zhoufoxcn.blog.51cto.com?///?新浪微博地址:http://weibo.com/zhoufoxcnpublic?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>///?周公(周金橋)說(shuō)明:這個(gè)方法就是主要演示如何生成帶圖表(Chart)的Excel文件的例子///?</summary>public?static?void?GenerateExcelReport(){string?fileName?=?"ExcelReport-"+DateTime.Now.ToString("yyyy_MM_dd_HHmmss")?+?".xlsx";string?reportTitle?=?"2013年度五大公司實(shí)際情況與原計(jì)劃的百分比";FileInfo?file?=?new?FileInfo("C:\\"+fileName);using?(ExcelPackage?package?=?new?ExcelPackage(file)){ExcelWorksheet?worksheet?=?null;ExcelChartSerie?chartSerie?=?null;ExcelLineChart?chart?=?null;#region?researchworksheet?=?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;//設(shè)置圖表樣式chart.Legend.Position?=?eLegendPosition.Right;chart.Legend.Add();chart.Title.Text?=?reportTitle;//設(shè)置圖表的名稱(chēng)//chart.SetPosition(200,?50);//設(shè)置圖表位置chart.SetSize(800,?400);//設(shè)置圖表大小chart.ShowHiddenData?=?true;//chart.YAxis.MinorUnit?=?1;chart.XAxis.MinorUnit?=?1;//設(shè)置X軸的最小刻度//chart.DataLabel.ShowCategory?=?true;chart.DataLabel.ShowPercent?=?true;//顯示百分比//設(shè)置月份for?(int?col?=?1;?col?<=?dataPercent.Columns.Count;?col++){worksheet.Cells[1,?col].Value?=?dataPercent.Columns[col?-?1].ColumnName;}//設(shè)置數(shù)據(jù)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%";//設(shè)置數(shù)據(jù)的格式為百分比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()方法所需參數(shù)為:chart.Series.Add(X軸數(shù)據(jù)區(qū),Y軸數(shù)據(jù)區(qū))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];//設(shè)置每條線(xiàn)的名稱(chēng)}//因?yàn)榧俣考夜局辽偻瓿闪?0%以上,所以這里設(shè)置Y軸的最小刻度為80%,這樣使圖表上的折線(xiàn)更清晰chart.YAxis.MinValue?=?0.8d;//chart.SetPosition(200,?50);//可以通過(guò)制定左上角坐標(biāo)來(lái)設(shè)置圖表位置//通過(guò)指定圖表左上角所在的行和列及對(duì)應(yīng)偏移來(lái)指定圖表位置//這里CommpanyNames.Length?+?1及3分別表示行和列chart.SetPosition(CommpanyNames.Length?+?1,?10,?3,?20);#endregion?researchpackage.Save();//保存文件}}///?<summary>///?生成數(shù)據(jù),由于這一步不是主要邏輯,所以采用隨機(jī)生成數(shù)據(jù)的方式,實(shí)際中可根據(jù)需要從數(shù)據(jù)庫(kù)或其它數(shù)據(jù)源中讀取需要的數(shù)據(jù)///?</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)));}//每個(gè)公司每月的百分比表示完成的業(yè)績(jī)與計(jì)劃的百分比f(wàn)or?(int?i?=?0;?i?<?CommpanyNames.Length;?i++){row?=?data.NewRow();row[0]?=?CommpanyNames[i];for?(int?j?=?1;?j?<=?MonthNames.Length;?j++){//這里采用了隨機(jī)生成數(shù)據(jù),但假定每家公司至少完成了計(jì)劃的85%以上row[j]?=?0.85d?+?random.Next(0,?15)?/?100d;}data.Rows.Add(row);}return?data;}} }最終生成的Excel文件內(nèi)容如下:
周公(周金橋)
2013年11月4日凌晨于武漢
更多資訊,請(qǐng)關(guān)注本人微信訂閱號(hào):
總結(jié)
以上是生活随笔為你收集整理的在.NET中不安装Office使用EPPlus生成带图表(Chart)的Excel报表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pmp考试中容易混淆的22组概念
- 下一篇: [实验]自举?只不过是电容和二极管捣的乱