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

如何用C#实现每次点击按钮将DataGridView另存为不同Excel/TXT文件

解决DataGridView内容每次保存为不同Excel/TXT文件的问题

原代码存在两个核心问题:

  • 固定文件名导致每次保存都会覆盖原有文件
  • 仅实现了TXT格式导出,未支持Excel

以下是修改后的完整实现,支持每次生成唯一文件名,并同时提供TXT和Excel两种导出选项:

一、修改TXT导出逻辑(生成唯一文件名)

通过在文件名中添加时间戳(年月日时分秒)保证每次文件名唯一,避免覆盖:

private void button5_Click(object sender, EventArgs e)
{
    // 生成带时间戳的唯一文件名,避免覆盖
    string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
    string txtFilePath = $@"C:\Users\DiktaşHaftalikUretim\table_{timestamp}.txt";

    System.IO.StreamWriter file = null;
    try
    {
        file = new System.IO.StreamWriter(txtFilePath);
        string sLine = "";

        // 遍历DataGridView行(排除最后一行空行)
        for (int r = 0; r < dataGridView2.Rows.Count - 1; r++)
        {
            // 遍历列
            for (int c = 0; c < dataGridView2.Columns.Count; c++)
            {
                // 处理空值,避免空引用异常
                sLine += dataGridView2.Rows[r].Cells[c].Value?.ToString() ?? "";
                if (c != dataGridView2.Columns.Count - 1)
                {
                    sLine += ",";
                }
            }
            file.WriteLine(sLine);
            sLine = "";
        }

        MessageBox.Show($"TXT导出完成,文件路径:{txtFilePath}", "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception err)
    {
        MessageBox.Show($"导出失败:{err.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        // 确保文件始终关闭,避免资源泄漏
        file?.Close();
    }
}

二、添加Excel导出功能(生成唯一文件名)

要实现Excel导出,需先通过NuGet安装EPPlus包,以下是完整实现:

using OfficeOpenXml;

private void ExportToExcel()
{
    // 生成带时间戳的唯一Excel文件名
    string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
    string excelFilePath = $@"C:\Users\DiktaşHaftalikUretim\table_{timestamp}.xlsx";

    // 设置非商用许可证
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    using (ExcelPackage package = new ExcelPackage())
    {
        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("导出数据");

        // 写入表头
        for (int c = 0; c < dataGridView2.Columns.Count; c++)
        {
            worksheet.Cells[1, c + 1].Value = dataGridView2.Columns[c].HeaderText;
        }

        // 写入数据行
        for (int r = 0; r < dataGridView2.Rows.Count - 1; r++)
        {
            for (int c = 0; c < dataGridView2.Columns.Count; c++)
            {
                worksheet.Cells[r + 2, c + 1].Value = dataGridView2.Rows[r].Cells[c].Value?.ToString() ?? "";
            }
        }

        // 自动调整列宽
        worksheet.Cells.AutoFitColumns();

        // 保存文件
        package.SaveAs(new FileInfo(excelFilePath));
        MessageBox.Show($"Excel导出完成,文件路径:{excelFilePath}", "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

三、增强版:让用户选择导出格式和路径

可以通过SaveFileDialog让用户自主选择导出格式和保存路径,进一步提升易用性:

private void button5_Click(object sender, EventArgs e)
{
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.Filter = "文本文件(*.txt)|*.txt|Excel文件(*.xlsx)|*.xlsx";
    saveFileDialog.Title = "选择导出文件路径";
    // 默认带时间戳的文件名
    saveFileDialog.FileName = $"table_{DateTime.Now.ToString("yyyyMMddHHmmss")}";

    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        if (saveFileDialog.FilterIndex == 1)
        {
            ExportToTxt(saveFileDialog.FileName);
        }
        else
        {
            ExportToExcel(saveFileDialog.FileName);
        }
    }
}

// 封装TXT导出方法
private void ExportToTxt(string filePath)
{
    System.IO.StreamWriter file = null;
    try
    {
        file = new System.IO.StreamWriter(filePath);
        string sLine = "";

        for (int r = 0; r < dataGridView2.Rows.Count - 1; r++)
        {
            for (int c = 0; c < dataGridView2.Columns.Count; c++)
            {
                sLine += dataGridView2.Rows[r].Cells[c].Value?.ToString() ?? "";
                if (c != dataGridView2.Columns.Count - 1)
                {
                    sLine += ",";
                }
            }
            file.WriteLine(sLine);
            sLine = "";
        }
        MessageBox.Show("TXT导出完成", "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception err)
    {
        MessageBox.Show($"导出失败:{err.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        file?.Close();
    }
}

// 封装Excel导出方法
private void ExportToExcel(string filePath)
{
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    using (ExcelPackage package = new ExcelPackage())
    {
        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("导出数据");

        // 写入表头
        for (int c = 0; c < dataGridView2.Columns.Count; c++)
        {
            worksheet.Cells[1, c + 1].Value = dataGridView2.Columns[c].HeaderText;
        }

        // 写入数据
        for (int r = 0; r < dataGridView2.Rows.Count - 1; r++)
        {
            for (int c = 0; c < dataGridView2.Columns.Count; c++)
            {
                worksheet.Cells[r + 2, c + 1].Value = dataGridView2.Rows[r].Cells[c].Value?.ToString() ?? "";
            }
        }

        worksheet.Cells.AutoFitColumns();
        package.SaveAs(new FileInfo(filePath));
        MessageBox.Show("Excel导出完成", "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

关键改进点

  1. 唯一文件名:通过精确到秒的时间戳生成文件名,确保每次导出文件不重复
  2. 空值处理:避免空单元格导致的空引用异常
  3. 资源安全:通过finally或using语句保证文件流/Excel包正确关闭
  4. 用户自主选择:支持用户选择导出格式和保存路径,提升操作灵活性

内容的提问来源于stack exchange,提问作者elbays

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40