在.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.mzph.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…