C#: 创建Excel文件并在Excel中写入数据库中的数据

实现思路:

1.检查数据是否可导出

2.弹出文件保存对话框

3.删除已存在的同名文件

4.创建 Excel 应用实例

5.导出表头

6.导出数据

7.保存 Excel 文件

8.释放 Excel 资源

9.导出成功提示

csharp 复制代码
static void ExportToExcel(DataTable Data, string fileName)
{    
    // 如果表格中没有行,提示用户无数据可导出
    if (Data.Rows.Count == 0)
    {
        return;
    }
    // 声明保存文件的对话框
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.DefaultExt = "xls"; // 设置默认后缀
    string FilterFile = "文件";
    saveFileDialog.Filter = "EXCEL" + FilterFile + " (*.XLS) |*.xls|EXCEL " + FilterFile + " (*.XLSX)|*.xlsx"; // 文件类型过滤
    saveFileDialog.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); // 设置默认路径为当前程序路径
    saveFileDialog.FileName = fileName; // 设置默认文件名
    
    // 打开保存对话框,用户取消则退出
    if (saveFileDialog.ShowDialog() == DialogResult.Cancel)
    {
        return;
    }

    // 获取用户输入的文件路径
    string fileNameString = saveFileDialog.FileName;

    // 如果文件路径为空,直接退出
    if (fileNameString.Trim() == " ")
    {
        return;
    }

    // 获取表格行数和列数
    int rowscount = Data.Rows.Count;
    int colscount = Data.ColumnCount;

    // 验证行数和列数的合法性
    if (rowscount <= 0 || colscount <= 0 || rowscount > 65536 || colscount > 255)
    {
        return; // 行数或列数非法直接退出
    }

    // 如果文件已存在,尝试删除
    System.IO.FileInfo file = new System.IO.FileInfo(fileNameString);
    if (file.Exists)
    {
        try
        {
            file.Delete();
        }
        catch (Exception error)
        {
            return;
        }
    }

    // 声明 Excel 应用程序对象
    Microsoft.Office.Interop.Excel.Application objExcel = null;
    Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;
    Microsoft.Office.Interop.Excel.Worksheet objsheet = null;

    try
    {
        objExcel = new Microsoft.Office.Interop.Excel.Application(); // 创建 Excel 应用实例
        objWorkbook = objExcel.Workbooks.Add(System.Reflection.Missing.Value); // 新建工作簿
        objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet; // 获取活动工作表

        objExcel.Visible = false; // 设置 Excel 不可见

        // 写入表头到 Excel
        int displayColumnsCount = 1; // 可见列的计数器,Excel 的列索引从 1 开始,所以 displayColumnsCount = 1。
        for (int i = 0; i <= Data.ColumnCount - 1; i++)
        {
            if (Data.Columns[i].Visible == true) // 只导出可见列
            {
                objExcel.Cells[1, displayColumnsCount] = Data.Columns[i].HeaderText.Trim();
                displayColumnsCount++;
            }
        }

        // 写入数据到 Excel
        for (int row = 0; row <= Data.RowCount - 1; row++)
        {
            displayColumnsCount = 1; // 重置列计数器
            for (int col = 0; col < colscount; col++)
            {
                if (Data.Columns[col].Visible == true) // 只导出可见列
                {
                    try
                    {
                        ((Microsoft.Office.Interop.Excel.Range)objExcel.Cells[row + 2, displayColumnsCount]).NumberFormatLocal = "@"; // 设置单元格格式为文本
                        objExcel.Cells[row + 2, displayColumnsCount] = Data.Rows[row].Cells[col].Value.ToString().Trim(); // 写入单元格数据
                        displayColumnsCount++;
                    }
                    catch (Exception)
                    {
                        // 忽略单元格写入错误
                    }
                }
            }
        }

        objsheet.Columns.EntireColumn.AutoFit(); // 设置列宽自适应

        // 保存 Excel 文件
        objWorkbook.SaveAs(fileNameString, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
            System.Reflection.Missing.Value, System.Reflection.Missing.Value,
            Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
            System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
    }
    catch (Exception error)
    {
        error.ErrorProcessing.WriteErrrorLog(error.ToString()); // 写入错误日志
    }
    finally
    {
        // 关闭 Excel 应用程序
        if (objWorkbook != null)
        {
            objExcel.DisplayAlerts = false; // 禁止弹出警告框
            objExcel.AlertBeforeOverwriting = false; // 禁止覆盖警告
            objWorkbook.Close(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
        }
        if (objExcel != null && objExcel.Workbooks != null)
        {
            objExcel.Workbooks.Close();
        }
        if (objExcel != null)
        {
            objExcel.Quit(); // 退出 Excel 应用程序
        }

        objsheet = null; // 释放工作表对象
        objWorkbook = null; // 释放工作簿对象
        objExcel = null; // 释放 Excel 应用对象
    }
}
相关推荐
幸福清风6 小时前
Python 完美处理Excel合并单元格:拆分填充+自动合并
python·excel·合并单元格·拆分单元格
数聚天成DeepSData7 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶7 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全
心静自然凉8007 小时前
MySQL主从同步配置(一主一从)
数据库
haidy ahmed7 小时前
企微复杂审批流反序列化:动态表单解析引擎与EAV存储模型
数据库·人工智能·自动化·企业微信
Lihua奏7 小时前
MVCC:为什么多人同时读写数据,数据库还能不乱
数据库
952368 小时前
Redis - 应用
数据库·redis·分布式·缓存
青山木8 小时前
一把 Redis 分布式锁,踩透四个坑:锁争抢、僵尸锁、锁过期、锁丢失
java·数据库·redis·后端
数智化管理手记8 小时前
智能财务如何减少财务加班?智能财务落地需要哪些工具支撑?
大数据·网络·数据库·数据挖掘·精益工程
IvorySQL8 小时前
深度拆解 IvorySQL 去 O 核心解决方案
数据库·人工智能·postgresql