在.NET中不安装Office使用EPPlus生成带图表(Chart)的Excel报表

/*
  ********************************************************************************
  *
  *    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;
         }
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Epplus 简介:Epplus是一个使用Open Office XML(Xlsx)文件格式,能读写Excel 2007/2010文件的开源组件 功效:支持对excel文档的汇入汇出,图表excel图表基本都可以实现)的列印 使用:首先应该下载Epplus的dll文件 1> 添加dll文件至工程bin文件 2>在程式添加引用 using OfficeOpenXml; using OfficeOpenXml.Drawing; using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.Style; 3>所有的操作语句需要放置在下面的using using (ExcelPackage package = new ExcelPackage()) { } 4.添加新的sheet var worksheet = package.Workbook.Worksheets.Add(“sheet1"); 5.单元格赋值,这里多说一句,NPOI必须先创建单元格,然后再给单元格赋值,而Epplus不需要,直接找到单元格进行赋值就可以了. worksheet.Cells[int row, int col].Value = “”; 或者 worksheet.Cells["A1"].Value = “”; 6.合并单元格 worksheet.Cells[int fromRow, fromCol, int toRow,int toCol].Merge = true; 7.获取某一个区域 var rangeData= worksheet.Cells[fromRow, fromCol, toRow, toCol]; 8.设置字体 worksheet.Cells.Style.Font.Name= “正楷”; worksheet.Cells.Style.Font.Color worksheet.Cells.Style.Font.Size 9.设置边框的属性 worksheet.Cells.Style.Border.Left.Style= ExcelBorderStyle.Thin ; worksheet.Cells.Style.Border.Right.Style= ExcelBorderStyle.Thin; worksheet.Cells.Style.Border.Top.Style= ExcelBorderStyle.Thin; worksheet.Cells.Style.Border.Bottom.Style= ExcelBorderStyle.Thin; 10.对齐方式 worksheet.Cells.Style.HorizontalAlignment=ExcelHorizontalAlignment.Center; worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Bottom; 11. 设置整个sheet的背景色 worksheet.Cells.Style.Fill.PatternType= ExcelFillStyle.Solid; worksheet.Cells.Style.Fill.BackgroundColor.SetColor(Color.LightBlue); 12.折行显示 worksheet.Cells.Style.WrapText= true; 13.单元格自动适应大小 worksheet.Cells.Style.ShrinkToFit= true; 14.格式化单元格value值 worksheet.Cells.Style.Numberformat.Format= "0.00"; 15.锁定 worksheet.Cells["A1"].Style.Locked= true; 注:此处锁定某一个单元格的时候,只有在整个sheet被锁定的情况下才可以被锁定,不然加上锁定属性也是不起作用的~~ 二.Epplus另一个出色的地方就是支持图表的列印.功能的實現很簡單,難點在于需求比較細的點上,epplus可能不好實現,但是總的來說是比較好的一個列印圖表的工具 1.简单介绍一下可以实现的图表类型: 直條圖、折綫圖、圓形圖、橫條圖、散佈圖、區域圖 等類型的圖表 2.使用:分为三步, 第一步是将需要显示在图表的 数据列印到excel. 第二步是创建所需要的图表类型(折线图为例) var chart = (worksheet.Drawings.AddChart("LineChart", eChartType.Line) as ExcelLineChart); 第三步为图表添加第一步列印的数据区间就可以了 chart.Series.Add(Y軸顯示的數據源,X軸顯示的數據源) 3.图表的功能就这样实现了,很简单吧

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值