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


相关文章
|
9月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
1360 3
|
9月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
7月前
|
人工智能 自然语言处理 数据可视化
别再用Excel死磕了!阿里云QBI+DataV才是政企报表的正确打开方式
阿里云Quick BI与DataV联合打造数据智能解决方案,覆盖数据分析、可视化及数字孪生全链路。QBI以智能分析驱动决策,DataV提供低代码可视化与三维孪生能力,助力政企高效实现数据驱动创新。
692 0
|
监控 Linux
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
707 13
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
|
人工智能 数据可视化 前端开发
Probly:开源 AI Excel表格工具,交互式生成数据分析结果与可视化图表
Probly 是一款结合电子表格功能与 Python 数据分析能力的 AI 工具,支持在浏览器中运行 Python 代码,提供交互式电子表格、数据可视化和智能分析建议,适合需要强大数据分析功能又希望操作简便的用户。
1635 2
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
661 6
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
数据挖掘 数据处理 Python
python如何高效处理excel图表案例分享
python如何高效处理excel图表案例分享
441 2
|
自然语言处理 搜索推荐 程序员
【Python】如何使用pip,安装第三方库和生成二维码、操作Excel
【Python】如何使用pip,安装第三方库和生成二维码、操作Excel
416 0

热门文章

最新文章