Excel生成 chart 混合图表

在开发中有这样一个需求,邮件预警的时候,要求邮件主体内容是一个Chart 图表(生成后的img),邮件需要有附件,且附件是Excel列表加图表,图表类型是混合图。
回顾:在之前一篇讲到如何使用 EPPlus创建excel 、批量填充、设置套用表格格式、创建chart 图表、设置chart 图表主题。
优点处理简单,生成速度快,批量填充很好用、灵活设置表格样式,自动填充数据和数据格式,对于单一生成excel 表格很友好,唯一不足的地方是chart 图表只能设置单一图表类型,不能设置混合图表,不能把Excel chart 图表读取出来生成img 图片。

回到需求,要实习的功能
一、图表创建、批量填充 、套用表格格式
二、在创建的Excel里面创建 chart 混合图表,设置双Y轴
三、读取 Excel里面的图表,把图表生成img 图片
四、Excel 附件和图片不做本地保存直接通过邮件发送出去

在这里插入图片描述

代码:

using Spire.Xls;
using Spire.Xls.Charts;
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
using System.Data;
using System.IO;
using System.Net.Mail;
using System.Net;namespace ConsoleApp3
{class Program{static void Main(string[] args){if (false){Main3();return;}//创建一个Workbook类实例,加载Excel文档Workbook workbook = new Workbook();workbook.LoadFromFile(@"C:\Users\XXXXXXXXXXXX\bin\Debug\Line.xlsx");//获取第一个工作表Worksheet sheet = workbook.Worksheets[0];//设置工作表的名称sheet.Name = "柱状图";sheet.GridLinesVisible = false;//创建柱状图Chart chart = sheet.Charts.Add(ExcelChartType.ColumnClustered);//指定用于生成图表的数据区域chart.DataRange = sheet.Range["A2:E4"];chart.SeriesDataFromRange = false;//指定图表所在的位置chart.LeftColumn = 1;chart.TopRow = 9;chart.RightColumn = 12;chart.BottomRow = 26;//设置图表的名称及字体格式chart.ChartTitle = "上半年产品销售情况(单位:万美元)";chart.ChartTitleArea.IsBold = true;chart.ChartTitleArea.Size = 12;//设置X轴坐标名称及字体格式chart.PrimaryCategoryAxis.Title = "产品类别";chart.PrimaryCategoryAxis.Font.IsBold = true;chart.PrimaryCategoryAxis.TitleArea.IsBold = false;//设置Y轴坐标名称及字体格式chart.PrimaryValueAxis.Title = "销售额";chart.PrimaryValueAxis.HasMajorGridLines = false;chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90;chart.PrimaryValueAxis.MinValue = 0.5;chart.PrimaryValueAxis.TitleArea.IsBold = false;//设置图例的位置chart.Legend.Position = LegendPositionType.Right;//保存文档workbook.SaveToFile("ColumnChart.xlsx", ExcelVersion.Version2013);//加载生成图表后的Excel文档workbook.LoadFromFile("ColumnChart.xlsx");//遍历工作簿,诊断是否包含图表Image[] images = workbook.SaveChartAsImage(sheet);for (int i = 0; i < images.Length; i++){//将图表保存为图片images[i].Save(string.Format("img-{0}.png", i), ImageFormat.Png);}}public static void Main2(){// 创建Workbook对象Workbook workbook = new Workbook();// 获取第一个工作表Worksheet sheet = workbook.Worksheets[0];// 创建一个DataTable并填充数据DataTable table = new DataTable();table.Columns.Add("Category", typeof(string));table.Columns.Add("Value1", typeof(int));table.Columns.Add("Value2", typeof(int));table.Columns.Add("Value3", typeof(int));table.Columns.Add("Value4", typeof(int));table.Rows.Add("A", 7, 950, 680, 980);table.Rows.Add("B", 8, 500, 720, 1070);table.Rows.Add("C", 9, 900, 890, 1200);//Category	Value1	Value2	Value3	Value4// 将DataTable中的数据批量填充到Excel表格中sheet.InsertDataTable(table, true, 1, 1); 设置数据//sheet.Range["A1"].Text = "Category";//sheet.Range["A2"].Text = "A";//sheet.Range["A3"].Text = "B";//sheet.Range["A4"].Text = "C";//sheet.Range["B1"].Text = "Value1";//sheet.Range["B2"].NumberValue = 7;//sheet.Range["B3"].NumberValue = 8;//sheet.Range["B4"].NumberValue = 9;//sheet.Range["C1"].Text = "Value2";//sheet.Range["C2"].NumberValue = 950;//sheet.Range["C3"].NumberValue = 500;//sheet.Range["C4"].NumberValue = 900;//sheet.Range["D1"].Text = "Value3";//sheet.Range["D2"].NumberValue = 680;//sheet.Range["D3"].NumberValue = 720;//sheet.Range["D4"].NumberValue = 890;//sheet.Range["E1"].Text = "Value4";//sheet.Range["E2"].NumberValue = 980;//sheet.Range["E3"].NumberValue = 1070;//sheet.Range["E4"].NumberValue = 1200;// 添加柱状图Chart chart = sheet.Charts.Add(ExcelChartType.ColumnClustered);chart.DataRange = sheet.Range["B1:E4"];chart.SeriesDataFromRange = false;chart.TopRow = 7;chart.BottomRow = 28;chart.LeftColumn = 3;chart.RightColumn = 11;var cs1 = (ChartSerie)chart.Series[0];cs1.SerieType = ExcelChartType.ColumnClustered;var cs2 = (ChartSerie)chart.Series[1];cs2.SerieType = ExcelChartType.ColumnClustered;var cs3 = (ChartSerie)chart.Series[2];cs3.SerieType = ExcelChartType.Line;chart.SecondaryCategoryAxis.IsMaxCross = true;cs3.UsePrimaryAxis = false;// 保存Excel文件workbook.SaveToFile("Line.xlsx", ExcelVersion.Version2010);}public static void Main3(){Workbook workbook = new Workbook();Worksheet sheet = workbook.Worksheets[0];DataTable table = new DataTable();table.Columns.Add("Category", typeof(string));table.Columns.Add("Value1", typeof(int));table.Columns.Add("Value2", typeof(int));table.Columns.Add("Value3", typeof(int));table.Columns.Add("Value4", typeof(int));table.Rows.Add("A", 7, 950, 680, 980);table.Rows.Add("B", 8, 500, 720, 1070);table.Rows.Add("C", 9, 900, 890, 1200);// Category	Value1	Value2	Value3	Value4// 将DataTable中的数据批量填充到Excel表格中sheet.InsertDataTable(table, true, 1, 1);// 添加柱状图Chart chart = sheet.Charts.Add(ExcelChartType.ColumnClustered);chart.DataRange = sheet.Range["B1:E4"];chart.SeriesDataFromRange = false;chart.TopRow = 7;chart.BottomRow = 28;chart.LeftColumn = 3;chart.RightColumn = 11;var cs1 = (ChartSerie)chart.Series[0];cs1.SerieType = ExcelChartType.ColumnClustered;var cs2 = (ChartSerie)chart.Series[1];cs2.SerieType = ExcelChartType.ColumnClustered;var cs3 = (ChartSerie)chart.Series[2];cs3.SerieType = ExcelChartType.Line;chart.SecondaryCategoryAxis.IsMaxCross = true;cs3.UsePrimaryAxis = false;//保存Excel文件//workbook.SaveToFile("Line.xlsx", ExcelVersion.Version2010);workbook.Version = ExcelVersion.Version2013;//遍历工作簿,诊断是否包含图表Image[] images = workbook.SaveChartAsImage(sheet);/*for (int i = 0; i < images.Length; i++){//将图表保存为图片//images[i].Save(string.Format("img-{0}.png", i), ImageFormat.Png);string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string imagePath = Path.Combine(desktopPath, string.Format("img-{0}.png", i));images[i].Save(imagePath, ImageFormat.Png);}*/string[] base64Strings = new string[images.Length];for (int i = 0; i < images.Length; i++){using (MemoryStream ms = new MemoryStream()){images[i].Save(ms, ImageFormat.Png);byte[] imageBytes = ms.ToArray();base64Strings[i] = Convert.ToBase64String(imageBytes);}}// 创建 HTML 内容,将图片嵌入其中string htmlBody = "<html><body>";htmlBody += "<p>邮件正文</p>";htmlBody += string.Format("<img src='data:image/png;base64,{0}' />", base64Strings[0]);htmlBody += "</body></html>";// 发送邮件并包含 HTML 内容MailMessage mail = new MailMessage();mail.From = new MailAddress("qy.dan@.com.hk");mail.To.Add("qy.dan.com.hk");mail.Subject = "包含图片的邮件";mail.IsBodyHtml = true;mail.Body = htmlBody;SmtpClient smtp = new SmtpClient("XXX.XXX.105.69");smtp.DeliveryMethod = SmtpDeliveryMethod.Network;smtp.EnableSsl = false;smtp.Host = "XXX.XXX.105.69";smtp.Port = XXX;smtp.UseDefaultCredentials = true;smtp.Send(mail);}}
}

效果:
在这里插入图片描述
在这里插入图片描述

插件:
Spire.XLS 下载
Spire.XLS 文档
Spire.XLS
https://www.cnblogs.com/landeanfen/p/5888973.html
csdn:
Spire.XLS 系列教程1
Spire.XLS 系列教程2
Spire.XLS 系列教程3
Spire.XLS 系列教程4

扩展参考:
https://www.cnblogs.com/asxinyu/p/4374015.html
https://www.cnblogs.com/asxinyu/p/Bolg_Category_For_TotalAll.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537924.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm&#xff0c;可能会导致原本的idea失效&#xff0c;注册码过期 3、taobao的npm过期&#xff0c;导致npm is sass执行不成功&#xff0c;需…

【嵌入式——QT】QPainter基本绘图

【嵌入式——QT】QPainter基本绘图 QPainter与QPaintDevicepaintEvent事件和绘图区QPainter主要属性QPen主要功能QBrush主要功能QPainter绘制基本图形方法图示代码示例 QPainter与QPaintDevice QPainter是用来进行绘图操作的类&#xff0c;QPaintDevice是一个可以使用QPainter…

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多…

算法执行顺序(科拉多·伯姆,朱塞佩·贾可皮尼)

一.三大算法&#xff08;逻辑跳转&#xff09; 二.break 与 continue ---杨同学---

线程工具类与原子类

参考文档&#xff1a; CountDownLatch、CyclicBarrier、Semaphore的用法和区别juc15_基本AtomicInteger、数组、引用AtomicStampedReference、对象的属性修改原子类 AtomicIntegerFieldUp 、原子操作增强类LongAdder 辅助工具类 CountDownLatch(闭锁) 做减法 允许一个或多个…

西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)

前言 在学习到这部分时&#xff0c;对 ℓ-rank 以及AUC的关系难以理解透彻&#xff0c;在网上看到其他博主也并未弄明白&#xff0c;大家大多写自己的理解&#xff0c;我希望您在看完这篇文章时能够深刻理解这二者的关系&#xff0c;如果我的理解有误&#xff0c;希望您在评论…

Maven的基本使用

Maven的基本使用 一、为什么要使用Maven1.1 方便添加第三方Jar包1.2 方便获取第三方Jar包(中央仓库)1.3 解决了依赖问题1.4 解决了依赖冲突1.4 项目管理更清晰1.5 总结 二、Maven的下载三、配置Maven本地仓库和中央仓库3.1 Settings文件3.2 配置本地仓库3.3 配置中央仓库(镜像地…

已经连接过的网络的密码忘记了,怎么快速找回?

使用笔记本电脑曾经连接过一些无线路由器&#xff0c;时间久了&#xff0c;密码可能就忘记了。再使用其他设备连接时&#xff0c;就需要尝试去找到这个密码。本片文章就是通过几个命令快速找到之前使用笔记本电脑曾经连接过的无线网络的密码。 第一步、查看曾经连接过哪些无线网…

2024年将人力RPO项目当蓝海项目吗?

随着科技的快速发展和全球化趋势的加强&#xff0c;人力资源外包(RPO)项目在过去的几年中异军突起&#xff0c;成为企业优化人力资源配置、降低运营成本的重要手段。然而&#xff0c;到了2024年&#xff0c;我们是否还能将人力RPO项目视为一片尚待开发的蓝海呢? 从市场角度来看…

膝关节痛做什么锻炼好得快?这些运动对膝关节很“友好”!

膝关节不是身体中最常受伤的部位&#xff0c;却是最薄弱、要求最高的关节&#xff0c;原因是膝关节承受人的整个重量&#xff0c;而且由于活动范围大&#xff0c;极容易造成膝关节疼痛。 膝关节疼痛多发生于青年人&#xff0c;如田径、登山运动员&#xff0c;舞蹈演员等。发病率…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新&#xff0c;最新跟新时间3/11&#xff01;&#xff01;&#xff01; 格式一定要符合要求&#xff0c;&#xff08;输入&#xff0c;输出格式&#xff09;1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度&#xff08;最大...&a…

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…