C#上位机开发一键导出数据到Excel(完整案例解析)

170 阅读5分钟

前言

在工业控制、数据采集与监控系统(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环境或高并发场景,建议使用如EPPlusNPOI等无需安装Office的第三方库。

完整源码已开源,欢迎访问作者GitHub获取:

github.com/Harryjun/BM…

关键词

C#、上位机开发、文件操作、Excel保存、SaveFileDialog、Interop、ExcelApplication、Workbook、Worksheet、Cells、数据导出、Office自动化、Windows Forms、BMS、GitHub

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:#Cloud

出处:cnblogs.com/flyingjun/p/6815073.html

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!