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 应用对象
    }
}
相关推荐
风随心飞飞7 小时前
linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
linux·数据库·mysql
奥尔特星云大使7 小时前
读写分离中间件简介
数据库·mysql·中间件·读写分离
WangMing_X7 小时前
《使用模块化分层来达到企业级项目要求》
开发语言·c#
友莘居士7 小时前
高效处理 Excel 海量数据入库:编程脚本、CSV 中间件、图形工具优化全攻略
数据库·中间件·excel·csv·海量数据·入库
Han.miracle8 小时前
数据库圣经第二章——简单的my.ini基础配置介绍
数据库
八怪9 小时前
KILL MTS的一个worker线程会怎么样
数据库
傻啦嘿哟9 小时前
Python高效实现Excel转PDF:无Office依赖的轻量化方案
python·pdf·excel
weixin_436525079 小时前
Excel 下拉选项设置 级联式
excel
极智-9969 小时前
Excel如何排序?【图文详解】Excel表格排序?Excel自动排序?
excel·excel排序·excel如何排序·excel表格排序·excel自动排序·excel多组合排序·excel单列排序
-Xie-10 小时前
Mysql杂志(三十一)——Join连接算法与子查询、排序优化
数据库·mysql