在.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 ,如需转载请自行联系原作者


相关文章
|
6月前
|
关系型数据库 MySQL 数据库
找不到请求的 .Net Framework Data Provider。可能没有安装
做的一个项目,框架为.net framework 数据库为mysql 出现如标题错误 检查是否安装mysql、是否安装mysql connector net 笔者是因为没有安装后者mysql connector net 下载地址: [mysql connector net](https://downloads.mysql.com/archives/c-net/ "mysql connector net") 笔者安装截图如下: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/c
56 0
VS2005(excel2007)利用Automation(OLD Automation)方法。将Excel当成组件服务器的编译错误 我的系统盘和office都装在d盘。 自动生成的import有问题
VS2005(excel2007)利用Automation(OLD Automation)方法。将Excel当成组件服务器的编译错误 我的系统盘和office都装在d盘。 自动生成的import有问题
|
1月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
|
1月前
|
Web App开发 JavaScript 前端开发
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
现在,随着数字化进程渗透到到各行各业,数据安全已经成为了数字化革命中的重要组成部分,而在线Office成在OA、ERP、文档系统中得到了广泛的应用,为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和更新换代,加上国家对信息化、数字化系统要求的不断提升,一些厂家的WebOffice控件产品不断被淘汰出局,而现存的几个产品也存在以下几个问题:
411 1
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
|
2月前
|
安全 C# 开发者
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
|
3月前
|
监控 Ubuntu 安全
百度搜索:蓝易云【Ubuntu安装Net-tools和SSH】
请注意,这些命令假设您已经具有适当的网络连接,并具有sudo或root权限。根据您的具体环境和要求,可能需要进行其他配置和调整。确保在进行任何与网络和安全相关的操作之前,详细了解您的需求和网络环境,并采取适当的安全措施。
64 1
|
4月前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
50 0
|
5月前
|
Oracle 关系型数据库 Linux
在CentOS 7 下安装.Net 框架
在CentOS 7 下安装.Net 框架
72 0
|
6月前
|
Windows
Windows安装vSphere Client报错:错误28173,安装程序未能启用Microsoft.NET Framew..
Windows安装vSphere Client报错:错误28173,安装程序未能启用Microsoft.NET Framew..
|
17天前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
46 0