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 应用对象
    }
}
相关推荐
归海_一刀10 分钟前
【Unity动态换装骨骼合并】
unity·c#·游戏引擎
千羽星弦19 分钟前
oracle体系结构
数据库·oracle
小安同学iter1 小时前
Redis入门(Java中操作Redis)
数据库·redis·缓存
zxsz_com_cn1 小时前
医疗设备预测性维护的合规性挑战与标准化路径研究
大数据·数据库·人工智能
扣丁梦想家1 小时前
Spring Boot 实现 Excel 导出功能(支持前端下载 + 文件流)
spring boot·后端·excel
赤橙红的黄2 小时前
Spring编程式事务(本地事务)
java·数据库·spring
hkfkn2 小时前
SQL刷题日志(day2)
数据库·sql
潇湘秦2 小时前
Oracle19C低版本一天遭遇两BUG(ORA-04031/ORA-600)
数据库·oracle
自由生长20242 小时前
数据的多版本管理-第一篇-数据库
数据库