使用Epplus生成Excel 图表

1 篇文章 0 订阅
1 篇文章 0 订阅

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:\文档资料\自学项目\EpplusExcelChartWeb\EpplusExcelChartWeb\upfiles\" + 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:\文档资料\自学项目\EpplusExcelChartWeb\EpplusExcelChartWeb\test1.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.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.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.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


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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.图表的功能就这样实现了,很简单吧
很高兴为您解答这个".net mvc epplus导出excel添加图表"的问题。首先,您需要使用EPPlus导出Excel文件,并添加一个图表。您可以按照以下步骤进行操作: 1. 创建一个ExcelPackage对象,将数据添加到工作表中。 2. 创建一个Chart对象,并将其添加到工作表中。 3. 设置图表类型以及图表的数据范围。 4. 将图表添加到单元格中,并设置图表的位置和大小。 下面是一份ASP.NET MVC中使用EPPlus添加图表的示例代码: ``` public ActionResult ExportExcel() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; ExcelPackage pck = new ExcelPackage(); var ws = pck.Workbook.Worksheets.Add("Sample"); // Add some data ws.Cells["A1"].Value = "Sample Excel With Chart"; ws.Cells["A2"].Value = "Hello"; ws.Cells["B2"].Value = "World!"; ws.Cells["A3"].Value = 100; ws.Cells["B3"].Value = 200; // Create the chart var chart = ws.Drawings.AddChart("Chart", eChartType.Line); chart.SetPosition(1, 0, 4, 0); chart.SetSize(600, 400); var series = chart.Series.Add("B3:B4", "A3:A4"); chart.Title.Text = "Sample Chart"; chart.Legend.Remove(); // Stream the Excel package to the client MemoryStream stream = new MemoryStream(); pck.SaveAs(stream); string fileName = "SampleExcelWithChart.xlsx"; string mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; return File(stream.ToArray(), mimeType, fileName); } ``` 在这个示例代码中,我们创建了一个名为"Sample"的工作表,并在它的A1、A2、B2、A3和B3单元格中添加了一些数据。接下来,我们创建了一个Line类型的图表,并将其添加到工作表中。我们使用SetPosition和SetSize方法设置图表在工作表中的位置和大小。接着,我们添加了一个数据系列到图表中,并设置了它的标题和图例。最后,我们将Excel文件以流的形式返回给客户端。 感谢您对ChitGPT的提问,希望我的回答能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值