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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云数据库Redis配置用户名密码连接

一般情况&#xff0c;生产环境6379端口是禁止对外开放的&#xff0c; 所有用户名密码可以不设置。 但是如果有格鲁需求&#xff0c;需要开放redis公网访问&#xff0c;建议端口限制IP&#xff0c;并设置用户密码 spring中配置 阿里云数据库 云数据库 Redis_缓存数据库_高并…

数据分析可视化神器---streamlit框架,各种图表绘制,布局以及生产综合案例剖析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

如何应用TRIZ点亮产品新概念设计的火花?

在创新设计的领域里&#xff0c;TRIZ&#xff08;发明问题解决理论&#xff09;被誉为一把开启创新之门的金钥匙。它能够帮助设计师和工程师突破思维定式&#xff0c;找到前所未有的解决方案。那么&#xff0c;如何在产品的新概念设计阶段&#xff0c;利用TRIZ点亮创新的火花呢…

玩转 Spring 状态机:更优雅的实现订单状态流转

说起 Spring 状态机&#xff0c;大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢&#xff1f;没错&#xff0c;Spring 状态机就是状态模式的一种实现&#xff0c;在介绍 Spring 状态机之前&#xff0c;让我们来看看设计模式中的状态模式。 1. 状态模式 状态模式…

探秘知乎的排名算法:知乎撰写高质量内容的秘诀

知乎作为一个知识问答社区&#xff0c;用户众多、内容繁杂&#xff0c;那么究竟是什么样的原则决定了知乎上的排名呢&#xff1f;腾轩科技传媒探讨知乎排名的规则&#xff0c;并分享如何撰写高质量的文章。 知乎排名的算法 在知乎这个巨大的社交平台上&#xff0c;任何一个用户…

torch.backends.cudnn.benchmark 作用

相关参数 torch.backends.cudnn.enabled torch.backends.cudnn.benchmark torch.backends.cudnn.deterministictorch.backends.cudnn.benchmark True&#xff1a;将会让程序在开始时花费一点额外时间&#xff0c;为整个网络的每个卷积层搜索最适合它的卷积实现算法&#xff0c…

【SysBench】Linux 安装 sysbench-1.20

安装目的是为了对 MySQL 8.0.x 、PostgreSQL 进行基准测试。 1、二进制包安装 在 Linux 上下载和安装 sysbench 最简单的方法是使用 托管的二进制包存储库 packagecloud 。存储库是在每个 sysbench 版本上自动更新。目前为 x86_64、i386 和 aarch64 二进制文件可用。 RHEL/C…

深入理解指针——C语言

目录 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断言 8. 指针的使用和传址调用 9. 数组名的理解 10. 使用指针访问数组 11. 一维数组传参的本质 12. 冒泡排序 13. 二级指针 14. 指针数组 15. 指…

公司Logo设计可以打造独特品牌标识,彰显企业价值!

公司Logo作为企业品牌的核心标识&#xff0c;对于品牌形象和企业价值的传达起着至关重要的作用。然而&#xff0c;许多人在设计公司Logo时&#xff0c;往往忽略了设计背后的含义&#xff0c;导致Logo缺乏独特性和深度。本文将为你揭秘公司Logo设计及含义的重要性&#xff0c;并…

Android 学习之追踪应用的安装情况

先上结论&#xff0c;急用的话直接看结论 结论一、借助 API 读取安装信息&#xff0c;然后上报二、借助手动埋点&#xff0c;然后上报三、对比 前提过程 结论 一、借助 API 读取安装信息&#xff0c;然后上报 通过 PackageManager 的 API&#xff0c;我们可以得知自身应用安装…

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

Python docx学习笔记

个人学习笔记。 1 工具介绍 python-docx 是用于创建可修改 微软 Word 的一个 python 库&#xff0c;提供全套的 Word 操作&#xff0c;是最常用的 Word 工具。 1.1 基本概念 Document&#xff1a;是一个 Word 文档 对象&#xff0c;不同于 VBA 中 Worksheet 的概念&#xf…

基于HttpClient实现的微信用户登陆微信小程序

目录 HttpClient介绍 微信小程序登陆 代码编写 导入HttpClient的Maven坐标 微信小程序获得临时Code并将其传至开发者服务器 开发者服务器构建url&#xff0c;并获取openid&#xff0c;并传给微信小程序 HttpClientUtil的封装的doGet方法 参考链接 HttpClient介绍 httpC…

【Java - 框架 - Mybatis】(02) SpringBoot整合Mybatis操作Mysql - 快速上手

“SpringBoot"整合"Mybatis"操作"Mysql” - 快速上手&#xff1b; 环境 Java版本"1.8.0_202"&#xff1b;Spring Boot版本"2.5.9"&#xff1b;Windows 11 专业版_22621.2428&#xff1b;IntelliJ IDEA 2021.1.3(Ultimate Edition)&a…

[Java并发编程] Java开发必须知道的synchronized关键字

前言 在Java后台开发或者Android开发中&#xff0c;synchronized出现的频率并不算低。本文就什么是synchronized&#xff0c;如何使用synchronized以及synchronized的实现原理做深入的讲解&#xff0c;揭开synchronized神秘面纱&#xff0c;有助于大家掌握synchronized的用法并…

生成式AI来袭,FOSS全闪对象存储应时而生

AI大模型正飞速跃进&#xff0c;从引领文本生成革命的ChatGPT到开创文生视频新纪元的Sora&#xff0c;多模态交互技术连续迭代&#xff0c;促进了智算中心的快速落地。在这一过程中&#xff0c;算力的迅猛增长对存储系统提出了更高的要求和挑战。为满足这些日益增长的需求&…

校园生活信息平台:Java+Vue+MySQL全栈实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

机界先锋:Figure 01实现全面沟通与AGI通用人工智能的征途

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

idea安装了某个插件之后启动报错打不开怎么办

刚才安装了个这个插件 然后重启的时候就报错了 如下 不用慌&#xff0c;看一下报错日志&#xff0c;找到插件的位置给他删了就行了&#xff0c;往下拉一点 找到这个文件给他删了&#xff0c;再启动就好了。记得删之前先把上面这个报错弹框关了&#xff0c;不然会提示文件占用不…

阿里云第一次面试记录

java多态&#xff1f; 多态表示一个对象具有多种的状态&#xff0c;具体表现为父类的引用指向子类的实例 Fu f Zi z(); 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作 特点&#xff1a; 对象类型和引用类型…