过去,使用C#对Excel表格中的数据进行读写,需要关注很多技术细节。但现在,AI可以自动化处理所有的技术细节,从而让Excel的数据访问,变得非常简单。现对本次的编程实践简要记录如下:
一、需求分析
某部门人员资料中出生年月的数据格式为1980.1,现在需要统计所有人员的年龄。由于人员数量较多,并且后期还有统计的需求,因此考虑用AI辅助开发一款软件来解决这个业务问题。
二、技术方案
为了简化开发,考虑到电脑中普遍安装有Excel,因此,使用Office内置的COM组件来进行开发。编辑器使用VisualStudio社区版,用来建立软件界面。AI工具使用国产Trae IDE,用来做代码补全。代码生成后,在VS中进行编译、调试。
三、开发步骤
在VisualStudio2026编辑器中新建一个项目,添加Microsoft Excel 16.0 Object Library文件引用(不同版本的Office,这里的数字可能不同)。

添加完成后在管理器窗口可以看到Microsoft.Office.Interop.Excel程序集。

四、用户界面
本次软件开发,用户界面如下:

首先,考虑的是读取Excel中指定的数据列,这里可以指定三列数据进行汇总,其中第三列是出生年月。
其次,考虑到多个部门的人员数据可能分布在不同的表格中,或者在同一个文件的不同页面(表单)中,因此,提供一个指定目录的功能,凡是保存在指定目录中的所有Excel文件,以及每个页面都将被统计到。
数据统计汇总后,根据出生年月,计算出实际的年龄,将所有的数据显示到右侧的列表控件中。
根据用户需求,需要对年龄数据分段进行统计,因此,提供同多个按钮,可以从汇总数据中直接筛选出数据内容,给出总数量及数据导出功能。
五、技术难点
1、数据访问无效。
在测试初期,发现Excel文件正常打开了,但数据未能正常读取。经过检查发现,AI在处理数据时,过早的对数值型数据进行了有效性检测,若格式不规范,则自动忽略数据。
通过指定所有数据为字符串类型,先读取并显示出来,再进行数据转换和判断,可以在汇总表中正常显示出原始数据和转换结果,根据内容显示进一步优化代码。
2、Excel数据列的判读
Excel默认的列号为A、B、C、A1、B1等样式,这里需要将列号转换为数字,AI直接给出了下面的标准答案,简单管用。
privateboolTryParseColumn(string columnText, outint columnNumber) { columnNumber = 0; if (string.IsNullOrWhiteSpace(columnText)) return false; columnText = columnText.Trim().ToUpper(); if (int.TryParse(columnText, out columnNumber)) { return columnNumber > 0; } columnNumber = 0; foreach (char c in columnText) { if (c < 'A' || c > 'Z') return false; columnNumber = columnNumber * 26 + (c - 'A' + 1); } return columnNumber > 0; }}
3、多个文件及多个页面的访问
先将文件夹中的所有文件汇总到List表中,再循环读取每个文件、每个页面、每行数据。人工写这些代码比较难,但这是AI的优势。代码框架如下:
foreach (string filePath in fileList){ foreach (Worksheet worksheet in workbook.Worksheets) { for (int row = 2; row <= rowCount; row++) { Person p = new Person(id, name, ageStr, dateTimePicker1.Value); personList.Add(p); } }}
4、大数据量访问时,软件假死
使用COM控件访问Excel文件,访问效率一个显著的问题。当需要打开多个文件表格进行访问时,软件会呈现假死机的状态。
通过使用异步访问的方式可以从感观上给用户运行正常的感觉,代码框架如下:
await Task.Run(() =>{ // to do });
配合异步访问,在状态栏中增加一个进度条,随时汇报进度,软件的数据处理过程就会清晰可见。
5、非标准数据的解析
表格中仅有出生年月,通过以下函数转换为年龄。
privatefloatCalculateAge(string birthDateStr, DateTime 截止日期) { try { string[] parts = birthDateStr.Split('.'); if (parts.Length >= 2) { int year = int.Parse(parts[0]); int month = int.Parse(parts[1]); //代码中默认按每月1号为当月所有人的生日 DateTime birthDate = new DateTime(year, month, 1); DateTime today = 截止日期; int age = today.Year - birthDate.Year; if (today.Month < birthDate.Month || (today.Month == birthDate.Month && today.Day < birthDate.Day)) { age--; } return (float)age; } } catch { return 0; } return 0; }
AI生成的代码更简洁,并且自带了数据错误处理步骤。
6、代码架构设计
为了灵活保存Excel中的数据,设计一个Person类,用来记录相关数据,并用于数据的显示。
////// 人员类,用于存储和管理人员信息///public class Person{ /// /// 人员编号 /// public string Id { get; set; } /// /// 人员姓名 /// public string Name { get; set; } /// /// 出生日期字符串 /// public string BirthDateStr { get; set; } /// /// 年龄 /// public float Age { get; set; } /// /// 构造函数(直接指定年龄) /// /// 人员编号 /// 人员姓名 /// 年龄 publicPerson(string id, string name, float age) { Id = id; Name = name; BirthDateStr = ""; Age = age; }}
7、用户使用说明
用户使用说明也可以让AI来生成,只有想不到,没有做不到。

六、项目总结
通过本次AI编程,Excel数据读取、保存等模块都得到了验证,异步处理、进度条的使用都是在AI的帮助下自动化完成,为以后的复杂数据处理扫清了盲区,具有较好的参考价值。
在与AI的交互中,控制代码变更的范围,及时更新代码说明文档,对于项目的掌控非常重要。此外,了解用户需求,决策技术措施,也是与AI互动中不可或缺的关键部分。
完成的项目代码下载在这里:
https://gitee.com/WindSpiral/AgeCounter