You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带复选框的Winforms DataGridView导出为Excel文件

你当前使用的CSV导出方案为纯文本格式,本身不支持嵌入Excel表单控件,无法实现复选框保留效果。以下是基于Microsoft Office Interop Excel的实现方案,可生成带原生Excel复选框的xls文件,效果和DataGridView完全一致:

实现步骤

1. 项目前置配置

  • 右键项目 → 选择「添加」→「引用」→ 切换到COM选项卡 → 找到对应版本的Microsoft Excel [版本号] Object Library,添加到项目引用中
  • 在代码文件顶部引入对应命名空间:
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

2. 完整导出方法代码

public static void SaveToExcelWithCheckBox(DataGridView dGV, string strNomArchivo)
{
    Excel.Application excelApp = null;
    Excel.Workbook workbook = null;
    Excel.Worksheet worksheet = null;

    try
    {
        // 初始化Excel实例
        excelApp = new Excel.Application();
        excelApp.Visible = false;
        workbook = excelApp.Workbooks.Add();
        worksheet = (Excel.Worksheet)workbook.Worksheets[1];

        int excelRow = 1;
        int visibleColCount = 0;

        // 写入表头
        for (int j = 0; j < dGV.Columns.Count; j++)
        {
            if (dGV.Columns[j].Visible)
            {
                visibleColCount++;
                worksheet.Cells[excelRow, visibleColCount] = dGV.Columns[j].HeaderText;
            }
        }
        excelRow++;

        // 写入行数据+处理复选框
        for (int i = 0; i < dGV.RowCount; i++)
        {
            if (dGV.Rows[i].IsNewRow) continue; // 跳过空白新增行

            visibleColCount = 0;
            for (int j = 0; j < dGV.Columns.Count; j++)
            {
                if (!dGV.Columns[j].Visible) continue;
                visibleColCount++;

                // 处理复选框列
                if (dGV.Columns[j] is DataGridViewCheckBoxColumn)
                {
                    bool isChecked = Convert.ToBoolean(dGV.Rows[i].Cells[j].Value ?? false);
                    Excel.Range cell = (Excel.Range)worksheet.Cells[excelRow, visibleColCount];
                    
                    // 添加复选框控件,和单元格边框对齐
                    Excel.CheckBox checkBox = (Excel.CheckBox)worksheet.CheckBoxes.Add(
                        cell.Left, cell.Top, cell.Width, cell.Height);
                    checkBox.Caption = ""; // 不显示额外文字
                    checkBox.Value = isChecked ? Excel.XlTriState.xlTrue : Excel.XlTriState.xlFalse;
                    // 可选:设置复选框随单元格移动/调整大小
                    checkBox.Placement = Excel.XlPlacement.xlMoveAndSize;
                }
                // 处理普通列
                else
                {
                    worksheet.Cells[excelRow, visibleColCount] = Convert.ToString(dGV.Rows[i].Cells[j].Value);
                }
            }
            excelRow++;
        }

        // 自适应列宽
        worksheet.UsedRange.EntireColumn.AutoFit();

        // 保存文件
        workbook.SaveAs(strNomArchivo, Excel.XlFileFormat.xlExcel8); // 对应xls格式
        workbook.Close();
        excelApp.Quit();
    }
    catch (Exception ex)
    {
        // 按需添加异常处理逻辑
        throw ex;
    }
    finally
    {
        // 释放COM对象,避免Excel进程残留
        if (worksheet != null) Marshal.ReleaseComObject(worksheet);
        if (workbook != null) Marshal.ReleaseComObject(workbook);
        if (excelApp != null) Marshal.ReleaseComObject(excelApp);
    }
}
注意事项
  • 该方案要求运行环境安装有Microsoft Office Excel,若需要无依赖导出,可替换为EPPlus等开源Excel操作库,仅需修改复选框的创建API即可,整体逻辑完全一致
  • 代码默认保留和原CSV导出一致的逻辑:仅导出可见列、跳过DataGridView的空白新增行
  • 导出时COM对象必须按顺序释放,否则会出现后台Excel进程残留的问题

内容的提问来源于stack exchange,提问作者Jose Leonardo Quiñones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:54:04