调用office的Excel制作统计图,并保存成图片

news/2024/7/21 5:59:14 标签: excel
public class CMSChart
    {
        private Chart chart;

        public CMSChart(Chart chart)
        {
            this.chart = chart;
        }
        

        /// <summary>
        /// 保存图片
        /// </summary>
        /// <param name="fullPicName"></param>
        public void SaveAs(string fullPicName)
        {
            ChartImageFormat format = ChartImageFormat.Jpeg;
            string ext = fullPicName.Substring(fullPicName.LastIndexOf('.') + 1);
            switch (ext.ToLower())
            {
                case "bmp": format = ChartImageFormat.Bmp; break;
                case "jpg": format = ChartImageFormat.Jpeg; break;
                case "png": format = ChartImageFormat.Png; break;
                case "tif": format = ChartImageFormat.Tiff; break;
                case "emf": format = ChartImageFormat.Emf; break;
            }
            chart.SaveImage(fullPicName, format);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dt">数据表,不能为空</param>
        /// <param name="xField">x轴数据字段,只有1个</param>
        /// <param name="yFields">y轴数据字段,多个</param>
        /// <param name="yTypes"></param>
        /// <param name="yTitles"></param>
        /// <param name="colors"></param>
        /// <param name="xTitle"></param>
        /// <param name="yTitle"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        public bool ShowChart(DataTable dt, string xField, string[] yFields, string[] yTypes, string[] yTitles, Color[] colors, string xTitle, string yTitle, string title)
        {
            bool result = false;
            try
            {
                chart.Titles.Clear();
                Title t = new Title(title, Docking.Top);
                chart.Titles.Add(title);
                chart.ChartAreas.Clear();
                chart.Series.Clear();
                ChartArea area = new ChartArea();

                //绘图区域高/宽相对于图表的高/宽的百分比
                area.Position.Height = 52;
                area.Position.Width = 96;
                //绘图区域起始位置坐标相对于图表高/宽的百分比
                area.Position.X = 2;
                area.Position.Y = 16;

                area.Name = "area" + yTitles;
                area.AxisX.Title = xTitle;
                area.AxisX.TitleAlignment = StringAlignment.Far;
                int Interval = dt.Rows.Count / 12;
                if (Interval < 1)
                    Interval = 1;
                area.AxisX.Interval = Interval;
                area.AxisY.Title = yTitle;
                area.AxisX.MajorGrid.Enabled = false;
                area.AxisY.MajorGrid.Enabled = false;                
                chart.ChartAreas.Add(area);
                double min = double.MaxValue, max = double.MinValue;
                for (int i = 0; i < yFields.Length; i++)
                {                    
                    Series series = new Series();
                    series.Color = colors[i];
                    series.Name = yTitles[i];                    
                    switch (yTypes[i])
                    {
                        case "line": series.ChartType = SeriesChartType.Line;
                            series.BorderWidth = 2;
                            break;
                        case "column": series.ChartType = SeriesChartType.Column; break;
                    }
                    foreach (DataRow row in dt.Rows)
                    {
                        if (!Convert.IsDBNull(row[yFields[i]]))
                        {
                            int x = Convert.ToInt32(row[xField]);
                            double y = Convert.ToDouble(row[yFields[i]]);
                            DataPoint p = new DataPoint(x, y);
                            series.Points.Add(p);
                            if (y > max)
                                max = y;
                            if (y < min)
                                min = y;
                        }
                    }
                    if (min > 0)
                    {
                        double cha = max - min;
                        if (cha < min * 0.3)
                            area.AxisY.Minimum = Math.Round(min * 0.7, 0);
                    }
                    else if (max < 0)
                    { }
                    series.ChartArea = area.Name;
                    series.LabelToolTip = string.Format("年:#VALX\r\n{0}:#VAL", yTitles[i]);
                    series.ToolTip = string.Format("年:#VALX\r\n{0}:#VAL", yTitles[i]);                   
                    chart.Series.Add(series);                    
                }
            }
            catch (Exception ex)
            {
                ErrorManager.AddErrorToLog(ex);
                result = false;
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="xField"></param>
        /// <param name="yFields"></param>
        /// <param name="yTypes"></param>
        /// <param name="yTitles"></param>
        /// <param name="colors"></param>
        /// <param name="xTitle"></param>
        /// <param name="yTitle"></param>
        /// <param name="title"></param>
        /// <param name="fullPicName"></param>
        /// <returns></returns>
        public bool CreatePic(DataTable dt, string xField, string[] yFields, string[] yTypes, string[] yTitles, Color[] colors, string xTitle, string yTitle, string title, string fullPicName)
        {
            bool result = false;
            try
            {
                ShowChart(dt, xField, yFields, yTypes, yTitles, colors, xTitle, yTitle, title);
                SaveAs(fullPicName);
            }
            catch (Exception ex)
            {
                ErrorManager.AddErrorToLog(ex);
                result = false;
            }
            return result;
        }
    }

excel格式设置:
在这里插入图片描述


http://www.niftyadmin.cn/n/1004613.html

相关文章

力扣算法刷题Day53|动态规划:最长公共子序列 不相交的线 最大子序和

力扣题目&#xff1a;#1143.最长公共子序列 刷题时长&#xff1a;参考题解后5min 解题方法&#xff1a;动态规划 复杂度分析 时间复杂度: O(n * m)&#xff0c;其中 n 和 m 分别为 text1 和 text2 的长度空间复杂度: O(n * m) 问题总结 重复子数组可以不连续&#xff0c;难…

echarts图表-实现中国地图的绘制

第一步&#xff1a;引入中国地图的json数据&#xff0c;初始化echarts的dom结构&#xff0c;使用registerMap方法加载地图数据&#xff08;注&#xff1a;echarts5.X版本后删除了中国地图的JSON&#xff0c;需自行下载JSON或降低echarts版本&#xff09; 第二步&#xff1a;传输…

支持向量回归SVR实例

支持向量回归&#xff08;Support Vector Regression&#xff0c;简称SVR&#xff09;是一种机器学习算法&#xff0c;用于解决回归问题。与传统的回归方法不同&#xff0c;SVR通过使用支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;的思想&…

内网IP怎么用域名让外网访问,域名动态解析和静态区别?

域名解析是将域名与公网IP进行对应关系&#xff0c;实现访问域名即访问到对应IP应用的方式。域名解析分静态域名解析和动态域名解析的区别&#xff0c;它们的区别在哪&#xff1f;内网IP服务器怎么用域名让外网连接访问&#xff1f;这些都是需要我们有所了解掌握的。 这里不但…

【FFmpeg实战】视频压缩标准之 H.261/H.262/H.263/H.264/H.265

作者&#xff1a;crazydeng 链接&#xff1a;https://juejin.cn/post/6996095841140703262 H.261、H.262、H.263、H.264、H.265 都是视频压缩标准&#xff0c;也被称为编解码器&#xff0c;这些术语定义了编码技术。 H.261 H.261是1990年ITU-T(国际电信联盟电信标准化部门)制…

操作系统OS(二)进程和线程

进程 所谓进程&#xff0c;简单来说是计算机中的各种任务。 进程是程序的一次执行&#xff0c;是操作系统进行资源分配和调度的基本单位。 进程结构PCB 进程结构&#xff1a; 控制块PCB&#xff1a;进程唯一标识 程序段&#xff1a;同一个应用程序的多个进程 数据段&#xf…

信号链噪声分析15

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 模数转换器(ADC)将模拟量——现实世界中绝大部分现象的特征——转换为数字语言&#xff0c; 以便用于信息处理、计算、数据传输和控制系统。数模转换器(DAC)则用于将发送或存 储…

软考--操作系统之文件系统多级索引

目录 概念索引结构索引表索引方式一级索引多级索引 真题分析题目1-存储文件最大长度解析题目2-多级索引占用物理块号解析题目3-综合解析总结 概念 索引结构 一个文件的信息存放在若干不连续物理块中 系统为每个文件建立一个专用数据结构——索引表&#xff0c;并将这些物理块…