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.mzph.cn/news/736450.shtml

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

相关文章

LLM Saturation与多模态AI的崛起

LLM Saturation与多模态AI的崛起 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在语言理解和生成能力上取得了显著进步&#xff0c;如GPT-4和LLaMA-2等。然而&#xff0c;我们可能正接近LLM范式的极限。本文探讨LLM性能天花板、局限性&#xff0c;以及多模态AI为…

SQL 多表查询

文章目录 多表查询的分类等值连接非等值连接自连接非自连接内连接外连接左外连接右外连接满外连接 SQL连接 JOINSQL99 语法新特性 自然连接 NATURAL JOIN & USING 多表查询的分类 等值连接 VS 非等值连接自连接 VS 非自连接内连接 VS 外连接 等值连接 关联的表有连接字段…

【c语言 】 函数入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Java常见数据结构“ 栈与队列 ”学完就去编程!!!

一、栈&#xff08;Stack&#xff09;&#xff1a; 栈是一种后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的数据结构&#xff0c;类似于现实生活中的一叠盘子&#xff0c;最后放入的盘子最先被取出。 主要方法和特点&#xff1a; push(E e): 将元素推…

突破编程_C++_设计模式(模板方法模式)

1 模板方法模式的基本概念 C 模板方法模式是一种行为设计模式&#xff0c;它在一个操作中定义算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。在C中&#xff0c;模板方法模式通常通过使用虚函数和…

MySQl基础入门⑦

上一章知识内容 分析数据且区分数据类型 看下表分析数据的特征&#xff0c;根据其特征确定相应的数据类型。 分析以上表格特征&#xff0c;确定数据类型&#xff0c;并对数据进行分类。分析数据后按固定长度字符串、可变长度字符串、整数、固定精度小数和日期时间数据类型对数…

【树】-Lc101-对称二叉树(一棵树是否是另一棵树的子树的变形)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 对称二叉树。给给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

keepalived原理以及lvs、nginx跟keeplived的运用

keepalived基础 keepalived的原理是根据vrrp协议&#xff08;主备模式&#xff09;去设定的 vrrp技术相关原理 状态机&#xff1b; 优先级0~255 心跳线1秒 vrrp工作模式 双主双备模式 VRRP负载分担过程 vrrp安全认证&#xff1a;使用共享密匙 keepalived工具介绍 keepal…

Qt 绘制中的视口(setViewport)和窗口(setWindow)

重点 &#xff1a; 1.绘制&#xff08;QPainter&#xff09;可以设置视口&#xff0c;视口下设置窗口&#xff0c;而绘制的构件是以窗口为坐标系进行绘画。 2.先根据绘图设备的物理坐标系的矩形位置&#xff0c;设置视图视口setViewport&#xff0c;然后在以视口为区域去设置…

【Leetcode刷题】1360. 日期之间隔几天

1360. 日期之间隔几天 简单 请你编写一个程序来计算两个日期之间隔了多少天。 日期以字符串形式给出&#xff0c;格式为 YYYY-MM-DD&#xff0c;如示例所示。 示例 1&#xff1a; 输入&#xff1a;date1 “2019-06-29”, date2 “2019-06-30” 输出&#xff1a;1 示例 2…

博客杂谈---程序员如何选择职业赛道?

程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; &#xff08;1&#xff09;考虑因素 话题虽然指…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段&#xff0c;那应该是sql注入&#xff0c;先试试 试了一些发现会被检查到&#xff0c;随便传数字 除了1和2有返回结果&#xff0c;其余的都报错&#xff0c;应该是数字型注入&#xff0c;抓包看看过滤了哪些 这个…

在DeepLn环境中安装VLLM与ChatGLM3

DeepLn | 智慧算力触手可及是一个挺便宜的算力租用平台&#xff0c;里面有大量的显卡可以租用。唯一美中不足的是&#xff0c;提供的pytorch版本低&#xff0c;只支持到2.01&#xff0c;为了匹配vllm&#xff0c;需要手动安装指定版本的pytorch。 vllm介绍 总体而言&#xff0…

如何关闭vscode灰色代码提示

vscode编辑rust代码时&#xff0c;rust-analyze插件会默认给代码添加一些提示&#xff08;灰色代码&#xff09;&#xff0c;这部分代码 不会保存到文件&#xff0c;仅仅是为了你方便看各种变量的定义等。 但有时会觉得代码很乱&#xff0c;所以按以下方法可以把他隐藏。 1&am…

接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天&#xff01;&#xff01; ———————————————————————————— 学习笔记 接收端 recvfrom #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, si…

JVM(Java虚拟机)概述

1. JVM的定义和作用 JVM&#xff08;Java Virtual Machine&#xff09;是一个能够运行Java字节码的虚拟计算机。它是Java平台的核心组成部分&#xff0c;负责执行编译后的Java程序&#xff0c;提供跨平台运行的能力。JVM使得Java程序可以在任何安装了JVM的操作系统上运行&#…

【50天50个项目】旋转导航页面

实现效果&#xff1a; HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet&…

asp飞机订票-57-(说明+代码)

演示查看 http://pc.3q2008.Com/3q2008_Com/hkdp 目 录 1&#xff0e; 系统规划 3 1&#xff0e;1 行业背景 3 1&#xff0e;2 行业现状 3 1.2.1用户注册 3 1.2.2航班查询 3 1.2.3在线订票 3 1.2.4在线支付 3 1.2.5电子客票 4 1.2.6其它辅助产品与服务 4 1&#xff0e;3 需求…

[Mac软件]Adobe Illustrator 2024 28.3 intel/M1/M2/M3矢量图制作软件

应用介绍 Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。 绘制任意大小的标志 拥…