如何用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); } }
关键改进点
- 唯一文件名:通过精确到秒的时间戳生成文件名,确保每次导出文件不重复
- 空值处理:避免空单元格导致的空引用异常
- 资源安全:通过
finally或using语句保证文件流/Excel包正确关闭 - 用户自主选择:支持用户选择导出格式和保存路径,提升操作灵活性
内容的提问来源于stack exchange,提问作者elbays
相关产品推荐
相关产品推荐

