在.NET中不安裝Office使用EPPlus生成帶圖表(Chart)的Excel報表

在開發.NET應用中可能會遇到需要生成帶圖表(Chart)的Excel報表的需求,特別是在一些ASP.NET網站中,有時候我們并不能保證Web服務器上一定安裝了Office組件,所以使用微軟的Office來生成Excel并不保證在所有情況下都使用,有時候即使Web服務器上安裝了Office也會出現一些運行權限方面的原因到導致調用Excel組件生成Excel失敗,所以在這里介紹一種無需安裝Office并且無需較高權限就能生成Excel的方法。

EPPlus簡介

  在介紹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,非常方便部署。

代碼示例

  為了演示EPPlus的用法,這里寫了一個簡單的例子,在這個例子里演示模擬了幾大公司實際業績與計劃業績的百分比,如果這個百分比大于95%則會將所在的單元格顯示為綠色,如果小于90%則會顯示為紅色,否則就顯示為黃色,并且還會生成一個圖標來直觀表示每月實際完成情況與計劃的百分比。

  完整代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
?********************************************************************************
?*
?*????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文件內容如下:

005741664.jpg























本文轉自周金橋51CTO博客,原文鏈接:http://blog.51cto.com/zhoufoxcn/1319741?,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279805.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

facebook 邀請好友_如何在Facebook上與某人解除好友

facebook 邀請好友It’s very easy for your Facebook News Feed to get cluttered. After a few years adding ukulele playing magicians you meet wandering the street and the bar staff at every bar you go to regularly, it gets overrun with people you’ll never se…

mac下npm/node的安裝和卸載、升級;node、npm升級后最后刪掉node_modules重新安裝

mac還是使用brew install簡單一些&#xff1b;最好使用一種安裝方式&#xff0c;不要多種方式互用&#xff1b; 更新npm到最新版本npm install -g npm更新npm到指定版本 npm -g install npm2.9.1指定安裝目錄npm install --prefix /usr/local -g npm 1、從官網https://nodejs.o…

軟件工程小組第三次正式會議

會議主題&#xff1a;主要確定數據庫具體內容與會時間&#xff1a;3月29日與會地點&#xff1a;圖書館小組研究室雨水612與會成員&#xff1a;尚卓燃、張世豪、王昊鈺、傅宇豪會議記錄&#xff1a; 小組成員一起討論數據庫&#xff0c;確定了數據庫中的實體、屬性、聯系&#…

Edison的2022年終總結

大家好&#xff0c;我是Edison。2022年即將結束&#xff0c;又到了做年終總結的時候&#xff0c;它是我每年的一個習慣&#xff0c;意味著又要開始新的征途&#xff0c;在開始新的征途之前回顧一下很有必要。艱難抉擇&#xff1a;從互聯網到制造業今年最大的變化就是又換了份工…

JNI

配置NDK&#xff0c;調用JNI最終會生成一個so庫&#xff0c;如果so庫生成了。直接在項目中使用so庫即可調用本地方法。注意&#xff1a;api的包名要與so庫定義的包名一致。 1什么是jni jni java native interface java本地開發接口&#xff0c;是JAVA和C互相調用的橋梁。 2jni有…

dvd vlc 復制_如何使用VLC翻錄DVD

dvd vlc 復制There are many ways to rip a DVD to your computer, but if you’re looking for the most straightforward option, VLC is easy and free. Besides, you probably already have VLC on your computer (and if you don’t, you should). Here, we’ll show you …

新年芯事 | 龍芯物聯網主控芯片龍芯1C102和龍芯1C103流片成功

前言近期&#xff0c;龍芯中科面向物聯網領域研制的主控芯片--龍芯1C102和龍芯1C103流片成功&#xff0c;兩款微控制器芯片各項功能測試正常&#xff0c;符合設計預期。 龍芯1C102主要面向智能家居以及其他物聯網設備詳細介紹龍芯1C102采用龍芯LA132處理器核心&#xff0c;是一…

Javascript基礎學習20問(二)

1.函數&#xff08;方法&#xff09;&#xff1a;封裝執行一項專門任務的步驟的代碼序列--》重用2.參數&#xff1a;方法內獨有的變量&#xff0c;接受傳入數據&#xff0c;在方法中處理3.作用域&#xff1a;一個變量的可用范圍 全局作用域&#xff1a;全局變量 局部作用…

