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

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;}}}
}

 

http://www.rkmt.cn/news/12380.html

相关文章:

  • 第二章Pycharm和Jupiter
  • 微服务基础3-服务保护与分布式事务 - 详解
  • 剖析布谷相亲婚恋交友app源码之关键论述
  • 将网站展示图片的格式由 JPG 切换到了 WebP
  • Python 标准库 typing 类型注解标注
  • 从方向向量获取y轴旋转值
  • verilog一些操作符和特殊函数
  • 20250820_浙江省职业职工技能竞赛_crypto
  • 第一章pytorch安装
  • 深入解析:i.MX6ULL移植内核6.6(一)修改网络驱动和LCD驱动
  • 【MySQL】XML中基于已有查询代码,进一步做汇总统计
  • 别再一张证件照用到底了,我建了个“个人形象库”
  • 【SPIE出版】第七届地球科学与遥感测绘国际学术会议(GRSM 2025)
  • ARL(灯塔)安装步骤--超简单!!
  • 基于MATLAB的经典车辆路径问题(VRP)求解方法详解
  • 14种纯css3对话气泡样式代码
  • AI agent编程随记
  • 再见 Claude Code!玩转 CodeX CLI 的 16 个实用小技巧,效率拉满!!
  • 【IEEE出版】第五届电气工程与机电一体化技术国际学术会议(ICEEMT 2025)
  • HT-AD5PS-1+:1–400 MHz“五路小方糖”,一张板子省掉三种料!
  • 一站式电竞平台解决方案:数据、直播、源码,助力业务飞速启航 - 数据服务
  • PostgreSQL patroni 高可用 3:patroni 运维
  • nfs故障排查
  • 业绩亮眼,转型仍有隐忧,若羽臣赴港上市能否实现价值重构? - 指南
  • 基于CSMA/CA协议的V2X通信MATLAB仿真
  • 【招聘专场】想斩获高含金量名企Offer?京东、微芯研究院等企业 软件测试开发岗,虚位以待!
  • 练习题:成绩评定系统
  • Day22方法重写
  • 深入解析:list的学习
  • 实用指南:用Playwright实现接口自动化测试:从基础到实战