当前位置: 首页 > news >正文

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

实现思路:
1.检查数据是否可导出
2.弹出文件保存对话框
3.删除已存在的同名文件
4.创建 Excel 应用实例
5.导出表头
6.导出数据
7.保存 Excel 文件
8.释放 Excel 资源
9.导出成功提示

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 应用对象
    }
}

相关文章:

  • 【Python项目】文本相似度计算系统
  • IOT通道MQTT
  • 代码随想录算法营Day42 | 322. 零钱兑换,279. 完全平方数,139. 单词拆分
  • STM32 定时器产生定周期方法
  • 上位机知识篇---与、或、移位操作(、|、>><<)
  • AOSP Android14 部分页面使用触摸会崩溃
  • 视频转序列帧
  • 巧用 PasteMate,联合 DeepSeek 与 LaTeX 高效生成 PDF 文档
  • ERP对制造业务有何价值?
  • Ubuntu18.04安装rvm、ruby2.6.5和rails5.2.6
  • eBPF驱动的实时内核安全防护体系:构建零日漏洞免疫的云原生基础设施
  • 深度学习笔记之自然语言处理(NLP)
  • DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)
  • 豪越科技:消防安全重点单位一体化安全管控
  • LLM有哪些可控超参数
  • MySQL性能优化
  • Redis(高阶篇)03章——缓存双写一致性之更新策略探讨
  • Azure Synapse Dedicated SQL Pool统计指定表中各字段的空值、空字符串或零值比例
  • 什么是 近端策略优化算法PPO
  • 【动态规划】(二)动态规划——0-1背包问题
  • 申论|空间更新结合“青银共生”,助力青年发展型城区建设
  • 联合国第二届运动会闭幕,刘国梁受邀成为“联合国运动会大使”
  • 以军向也门3个港口的居民发布撤离令
  • 上海首发经济“卷”到会展业,浦东签约三个年度“首展”
  • 习近平举行仪式欢迎巴西总统卢拉访华
  • 外国游客“在华扫货”热:“带空箱子到中国!”