Winform程序中将datagridview导出到excel (推荐)
使用DEEPSEEK推荐的导出方法,好的很!
用前要用nuget 安装 ClosedXML 插件包
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ClosedXML.Excel; namespace drp.Common { public class ExcelIO { public void ExportWithClosedXML(DataGridView dgv) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" }) { if (sfd.ShowDialog() == DialogResult.OK) { using (XLWorkbook wb = new XLWorkbook()) { var ws = wb.Worksheets.Add("Sheet1"); // 导出列头 for (int i = 0; i < dgv.Columns.Count; i++) { // 使用 SetValue 方法避免类型错误 ws.Cell(1, i + 1).SetValue(dgv.Columns[i].HeaderText); } // 导出数据 for (int i = 0; i < dgv.Rows.Count; i++) { // 跳过新行(如果允许添加行) if (dgv.Rows[i].IsNewRow) continue; for (int j = 0; j < dgv.Columns.Count; j++) { var cellValue = dgv.Rows[i].Cells[j].Value; // 处理空值 if (cellValue == null || cellValue == DBNull.Value) { ws.Cell(i + 2, j + 1).SetValue(string.Empty); } else { // 根据数据类型设置值 if (dgv.Columns[j].ValueType == typeof(DateTime)) { ws.Cell(i + 2, j + 1).SetValue((DateTime)cellValue); ws.Cell(i + 2, j + 1).Style.DateFormat.Format = "yyyy-mm-dd"; } else if (IsNumericType(dgv.Columns[j].ValueType)) { ws.Cell(i + 2, j + 1).SetValue(Convert.ToDouble(cellValue)); } else { ws.Cell(i + 2, j + 1).SetValue(cellValue.ToString()); } } } } for (int i = 0; i < dgv.Columns.Count; i++) { // 获取DataGridView列的宽度(像素) int colWidth = dgv.Columns[i].Width; // 计算Excel列宽 double excelWidth = (colWidth / 7.0) + 1; // 设置最小和最大宽度限制 if (excelWidth < 2) excelWidth = 2; if (excelWidth > 50) excelWidth = 50; // 设置Excel列宽 ws.Column(i + 1).Width = excelWidth; // 如果内容比列宽更宽,则自动调整列宽 if (ws.Column(i + 1).Width < ws.Column(i + 1).CellsUsed().Max(c => c.Value.ToString().Length) * 0.8) { ws.Column(i + 1).AdjustToContents(); } } // 自动调整列宽 ws.Columns().AdjustToContents(); wb.SaveAs(sfd.FileName); } MessageBox.Show("导出成功!"); } } } public void ExportToExcel(DataGridView dgv) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" }) { if (sfd.ShowDialog() == DialogResult.OK) { using (XLWorkbook wb = new XLWorkbook()) { var ws = wb.Worksheets.Add("Sheet1"); // 创建数据表 var dataTable = new System.Data.DataTable(); // 添加列头 foreach (DataGridViewColumn column in dgv.Columns) { dataTable.Columns.Add(column.HeaderText); } // 添加数据行 foreach (DataGridViewRow row in dgv.Rows) { if (row.IsNewRow) continue; var dataRow = dataTable.NewRow(); foreach (DataGridViewCell cell in row.Cells) { dataRow[cell.ColumnIndex] = cell.Value ?? DBNull.Value; } dataTable.Rows.Add(dataRow); } // 批量插入数据(从第一行第一列开始) ws.Cell(1, 1).InsertTable(dataTable); // 设置列宽 for (int i = 0; i < dgv.Columns.Count; i++) { // 获取DataGridView列的宽度(像素) int colWidth = dgv.Columns[i].Width; // 计算Excel列宽 double excelWidth = (colWidth / 7.0) + 1; // 设置最小和最大宽度限制 if (excelWidth < 2) excelWidth = 2; if (excelWidth > 50) excelWidth = 50; // 设置Excel列宽 ws.Column(i + 1).Width = excelWidth; // 如果内容比列宽更宽,则自动调整列宽 if (ws.Column(i + 1).Width < ws.Column(i + 1).CellsUsed().Max(c => c.Value.ToString().Length) * 0.8) { ws.Column(i + 1).AdjustToContents(); } } wb.SaveAs(sfd.FileName); } MessageBox.Show("导出成功!"); } } } public void Export(DataGridView dgv) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" }) { if (sfd.ShowDialog() == DialogResult.OK) { using (XLWorkbook wb = new XLWorkbook()) { var ws = wb.Worksheets.Add("Sheet1"); // 创建数据表 var dataTable = new DataTable(); // 添加列头并设置数据类型 foreach (DataGridViewColumn column in dgv.Columns) { // 使用DataGridView列的数据类型(如果可用) Type dataType = column.ValueType ?? typeof(object); dataTable.Columns.Add(column.HeaderText, dataType); } // 添加数据行 foreach (DataGridViewRow row in dgv.Rows) { if (row.IsNewRow) continue; var dataRow = dataTable.NewRow(); foreach (DataGridViewCell cell in row.Cells) { if (cell.Value == null || cell.Value == DBNull.Value) { // 根据列的数据类型设置默认值 if (dataTable.Columns[cell.ColumnIndex].DataType == typeof(string)) { dataRow[cell.ColumnIndex] = ""; } else if (IsNumericType(dataTable.Columns[cell.ColumnIndex].DataType)) { dataRow[cell.ColumnIndex] = 0; } else { dataRow[cell.ColumnIndex] = DBNull.Value; } } else { dataRow[cell.ColumnIndex] = cell.Value; } } dataTable.Rows.Add(dataRow); } // 批量插入数据(从第一行第一列开始) var tableRange = ws.Cell(1, 1).InsertTable(dataTable); // 设置列宽 for (int i = 0; i < dgv.Columns.Count; i++) { int colWidth = dgv.Columns[i].Width; double excelWidth = (colWidth / 7.0) + 1; if (excelWidth < 2) excelWidth = 2; if (excelWidth > 50) excelWidth = 50; ws.Column(i + 1).Width = excelWidth; } // 关键:设置数值列的格式为数字 for (int i = 0; i < dgv.Columns.Count; i++) { if (IsNumericType(dataTable.Columns[i].DataType)) { // 设置整列为数字格式 ws.Column(i + 1).Style.NumberFormat.Format = "#,##0.00"; // 对于整数类型,去掉小数部分 if (dataTable.Columns[i].DataType == typeof(int) || dataTable.Columns[i].DataType == typeof(long)) { ws.Column(i + 1).Style.NumberFormat.Format = "#,##0"; } } } wb.SaveAs(sfd.FileName); } MessageBox.Show("导出成功!"); } } } // 辅助方法:检查是否为数值类型 private bool IsNumericType(Type type) { switch (Type.GetTypeCode(type)) { case TypeCode.Byte: case TypeCode.SByte: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Decimal: case TypeCode.Double: case TypeCode.Single: return true; default: return false; } } } }
活到老,学到老。

浙公网安备 33010602011771号