Excel生成 chart 混合图表

news2024/12/24 9:16:03

在开发中有这样一个需求,邮件预警的时候,要求邮件主体内容是一个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.coloradmin.cn/o/1509865.html

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

相关文章

Java中 常见的开源图库介绍

阅读本文之前请参阅------Java中 图的基础知识介绍 在 Java 中&#xff0c;有几种流行的开源图库&#xff0c;它们提供了丰富的图算法和高级操作&#xff0c;可以帮助开发者更高效地处理图相关的问题。以下是几种常见的 Java 图库及其特点和区别&#xff1a; JGraphT …

【C++】---string的OJ题

【C】---string的OJ题 1.字符串转整形数字&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;思路展示&#xff08;3&#xff09;代码实现 2.字符串相加&#xff08;重要&#xff09;&#xff08;1&#xff09;题目描述&#xff08;2&am…

vim使用命令

1、 复制粘贴 复制一行: yy p vim 1.txt 进入编辑模式&#xff0c;在需要复制的行先按两下y键&#xff0c;再按p就完成复制复制2行&#xff1a; 2yy p 复制n行&#xff1a; nyy p 2、 删除 删除一行: dd删除2行: 2dd删除n行: ndd 3、 撤销 撤销上一步操作&#xff1a;…

【三、接口协议与抓包】使用ApiPost进行接口测试

你好&#xff0c;我是山茶&#xff0c;一个探索AI 测试的程序员。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相…

前端javascript Promise使用方法详解(非常全面)

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Promise对象&#xff08;1&#xff09;…

鸿蒙开发:从入门到精通的全方位学习指南

随着华为鸿蒙HarmonyOS生态系统的迅速扩展&#xff0c;越来越多的开发者渴望深入了解并掌握这一前沿技术。本文旨在为鸿蒙开发新手提供一份详尽且实用的学习教程&#xff0c;助您从零开始&#xff0c;逐步迈向鸿蒙开发的巅峰。 一、鸿蒙开发环境搭建 DevEco Studio安装&#x…

12---风扇电路设计

视频链接 风扇硬件电路设计01_哔哩哔哩_bilibili 风扇电路设计 1、风扇简介 电脑风扇又称为散热风扇&#xff0c;一般用于散热。提供给散热器和机箱使用。市面上一般的散热风扇尺寸大小由直径2.5cm到30cm都有&#xff0c;厚度由6mm到76mm都有&#xff0c;而根据不同运作要求…

美摄科技对抗网络数字人解决方案

在数字化浪潮的推动下&#xff0c;企业对于高效、创新且具备高度真实感的数字化解决方案的需求日益迫切。美摄科技凭借其在人工智能和计算机视觉领域的深厚积累&#xff0c;推出了一款全新的对抗网络数字人解决方案&#xff0c;该方案能够为企业构建出表情和动作都极为逼真的数…

ssm+vue的高校课程评价系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校课程评价系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

2024.3.10 C++

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);int u…

sqli-labs练习

2关 找出数据库名字 从数据库security 中找到表明名: 找到数据库名字: 从表users中找到列: 取出表users用户名和密码:用户名~密码 3关 判断出id是(‘id’)的形式 4关 双引号测试报错,推测是(“id“) 5关 填写id=1没有回显信息(布尔盲注一般适用于页面没有回显字…

connection SQLException, url:jdbc ,errorCode 0, state 08S01

connection SQLException, url: jdbc:mysql://localhost:3306/itcast_health?useUnicodetrue&characterEncodingutf-8, errorCode 0, state 08S01 添加&#xff1a;&useSSLfalse 添加前 添加后&#xff1a; 查询数据库正常

2.1 关系数据结构及形式化定义 数据库概论

目录 2.1.1 关系 关系&#xff1a;概念 1. 域&#xff08;Domain&#xff09; 2.笛卡尔积 元组&#xff08;Tuple&#xff09; 分量&#xff08;Component&#xff09; 基数&#xff08;Cardinal number&#xff09; 3. 关系 候选码&#xff08;Candidate key&#xf…

Docker 快速入门实操教程ER(完结)

Docker 快速入门实操教程&#xff08;完结&#xff09; 如果安装好Docker不知道怎么使用&#xff0c;不理解各个名词的概念&#xff0c;不太了解各个功能的用途&#xff0c;这篇文章应该会对你有帮助。 前置条件&#xff1a;已经安装Docker并且Docker成功启动。 实操内容&…

Leetcode 675 为高尔夫比赛砍树

文章目录 1. 题目描述2. 我的尝试3. 题解1. BFS 1. 题目描述 Leetcode 675 为高尔夫比赛砍树 2. 我的尝试 typedef priority_queue<int, vector<int>, greater<int>> heap;class Solution { public:int m;int n;int bfs(vector<vector<int>>&…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也&#xff0c;还被老板打电话push压力有点大的&#xff0c;还好搞的差不多了&#xff0c;明天再汇报&#xff0c;赶紧偷闲再刷几道题&#xff08;可恶&#xff0c;被打破连更记录了&#xff09;这几天刷的是动态规划&#xff0c;由于很成…

二分查找刷题(二)

目录 1.搜索插入位置 算法原理 代码编写 2.x 的平方根 算法原理 代码编写 3.山脉数组的峰顶索引 算法原理 1.搜索插入位置 算法原理 判断二段性 可以将区间分于5和大于等于5的两个区间&#xff0c;可以使用二分查找搜索左区间的模板。 代码编写 int searchInsert(vect…

【触想智能】工业触摸显示器在户外使用需要注意哪些问题?

工业显示器是智能制造领域应用比较广泛的电子产品&#xff0c;它广泛应用于工厂产线以及各种配套设备&#xff0c;在很大程度上提升了工厂的生产效率。 工业显示器按触摸方式分&#xff0c;可以分为工业触摸显示器和非触摸工业显示器两种;按使用环境分&#xff0c;又可以分为室…

计算机网络面经八股-什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种&#xff0c;它利用 TCP 协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费 CPU 和内存资源。 原理&#xff1a; 在三次握手过程中&#xff0c;服务器发送 [SYN/ACK] 包&#xff08;第二个包&#xff09;之后、收到客户端的 [ACK…