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


相关文章
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
70 6
|
3月前
|
数据挖掘 数据处理 Python
python如何高效处理excel图表案例分享
python如何高效处理excel图表案例分享
53 2
5-22|pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Office Excel', 'Excel 无法打开文件“
5-22|pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Office Excel', 'Excel 无法打开文件“
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
307 0
|
4月前
|
开发框架 .NET API
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
138 0
|
4月前
Excel 进度图表制作
Excel 进度图表制作
47 0
|
5月前
|
存储 对象存储 Python
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
|
7月前
|
数据可视化
Excel实例:Excel图表可视化:条形图、折线图、散点图和步骤图
Excel实例:Excel图表可视化:条形图、折线图、散点图和步骤图
|
7月前
为Excel操碎了心 | 图表篇
为Excel操碎了心 | 图表篇
54 0
|
7月前
|
Windows
0基础安装激活版本office2016
0基础安装激活版本office2016