zoukankan      html  css  js  c++  java
  • 使用Epplus生成Excel 图表

    1.  前言

      这是我最近项目刚要的需求,然后在网上找了半天的教材  但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的完成了公司的要求,最后我 稍微的优化了一下代码(毕竟是个刚工作一年多的新人),现在就给大家看一看不足之处,希望给为大佬给以指点,稍后在后面我会给出项目下载。

    //首页执行   
    DataTable dt = DBhelper.gettable();
                List<RangeData> rlist=new List<RangeData>();
                RangeData rd = new RangeData();
                rd.Charttype = "ColumnStacked";
                rd.Yaxis = "E6,G6,O6";
                rd.UserName = "测试名称";
                rd.Region = "测试地址";
                rd.ChartName = "测试名称";
                rd.ChartKeyword = "F36";
                rd.Appointedtime = DateTime.Now.ToString();
                rlist.Add(rd);
                RangeData rd1 = new RangeData();
                rd1.Charttype = "ColumnClustered";
                rd1.Yaxis = "E6,G6,O6";
                rd1.UserName = "测试名称1";
                rd1.Region = "测试地址1";
                rd1.ChartName = "测试名称1";
                rd1.ChartKeyword = "F36";
                rd1.Appointedtime = DateTime.Now.ToString();
                rlist.Add(rd1);
                RangeData rd2 = new RangeData();
                rd2.Charttype = "Pie";
                rd2.Yaxis = "E6,G6,O6";
                rd2.UserName = "测试名称2";
                rd2.Region = "测试地址2";
                rd2.ChartName = "测试名称2";
                rd2.ChartKeyword = "F36";
                rd2.Appointedtime = DateTime.Now.ToString();
                rlist.Add(rd2);
                RangeData rd3 = new RangeData();
                rd3.Charttype = "singleColumnClustered";
                rd3.Yaxis = "E6,G6,O6";
                rd3.UserName = "测试名称23";
                rd3.Region = "测试地址23";
                rd3.ChartName = "测试名称3";
                rd3.ChartKeyword = "F36";
                rd3.Appointedtime = DateTime.Now.ToString();
                rlist.Add(rd3);
                ExcelInfo.ExportClient("", dt, rlist);

    public class ExcelInfo
    {


         /// <summary> /// 输出Excel文件 /// </summary> /// <param name="FileName"></param> /// <param name="table"></param> /// <param name="?"></param> public static void ExportClient(string FileName, DataTable table, List<RangeData> Rlist) { //reportTitle = "Microsoft,IBM,Oracle,Google.Yahoo"; FileName = FileName+DateTime.Now.ToString("yyyy_MM_dd_HHmmss") + ".xlsx"; // string TJcell = "D6,F6,H6,AJ6"; if (Directory.Exists("UpFiles")) { } else { DirectoryInfo directoryInfo = new DirectoryInfo("UpFiles"); directoryInfo.Create(); } FileInfo file = new FileInfo(@"D:文档资料自学项目EpplusExcelChartWebEpplusExcelChartWebupfiles" + FileName); createExcel(file, table, Rlist); } /// <summary> /// 创建Excel Sheet /// </summary> /// <param name="file"></param> public static void createExcel(FileInfo file, DataTable table, List<RangeData> Rlist) { ExcelPackage package = new ExcelPackage(new FileStream(@"D:文档资料自学项目EpplusExcelChartWebEpplusExcelChartWeb est1.xlsx", FileMode.Open)); ExcelWorksheet sheet = null; sheet = package.Workbook.Worksheets[1]; #region 设置Excel数据 SheetData(table, sheet); #endregion //设置图形 if (Rlist.Count > 0) { ExcelWorksheet sheet1 = null; sheet1 = package.Workbook.Worksheets.Add("Data"); for (int i = 0; i < Rlist.Count; i++) { SheetData(table, sheet1); sheet.Cells["C3"].Value = Rlist[i].UserName; sheet.Cells["C4"].Value = Rlist[i].Region; sheet.Cells["O4"].Value = Rlist[i].Appointedtime; if (Rlist[i].Charttype == "ColumnStacked") { //堆积柱形图 ColumnStacked(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName,Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "ColumnClustered") { //簇状柱形图 ColumnClustered(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "Pie") { //饼图 Pie(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } else if (Rlist[i].Charttype == "singleColumnClustered") { singleColumnClustered(table, sheet, Rlist[i].Yaxis, Rlist[i].ChartName, Rlist[i].ChartKeyword); } } } else { System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert('没有数据')</script>"); } package.SaveAs(file);//保存文件 } //工作簿数据 private static void SheetData(DataTable table, ExcelWorksheet sheet) { //if (cols[0] != "") //{ // //设置列标题 // for (int col = 1; col <= cols.Length; col++) // { // sheet.Cells[1, col].Value = cols[col - 1]; // } //} //else //{ //设置列标题 //for (int col = 1; col <= table.Columns.Count; col++) //{ // sheet.Cells[1, col].Value = table.Columns[col - 1].ColumnName; //} //} //设置数据 for (int row = 0; row < table.Rows.Count; row++) { for (int col = 0; col < table.Columns.Count; col++) { string range = sheet.MergedCells[row + 7, col + 2]; string strvalue = table.Rows[row][col].ToString(); // sheet.Cells[row + 1, col].Style.Numberformat.Format = "#0\.00%";//设置数据的格式为百分比 if (table.Rows[row]["F36"].ToString() != "") { sheet.Cells[row + 7, col + 2].Style.Fill.PatternType = ExcelFillStyle.Solid; sheet.Cells[row + 7, col + 2].Style.Fill.BackgroundColor.SetColor(Color.Gray); sheet.Cells[row + 7, col + 2].Value = strvalue; } sheet.Cells[row + 7, col + 2].Value = strvalue; } } } /// <summary> /// 堆积柱形图 /// </summary> private static void ColumnStacked(DataTable table,ExcelWorksheet sheet, string TJCell,string Chartname,string ChartKeyword) { ////图表系列 ExcelChartSerie chartSerie = null; //图表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnStacked); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//设置图表大小 chart.ShowHiddenData = true; #region 规定单元格生成图表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//设置每条线的名称 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36"); chart.SetPosition(table.Rows.Count + 7, 10, 1, 20);//设置图表位置 } /// <summary> /// 多条簇状柱形图 /// </summary> private static void ColumnClustered(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////图表系列 ExcelChartSerie chartSerie = null; //图表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnClustered); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//设置图表大小 chart.ShowHiddenData = true; #region 规定单元格生成图表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//设置每条线的名称 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36");
           chart.YAxis.MinorTickMark = eAxisTickMark.None;
                chart.XAxis.MinorTickMark = eAxisTickMark.None;//修改刻度线

           chart.YAxis.MinorTickMark = eAxisTickMark.None;
                chart.XAxis.MinorTickMark = eAxisTickMark.None;//修改刻度线

    chart.SetPosition(table.Rows.Count + 7, 10, 10, 20);//设置图表位置 } /// <summary> ///饼图 /// </summary> private static void Pie(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////图表系列 ExcelChartSerie chartSerie = null; //图表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.Pie); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//设置图表大小 chart.ShowHiddenData = true; #region 规定单元格生成图表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//设置每条线的名称 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36");

            chart.YAxis.MinorTickMark = eAxisTickMark.None;
                chart.XAxis.MinorTickMark = eAxisTickMark.None;//修改刻度线

    chart.SetPosition(table.Rows.Count + 7+25, 10, 1, 20);//设置图表位置 } /// <summary> /// 单条簇状柱形图 /// </summary> private static void singleColumnClustered(DataTable table, ExcelWorksheet sheet, string TJCell, string Chartname, string ChartKeyword) { ////图表系列 ExcelChartSerie chartSerie = null; //图表 ExcelChart chart = null; chart = sheet.Drawings.AddChart(Chartname, eChartType.ColumnClustered); chart.Legend.Position = eLegendPosition.Right; chart.Legend.Add(); chart.SetSize(500, 400);//设置图表大小 chart.ShowHiddenData = true; #region 规定单元格生成图表 string[] TJcellarray = TJCell.Split(','); string XAxis = string.Empty; string YAxis = string.Empty; for (int row = 1; row <= table.Rows.Count; row++) { if (table.Rows[row - 1][ChartKeyword].ToString() != "") { for (int j = 0; j < TJcellarray.Length; j++) { XAxis += "Data!" + GetEXcelstr(TJcellarray[j]) + (row + 6) + ","; YAxis += "test!" + TJcellarray[j] + ","; } int Xlength = XAxis.Length; int Ylength = YAxis.Length; XAxis = XAxis.Substring(0, Xlength - 1); YAxis = YAxis.Substring(0, Ylength - 1); chartSerie = chart.Series.Add(XAxis, YAxis); chartSerie.HeaderAddress = sheet.Cells[row + 6, 2];//设置每条线的名称 XAxis = ""; YAxis = ""; } } #endregion // chartSerie = ChartData(table, cell, sheet, chartSerie, chart, TJcell,"F36");
           chart.YAxis.MinorTickMark = eAxisTickMark.None;
                chart.XAxis.MinorTickMark = eAxisTickMark.None;//修改刻度线

    chart.SetPosition(table.Rows.Count + 7 + 25, 10, 10, 20);//设置图表位置 } /// <summary> /// 提取字符串 /// </summary> /// <param name="p_str"></param> /// <returns></returns> public static string GetEXcelstr(string p_str) { string strReturn = string.Empty; if (p_str == null || p_str.Trim() == "") { strReturn = ""; } foreach (char chrTemp in p_str) { if (!Char.IsNumber(chrTemp)) { strReturn += chrTemp; } } return strReturn; }
    }
    //RangeData类
    
     public class RangeData  
        {
            /////  <param name="XStartCell">数据开始单元格</param>
            //public  string XStartCell { get; set; }
            //  ///   <param name="XEndCell">数据结束单元格</param>
            //public  string XEndCell { get; set; }
            //  ///    <param name="EduName">Y开始单元格</param>
            //public  string YStartCell { get; set; }
            //  ///     <param name="EduName">Y结束单元格</param>
            //public  string YEndCell { get; set; }
            //图表类型 1.ColumnStacked 堆积柱形图 2.ColumnClustered 多条簇状柱形图 3.Pie饼图4.singleColumnClustered 单条簇状图
            public string Charttype { get; set; }
            //指定Y轴分类标签
            public string Yaxis { get; set; }
            //用户名
            public string UserName { get; set; }
            //所在区域
            public string Region { get; set; }
            //指定时间
            public string Appointedtime { get; set; }
            //图表名称
            public string ChartName { get; set; }
            //制图关键字
            public string ChartKeyword { get; set; }
    
        }

     如果执行报错 可能是获取Excel文件地址的问题。

    下载地址https://files.cnblogs.com/files/Cjb8973/EpplusExcelChartWeb.rar

  • 相关阅读:
    使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North)
    揭秘换肤技术(转载)
    cdecl、stdcall、fastcall函数调用约定区别(转)
    Delphi XE的RTTI增强,动态Hook某些内部事件
    sizeof和strlen解析
    由swap引出的局部变量,形参和指针的小问题
    单链表的逆置算法
    关于C++中的虚拟继承的一些总结
    关于"引用"的几点说明
    求最长公共子序列(子序列在原串中可以不连续)
  • 原文地址:https://www.cnblogs.com/Cjb8973/p/7885914.html
Copyright © 2011-2022 走看看