文章目录
-
- 引言:打工人の自救指南
- 技术选型:为什么选这套方案?
- 环境准备:开工前的材料清单
- 第一步:让Claude学会"看"Excel
-
- 定义数据模型
- [EPPlus 读取Excel](#EPPlus 读取Excel)
- 第二步:Claude的"最强大脑"接入
- 第三步:自动生成PowerPoint
-
- [方案1:Open XML SDK(原生底层)](#方案1:Open XML SDK(原生底层))
- 方案2:Syncfusion(简洁高效,推荐)
- 第四步:串起来,一键跑通
- 进阶玩法:让Claude直接操作Office
- 避坑指南:生产环境注意事项
- 结语:从工具人到自动化工程师
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
引言:打工人の自救指南
每个月底,你是不是也被"数据汇总PPT"折磨得死去活来?
销售数据躺在Excel里躺得好好的,老板非要你做成十几页的PowerPoint,还得配上"环比分析""同比洞察"这种听起来很高大上但实际上就是换了个说法的文字描述。
传统的做法是:
打开Excel→复制数据→粘贴到PPT→调格式→写文字→反复修改。
一套流程下来,半天没了,眼睛花了,颈椎也废了。更惨的是,下个月还得再来一遍。
今天咱们要聊的这套组合拳,堪称办公自动化界的"降维打击"------
用C#写个小程序,让Claude这个AI大脑自动读取Excel数据,分析完直接生成排版精美的PowerPoint。
听起来像科幻片?其实2025年的技术栈已经让这事儿变得比煮泡面还简单了。
技术选型:为什么选这套方案?
在动手之前,先聊聊咱们要用的"武器库"。
-
Claude API :Anthropic家的Claude 3.5/3.7 Sonnet,在2025年已经成了代码生成和长文本理解的事实标准。相比其他模型,Claude在处理结构化数据(比如Excel表格)时特别稳,不会瞎编数字,而且NuGet上有现成的
Anthropic.SDK(最新版5.10.0,2025年9月刚更新),再也不用自己手写HTTP客户端去调接口了。 -
Excel处理 :这里得敲个黑板。很多老教程会教你用
Microsoft.Office.Interop.Excel,这套API确实是微软亲生的,但在自动化场景下就像个娇气的大小姐------必须装Office,容易内存泄漏,还时不时弹个对话框让你点确定。咱们今天用EPPlus(版本7.0+),这玩意儿纯.NET实现,不依赖Office安装,在服务器上跑得飞快。 -
PowerPoint生成 :同理,放弃Interop,改用
PresentationCore配合Open XML SDK ,或者更简单点直接用第三方库如Syncfusion的Presentation库。咱们示例里用Open XML SDK 3.0,微软官方维护,2025年还在持续更新,生成出来的PPT和手动做的没区别。
环境准备:开工前的材料清单
打开你的 Visual Studio 2022/2025,新建一个 .NET 8 控制台项目(长期支持版本稳定)。
然后在NuGet安装这些包:
bash
dotnet add package Anthropic.SDK --version 5.10.0
dotnet add package EPPlus --version 7.5.0
dotnet add package DocumentFormat.OpenXml --version 3.2.0
dotnet add package Newtonsoft.Json --version 13.0.3
Anthropic.SDK:Claude C# SDKEPPlus:Excel读取DocumentFormat.OpenXml:PPT生成Newtonsoft.Json:序列化
另外需要去Anthropic官网申请API Key ,新用户有5美元免费额度。
建议把Key放在环境变量里,不要硬编码,避免泄露被盗刷。
第一步:让Claude学会"看"Excel
很多人第一反应是把Excel转成CSV再喂AI,遇到复杂表格就崩了。
更优雅的方案:C# 读取Excel → 结构化数据 → Claude Function Calling 查询。
定义数据模型
csharp
public class SalesData
{
public string Region { get; set; }
public string Product { get; set; }
public decimal Q1 { get; set; }
public decimal Q2 { get; set; }
public decimal Q3 { get; set; }
public decimal Q4 { get; set; }
public decimal Total => Q1 + Q2 + Q3 + Q4;
}
EPPlus 读取Excel
csharp
using OfficeOpenXml;
using System.Collections.Generic;
using System.IO;
using System.Linq;
public class ExcelAnalyzer
{
public List<SalesData> ReadSalesData(string filePath)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
var salesList = new List<SalesData>();
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
var worksheet = package.Workbook.Worksheets[0]; // 第一个Sheet
int rowCount = worksheet.Dimension.Rows;
// 从第2行开始读(跳过表头)
for (int row = 2; row <= rowCount; row++)
{
salesList.Add(new SalesData
{
Region = worksheet.Cells[row, 1].Text,
Product = worksheet.Cells[row, 2].Text,
Q1 = decimal.Parse(worksheet.Cells[row, 3].Text),
Q2 = decimal.Parse(worksheet.Cells[row, 4].Text),
Q3 = decimal.Parse(worksheet.Cells[row, 5].Text),
Q4 = decimal.Parse(worksheet.Cells[row, 6].Text)
});
}
}
return salesList;
}
}
第二步:Claude的"最强大脑"接入
使用 Anthropic.SDK 的 Tool Use(Function Calling),让AI调用本地方法查数据。
定义工具函数
csharp
using Anthropic.SDK;
using Anthropic.SDK.Common;
using Anthropic.SDK.Messaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public class ClaudeAnalyzer
{
private readonly AnthropicClient _client;
private readonly List<SalesData> _salesData;
public ClaudeAnalyzer(string apiKey, List<SalesData> salesData)
{
_client = new AnthropicClient(apiKey);
_salesData = salesData;
}
// 给Claude调用的工具方法
[Function("获取指定区域的销售数据")]
public string GetSalesByRegion([FunctionParameter("区域名称,如'华东'、'华南'", true)] string region)
{
var data = _salesData.Where(s => s.Region.Contains(region)).ToList();
return System.Text.Json.JsonSerializer.Serialize(data);
}
[Function("获取年度总销售额")]
public string GetTotalSales()
{
var total = _salesData.Sum(s => s.Total);
return $"2025年度总销售额:{total:C2}";
}
[Function("分析季度增长趋势")]
public string AnalyzeGrowthTrend()
{
var q1Total = _salesData.Sum(s => s.Q1);
var q4Total = _salesData.Sum(s => s.Q4);
var growth = ((q4Total - q1Total) / q1Total) * 100;
return $"Q1到Q4增长率:{growth:F2}%,{(growth > 0 ? "呈上升趋势" : "需关注下滑")}";
}
}
核心分析逻辑
csharp
public async Task<string> GenerateAnalysisReport()
{
var messages = new List<Message>
{
new Message(RoleType.User,
@"请基于销售数据生成一份 executive summary(高管摘要),要求:
1. 分析华东和华南两个大区的表现差异
2. 指出增长最快的产品线
3. 给出Q4的战略建议
请调用相关工具获取数据,然后给出专业分析。")
};
// 自动发现所有带[Function]特性的方法
var tools = Tool.GetAllAvailableTools();
var parameters = new MessageParameters
{
Messages = messages,
MaxTokens = 4096,
Model = AnthropicModels.Claude35Sonnet,
Temperature = 0.3m, // 分析类任务温度调低
Tools = tools.ToList()
};
var response = await _client.Messages.GetClaudeMessageAsync(parameters);
// 处理工具调用
if (response.ToolCalls != null && response.ToolCalls.Any())
{
messages.Add(response.Message);
foreach (var toolCall in response.ToolCalls)
{
var result = await toolCall.InvokeAsync<string>();
messages.Add(new Message(toolCall, result));
}
// 再次调用获取最终分析
var finalResponse = await _client.Messages.GetClaudeMessageAsync(parameters);
return finalResponse.Message.ToString();
}
return response.Message.ToString();
}
第三步:自动生成PowerPoint
方案1:Open XML SDK(原生底层)
csharp
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
using P = DocumentFormat.OpenXml.Presentation;
public class PptGenerator
{
public void CreatePresentation(string filePath, string title, string content)
{
using (PresentationDocument doc = PresentationDocument.Create(filePath, PresentationDocumentType.Presentation))
{
PresentationPart presentationPart = doc.AddPresentationPart();
presentationPart.Presentation = new Presentation();
// 创建空白幻灯片布局
SlideMasterPart slideMasterPart = presentationPart.AddNewPart<SlideMasterPart>();
slideMasterPart.SlideMaster = new SlideMaster(new CommonSlideData(new ShapeTree()));
SlideLayoutPart slideLayoutPart = presentationPart.AddNewPart<SlideLayoutPart>();
slideLayoutPart.SlideLayout = new SlideLayout(new CommonSlideData(new ShapeTree()));
slideLayoutPart.AddPart(slideMasterPart);
// 标题页
SlidePart titleSlide = CreateSlide(presentationPart, slideLayoutPart);
AddTextToSlide(titleSlide, title, 200, 100, 50);
AddTextToSlide(titleSlide, $"生成时间:{DateTime.Now:yyyy-MM-dd}", 300, 200, 20);
// 内容页
SlidePart contentSlide = CreateSlide(presentationPart, slideLayoutPart);
var paragraphs = content.Split('\n').Where(p => !string.IsNullOrWhiteWhiteSpace(p)).ToList();
int yPos = 100;
foreach (var para in paragraphs.Take(6))
{
AddTextToSlide(contentSlide, para.Trim(), 100, yPos, 24);
yPos += 80;
}
// 多页逻辑省略...
presentationPart.Presentation.Save();
}
}
private SlidePart CreateSlide(PresentationPart presentationPart, SlideLayoutPart layoutPart)
{
SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();
slidePart.Slide = new Slide(new CommonSlideData(new ShapeTree()));
slidePart.AddPart(layoutPart);
return slidePart;
}
private void AddTextToSlide(SlidePart slidePart, string text, int x, int y, int fontSize)
{
// 底层Open XML绘图逻辑(简化示意)
}
}
方案2:Syncfusion(简洁高效,推荐)
csharp
using Syncfusion.Presentation;
public void CreatePptSyncfusion(string filePath, string analysisText)
{
using (IPresentation presentation = Presentation.Create())
{
// 标题页
ISlide titleSlide = presentation.Slides.Add(SlideLayoutType.Title);
titleSlide.Shapes.TitleFrame.Text = "2025年度销售分析报告";
titleSlide.Shapes[1].TextFrame.Text = "AI自动生成";
// 内容页
ISlide contentSlide = presentation.Slides.Add(SlideLayoutType.Text);
contentSlide.Shapes.TitleFrame.Text = "核心洞察";
IShape textBox = contentSlide.AddTextBox(100, 100, 800, 500);
textBox.TextFrame.Text = analysisText;
textBox.TextFrame.Paragraphs[0].Font.Size = 24;
presentation.Save(filePath);
}
}
第四步:串起来,一键跑通
csharp
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("🚀 开始生成智能报告...");
// 1. 读取Excel
var excelAnalyzer = new ExcelAnalyzer();
var salesData = excelAnalyzer.ReadSalesData("Sales2025.xlsx");
Console.WriteLine($"✅ 读取到 {salesData.Count} 条销售记录");
// 2. Claude分析
var apiKey = Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY");
var claudeAnalyzer = new ClaudeAnalyzer(apiKey, salesData);
var analysis = await claudeAnalyzer.GenerateAnalysisReport();
Console.WriteLine("✅ AI分析完成");
// 3. 生成PPT
var pptGen = new PptGenerator();
pptGen.CreatePresentation("销售报告_自动版.pptx",
"2025年度销售业绩分析",
analysis);
Console.WriteLine("✅ PowerPoint已生成:销售报告_自动版.pptx");
Console.WriteLine("🎉 搞定!去文件夹里看结果吧。");
}
}
进阶玩法:让Claude直接操作Office
2025年Claude支持 Computer Use 能力:
你可以让Claude直接生成VBA宏,在Excel里自动做透视表、图表、格式处理。
示例提示词:
请基于这份销售数据,写一个VBA宏,在Excel里生成一个透视表,按大区汇总Q4销售额,并创建柱状图。
C# 可以调用Claude生成VBA,再通过Interop执行宏,完美兼容老系统。
避坑指南:生产环境注意事项
-
API Key安全
不要硬编码,使用环境变量、Azure Key Vault、AWS Secrets Manager。
-
Excel格式
EPPlus只支持
.xlsx,老.xls请用ExcelDataReader转换。 -
大文件内存
几十万行数据不要一次性加载,用流式/分块读取。
-
PPT模板化
先用PPT做好公司模板(Logo、字体、配色),程序只做内容填充。
-
API重试
使用Polly实现指数退避,处理限流429、网络波动。
结语:从工具人到自动化工程师
这套 Excel → Claude → PPT 流水线,不只是解决一个办公场景,
更是代表一种新工作范式:AI 深度嵌入业务工作流。
传统C#写的是确定逻辑:IF this THEN that
接入大模型后,程序可以处理模糊、自然语言、开放式分析。
当同事还在复制粘贴时,你已经用定时任务每天自动出报告,
这就是技术带来的降维打击。
代码、NuGet、思路都给你了,现在就去试试吧!
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
