在数据分析和报告中,图表是一种非常直观的方式来展示数据。通过使用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;
}
}
}