Logo

使用C#和AI在Excel中生成多种类型的图表

photo

2025年06月09日

在数据分析和报告中,图表是一种非常直观的方式来展示数据。通过使用C#和AI,我们可以自动化生成Excel图表,不仅节省时间,还能根据数据特点选择最适合的图表类型。本文将详细介绍如何实现这一过程,包括AI提示词的编写、JSON数据的生成以及C#代码的实现。

1.AI提示词的编写

为了生成包含数据和图表建议的JSON,我们需要编写一个AI提示词。这个提示词将指导AI生成包含数据表格和多种图表建议的JSON。以下是一个示例:

请根据以下描述生成一个JSON对象,其中包含数据表格和多种图表建议:
描述:2024年1月,我们公司的销售额和利润情况如下:
- 2024年1月1日,销售额为1000元,利润为200元。
- 2024年1月2日,销售额为1500元,利润为300元。
- 2024年1月3日,销售额为1200元,利润为250元。

请生成一个JSON对象,其中包含以下内容:
1. 一个数据表格,包含以下列:
   - 日期(格式为YYYY-MM-DD)
   - 销售额(整数)
   - 利润(整数)
2. 一个图表建议列表,每个建议包含以下字段:
   - 图表类型(例如:柱状图、折线图、饼图、面积图、条形图、散点图等)
   - 图表标题(描述性文本)

图表建议列表:
- 图表类型:柱状图
  - 图表标题:2024年1月销售和利润柱状图分析
- 图表类型:折线图
  - 图表标题:2024年1月销售和利润折线图分析
- 图表类型:饼图
  - 图表标题:2024年1月利润占比饼图分析
- 图表类型:面积图
  - 图表标题:2024年1月销售和利润面积图分析
- 图表类型:条形图
  - 图表标题:2024年1月销售和利润条形图分析
- 图表类型:散点图
  - 图表标题:2024年1月销售额与利润散点图分析

2.AI生成的JSON示例

AI根据上述提示词生成的JSON可能如下所示:

{
  "data": [
    ["2024-01-01", 1000, 200],
    ["2024-01-02", 1500, 300],
    ["2024-01-03", 1200, 250]
  ],
  "chartSuggestions": [
    {
      "chartType": "ColumnClustered",
      "chartTitle": "2024年1月销售和利润柱状图分析"
    },
    {
      "chartType": "Line",
      "chartTitle": "2024年1月销售和利润折线图分析"
    },
    {
      "chartType": "Pie",
      "chartTitle": "2024年1月利润占比饼图分析"
    },
    {
      "chartType": "Area",
      "chartTitle": "2024年1月销售和利润面积图分析"
    },
    {
      "chartType": "BarClustered",
      "chartTitle": "2024年1月销售和利润条形图分析"
    },
    {
      "chartType": "XYScatter",
      "chartTitle": "2024年1月销售额与利润散点图分析"
    }
  ]
}

3.C#代码实现

以下是完整的C#代码示例,展示如何根据AI生成的JSON在Excel中生成多种类型的图表:

using System;
using System.Runtime.InteropServices;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelAddInExample
{
    public class ChartGenerator
    {
        // 假设有一个AI服务接口,用于生成数据和图表建议
        private IAIChartService _aiChartService;

        public ChartGenerator(IAIChartService aiChartService)
        {
            _aiChartService = aiChartService;
        }

        public async Task GenerateChartAsync(string sheetName, string chartLocation)
        {
            // 调用AI服务获取包含数据和图表建议的JSON
            string jsonResponse = await _aiChartService.GetDataAndChartSuggestionsAsync();

            // 解析JSON数据
            JObject jsonResponseObject = JObject.Parse(jsonResponse);
            JArray data = (JArray)jsonResponseObject["data"];
            JArray chartSuggestions = (JArray)jsonResponseObject["chartSuggestions"];

            // 启动Excel应用程序
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook workbook = excelApp.Workbooks.Add();
            Excel.Worksheet worksheet = workbook.Sheets[sheetName];

            // 将数据写入Excel
            int row = 1;
            foreach (var item in data)
            {
                int col = 1;
                foreach (var value in item)
                {
                    worksheet.Cells[row, col] = value.ToString();
                    col++;
                }
                row++;
            }

            // 定义数据范围
            string dataRangeAddress = $"A1:{ExcelHelper.GetExcelColumnName(data[0].Count)}{data.Count}";

            // 创建图表
            Excel.ChartObjects chartObjects = (Excel.ChartObjects)worksheet.ChartObjects();
            foreach (var suggestion in chartSuggestions)
            {
                Excel.ChartObject chartObject = chartObjects.Add(100, 50, 300, 200); // 指定图表位置和大小
                Excel.Chart chart = chartObject.Chart;

                // 设置图表数据源
                Excel.Range dataRange = worksheet.get_Range(dataRangeAddress);
                chart.SetSourceData(dataRange, Excel.XlRowCol.xlColumns);

                // 设置图表类型
                string chartType = (string)suggestion["chartType"];
                switch (chartType)
                {
                    case "ColumnClustered":
                        chart.ChartType = Excel.XlChartType.xlColumnClustered;
                        break;
                    case "Line":
                        chart.ChartType = Excel.XlChartType.xlLine;
                        break;
                    case "Pie":
                        chart.ChartType = Excel.XlChartType.xlPie;
                        break;
                    case "Area":
                        chart.ChartType = Excel.XlChartType.xlArea;
                        break;
                    case "BarClustered":
                        chart.ChartType = Excel.XlChartType.xlBarClustered;
                        break;
                    case "XYScatter":
                        chart.ChartType = Excel.XlChartType.xlXYScatter;
                        break;
                    default:
                        chart.ChartType = Excel.XlChartType.xlColumnClustered; // 默认为柱状图
                        break;
                }

                // 设置图表标题
                string chartTitle = (string)suggestion["chartTitle"];
                chart.HasTitle = true;
                chart.ChartTitle.Text = chartTitle;

                // 将图表放置在指定位置
                chart.Location(Excel.XlChartLocation.xlLocationAsObject, chartLocation);
            }

            // 保存工作簿
            workbook.SaveAs("GeneratedChart.xlsx");

            // 关闭Excel应用程序
            workbook.Close(false);
            excelApp.Quit();

            // 释放COM对象
            Marshal.ReleaseComObject(chartObjects);
            Marshal.ReleaseComObject(worksheet);
            Marshal.ReleaseComObject(workbook);
            Marshal.ReleaseComObject(excelApp);
        }
    }

    // AI图表服务接口
    public interface IAIChartService
    {
        Task<string> GetDataAndChartSuggestionsAsync();
    }

    // AI图表服务实现
    public class AIChartService : IAIChartService
    {
        private readonly HttpClient _httpClient;

        public AIChartService()
        {
            _httpClient = new HttpClient();
        }

        public async Task<string> GetDataAndChartSuggestionsAsync()
        {
            // 调用AI服务获取包含数据和图表建议的JSON
            // 这里只是一个示例,实际实现需要调用具体的AI API
            HttpResponseMessage response = await _httpClient.GetAsync("https://your-ai-service-endpoint.com/api/chart-suggestions");
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
    }

    // Excel工具类
    public static class ExcelHelper
    {
        public static string GetExcelColumnName(int columnNumber)
        {
            string columnName = "";
            while (columnNumber > 0)
            {
                int remainder = (columnNumber - 1) % 26;
                columnName = (char)('A' + remainder) + columnName;
                columnNumber = (columnNumber - remainder) / 26;
            }
            return columnName;
        }
    }
}

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
所有附件
该文章没有附件.
本文为原创文章,请注意保留出处!

留言板

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

热门文章

WordPress 后台编辑器样式实现直接预览 在WordPress3.0以后,有一个新的实用功能:你可以更改默认后台编辑器(TinyMCE)的样...WordPress后台编辑器样式实现直接预览 作者:Pastore Antonio
1612 浏览量
又到泡桐花开时 暮春四月,百花争艳,千姿百态,香飘千里,万木争荣。有一种泡桐树,迟于阳春三月里盛开的桃树、杏树、李树,欣欣然,翩翩然,花开芬芳,来到五彩缤纷姹紫嫣红的大自然界,向人们一展芳姿,怒放于中原大地,成为晚春时节一道靓丽的风景线。 作者:Pastore Antonio
1582 浏览量
C#图片处理 通常对一幅图片的处理包括:格式变换,缩放(Scale),翻转(Rotate),截取(Clip),滤镜...C#图片处理 作者:Pastore Antonio
1580 浏览量
【干货】Chrome插件(扩展)开发全攻略 写在前面我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的...【干货】Chrome插件(扩展)开发全攻略 作者:Pastore Antonio
1567 浏览量
memcached 处理 多端口:https://blog.csdn.net/Erica_1230/article/deta...memcached处理 作者:Pastore Antonio
1560 浏览量