Thrift第三課 編寫腳本

警告 盡量使用tutorial下面的模板&#xff0c;注意腳本的格式&#xff0c;否則生成錯誤 使用thrift-0.9.0生成C/csharp代碼 使用的指令如下: thrift-0.9.0.exe --gen cpp thriftcom.thrift thrift-0.9.0.exe --gen csharp thriftcom.thrift 1 注釋 有如下的三種方式 1&#xff…

【加更】搭建基于chatgpt的釘釘聊天機器人

應某些小伙伴的加更請求&#xff0c;出一期基于釘釘上的聊天機器人&#xff0c;我順便加更一期&#xff0c;搭建一個釘釘聊天機器人的小教程。首先進入到釘釘開放平臺的后臺管理系統&#xff1a;https://open.dingtalk.com/進入到 應用開發->企業內部開發->機器人右上角選…

word中 有注釋標簽嗎_如何在Word中注釋圖像

word中 有注釋標簽嗎If you’re writing a document that includes images, you may want to add annotations to those images to clarify what they represent. You can add callouts to your images to point out particular parts of the image and add text to describe t…

Lang.String

StringBuilder 原文&#xff1a; public final class StringBuilder extends Object implements Serializable, CharSequence A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This c…

牛客網暑期ACM多校訓練營(第二場)J farm (二維樹狀數組)

題目鏈接&#xff1a; https://www.nowcoder.com/acm/contest/140/J 思路&#xff1a; 都寫在代碼注釋里了&#xff0c;非常好懂。。 for_each函數可以去看一下&#xff0c;遍歷起vector數組比較方便&#xff0c;用for(int i 0;i < q[i].size();i)的話&#xff0c;是會有一…

微軟IE 9 Beta全程體驗圖集

微軟剛剛更新了IE 9 Beta的新頁面&#xff0c;此次發布的Beta版本一共有27個國家的語言&#xff0c;其中也包括了簡體中文和香港和臺灣的繁體中文版。 點擊此處進入下載頁面&#xff1a; http://windows.microsoft.com/zh-CN/internet-explorer/download/ie-9/worldwide IE9的熱…

.net core中Quartz的使用方法

我們在日常開發中&#xff0c;總會遇到這樣的需求&#xff1a;每隔一段時間&#xff0c;執行一次某個任務。固定某個時間執行任務&#xff0c;例如凌晨12點對當天的數據進行統計。每個月的第幾天&#xff0c;執行某個任務。Quartz.Net是根據Java的Quartz用C#改寫而來&#xff0…

AspectJ學習筆記

介紹 AspectJ是一個基于Java語言的AOP框架Spring2.0以后新增了對AspectJ切點表達支持AspectJ是AspectJ1.5新增功能&#xff0c;通過JDK5注解技術&#xff0c;允許Bean類中定義切面&#xff0c;新版本Spring框架&#xff0c;建議使用AspectJ方式來開發AOP主要用途&#xff1a;自…

windows10訪客_如何在Windows 10中創建訪客帳戶

windows10訪客If you find that your guests are asking fairly often to use your computer temporarily to check their email or look something up on the web, you don’t have to let them use your personal account or create a special account for each guest. 如果發…

C#使用 System.Net.Mail發送郵件功能

介紹System.Net.Mail命名空間是在.NET Framework中新增的&#xff0c;該命名空間提供了發送電子郵件的功能。通過對本章的學習&#xff0c;讀者可以輕松地使用.NET Framework提供的類庫來發送電子郵件。System.Net.Mail 命名空間包含用于將電子郵件發送到SMTP服務器的類&#x…

初識smarty

個人體會(不完全正確)&#xff1a;就是smarty就是為了更好的使得php/html結合做出來的一個框架。 , 轉載于:https://www.cnblogs.com/nul1/p/9357694.html

幾個有趣的算法題目

本文首發 http://svtter.cn最接近的數字 題目 一個K位的數N $$ (K\leq2000&#xff0c;N\leq10^{20}) $$ 找出一個比N大且最接近的數&#xff0c;這個數的每位之和與N相同&#xff0c;用代碼實現之。 例如&#xff1a;0050 所求書數字為0104&#xff1b;112 所求數為121&#x…