前言
在工业控制、数据采集与监控系统(SCADA)以及各类上位机软件开发中,数据的持久化存储是不可或缺的功能。其中,将采集到的数据导出为Excel文件,因其格式通用、易于查看与分析,已成为最常见的需求之一。
本文将围绕C#语言,结合WinForm应用程序,详细介绍如何通过调用外部插件实现Excel文件的创建与数据保存,帮助大家掌握上位机开发中的核心文件操作技能。
通过一个完整的"电池数据保存为Excel"的案例,我们将学习如何使用SaveFileDialog让用户选择保存路径,并借助Microsoft.Office.Interop.Excel库将界面上的控件数据写入Excel表格,最终实现数据的高效导出功能。
正文
本文的核心功能目标有两个:
1、学习并使用外部COM组件插件:通过引用Microsoft.Office.Interop.Excel,实现对Excel应用程序的自动化操作。
2、实现数据的Excel格式保存:将界面中采集的电压、SOC(电池荷电状态)、SOH(健康状态)、温度等数据,以结构化方式保存至Excel文件。
整个流程可分为三个关键步骤:
-
添加必要的外部引用;
-
创建文件保存对话框,获取用户指定的保存路径;
-
编写逻辑代码,将数据写入Excel并保存。
1、添加引用
在使用Excel操作功能前,需在项目中添加对Microsoft.Office.Interop.Excel的引用。具体操作如下:
1、在Visual Studio的"解决方案资源管理器"中,右键点击"引用" → "添加引用";
2、切换到"扩展"选项卡,搜索并选择Microsoft.Office.Interop.Excel;
3、确认添加后,即可在代码中使用Excel相关的类。
注意:该组件依赖于本地安装的Microsoft Office,若目标机器未安装Office,此方法将不可用。
添加引用示意图如下:
imageimage
成功添加后,项目中即可调用Excel对象模型,如下图所示:
image
2、创建文件保存对话框
为了允许用户自定义保存路径和文件名,我们使用SaveFileDialog类来弹出标准的"另存为"对话框。
核心属性说明
| 属性 | 说明 | |
|---|---|---|
Filter | 设置可保存的文件类型,格式为"描述 | 扩展名" |
FileName | 默认文件名 | |
DefaultExt | 默认扩展名 | |
AddExtension | 是否自动添加扩展名 | |
FilterIndex | 默认选中的文件类型索引 | |
RestoreDirectory | 是否记住上次打开的目录 |
示例代码
//可能要获取的路径名
string localFilePath = "", fileNameExt= "", newFileName= "", FilePath = "";
SaveFileDialog saveFileDialog = new SaveFileDialog();
//设置文件类型
//书写规则例如:txt files(*.txt)|*.txt
saveFileDialog.Filter = "txt files(*.txt)|*.txt|xls files(*.xls)|*.xls|All files(*.*)|*.*";
//设置默认文件名(可以不设置)
saveFileDialog.FileName = "siling-Data";
//主设置默认文件extension(可以不设置)
saveFileDialog.DefaultExt = "xml";
//获取或设置一个值,该值指示如果用户省略扩展名,文件对话框是否自动在文件名中添加扩展名。(可以不设置)
saveFileDialog.AddExtension = true;
//设置默认文件类型显示顺序(可以不设置)
saveFileDialog.FilterIndex = 2;
//保存对话框是否记忆上次打开的目录
saveFileDialog.RestoreDirectory = true;
// Show save file dialog box
DialogResult result = saveFileDialog.ShowDialog();
//点了保存按钮进入
if (result == DialogResult.OK)
{
//获得文件路径
localFilePath = saveFileDialog.FileName.ToString();
//获取文件名,不带路径
//fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1);
//获取文件路径,不带文件名
//FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));
//给文件名前加上时间
//newFileName = DateTime.Now.ToString("yyyyMMdd") + fileNameExt;
//在文件名里加字符
//saveFileDialog.FileName.Insert(1,"dameng");
//为用户使用 SaveFileDialog 选定的文件名创建读/写文件流。
//System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog.OpenFile();//输出文件
//fs可以用于其他要写入的操作
}
简化封装函数
private string ShowSaveFileDialog()
{
string localFilePath = "";
SaveFileDialog sfd = new SaveFileDialog();
//设置文件类型
sfd.Filter = "Excel文件(*.xlsx)|*.xlsx";
//保存对话框是否记忆上次打开的目录
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
localFilePath = sfd.FileName.ToString();
}
return localFilePath;
}
该函数返回用户选择的完整文件路径,供后续保存使用。
3、文件写入:Excel操作详解
Excel对象模型简介
-
Application:Excel应用程序实例; -
Workbook:代表一个Excel工作簿; -
Worksheet:工作簿中的单个工作表; -
Cells[row, column]:访问指定单元格,注意下标从1开始。
核心代码实现
private void Btn_DataSave_Click(object sender, EventArgs e)
{
/*******************数据导入Excel**********************/
string fileName = ShowSaveFileDialog(); //文件的保存路径和文件名
try
{
// 创建Excel应用程序实例
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
// 创建一个新的工作簿
Microsoft.Office.Interop.Excel.Workbook ExcelDoc = ExcelApp.Workbooks.Add(Type.Missing);
// 添加一个新的工作表
Microsoft.Office.Interop.Excel.Worksheet xlSheet = ExcelDoc.Worksheets.Add(Type.Missing,
Type.Missing, Type.Missing, Type.Missing);
ExcelApp.DisplayAlerts = false; // 关闭警告提示
// 写入表头
xlSheet.Cells[1, 1] = "序号";
xlSheet.Cells[1, 2] = "电压";
xlSheet.Cells[1, 3] = "SOC";
xlSheet.Cells[1, 4] = "SOH";
xlSheet.Cells[1, 5] = "温度";
// 遍历写入数据(假设Voltage_Battery、Soc_Battery等为TextBox数组)
for (int i = 0; i < 100; i++)
{
xlSheet.Cells[i + 2, 1] = "电池" + i.ToString();
}
for (int i = 0; i < 100; i++)
{
xlSheet.Cells[i + 2, 2] = Voltage_Battery[i].Text;
}
for (int i = 0; i < 100; i++)
{
xlSheet.Cells[i + 2, 3] = Soc_Battery[i].Text;
}
for (int i = 0; i < 100; i++)
{
xlSheet.Cells[i + 2, 4] = Soh_Battery[i].Text;
}
// 保存文件
xlSheet.SaveAs(fileName);
// 释放资源
ExcelDoc.Close(Type.Missing, fileName, Type.Missing);
ExcelApp.Quit();
MessageBox.Show("数据保存成功!");
}
catch
{
MessageBox.Show("数据保存失败!");
}
}
注意:务必在操作完成后调用
Quit()释放Excel进程,否则可能导致后台残留EXCEL.EXE进程。
总结
本文通过一个完整的C#上位机开发案例,详细讲解了如何将界面数据导出为Excel文件。
我们学习了:
-
如何通过"添加引用"引入
Microsoft.Office.Interop.Excel组件; -
使用
SaveFileDialog实现用户交互式文件保存路径选择; -
利用Excel对象模型(Application、Workbook、Worksheet)创建并写入数据;
-
最后通过
SaveAs方法保存文件,并正确释放资源。
该方法适用于小型项目或本地部署场景,但需注意其对Office环境的依赖性。对于无Office环境或高并发场景,建议使用如EPPlus、NPOI等无需安装Office的第三方库。
完整源码已开源,欢迎访问作者GitHub获取:
关键词
C#、上位机开发、文件操作、Excel保存、SaveFileDialog、Interop、ExcelApplication、Workbook、Worksheet、Cells、数据导出、Office自动化、Windows Forms、BMS、GitHub
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:#Cloud
出处:cnblogs.com/flyingjun/p/6815073.html
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!