Winform程序中将datagridview导出到excel (推荐)

news/2025/9/26 16:49:16/文章来源:https://www.cnblogs.com/lrzy/p/19113793

使用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.mzph.cn/news/918546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二章Pycharm和Jupiter

第二章Pycharm和Jupiter 一.Pycharm 在python console里的操作如下:右侧会像matlab一样显示变量二.Jupyter 1.下载Jupyter所需要的包 先进入环境(激活) conda activate pytorchnow conda install nb_conda2.进入Jup…

[吾爱原创] 【小众应用】鼠标键盘操作可视化设备v1.1 可用于教育培训/演示/远程辅助等

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微服务基础3-服务保护与分布式事务 - 详解

微服务基础3-服务保护与分布式事务 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

网站首页列表布局设计淘宝关键词指数查询

使用微软的com组件Microsoft.office.Interop.Excel读写Excel文件虽然可用&#xff0c;但是列多、行多的时候速度很慢&#xff0c;之前测试过Sylvan.Data.Excel包的用法&#xff0c;如果只是读取Excel文件内容的话&#xff0c;还可以使用ExcelDataReader包&#xff0c;后者是C#开…

使用parted命令扩容vm内磁盘分区大小

假如已经在VMware的设置里扩容了磁盘大小,接下来需要在系统内调整大小,按如下操作: 0、查看磁盘情况: root@ubuntu:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 160G 0 disk ├─s…

pyinstaller

pyinstaller --onefile --windowed -i binglish.ico --add-data "binglish.ico;." --hidden-import "pystray._win32" binglish.py 使用 PyInstaller 工具将 Python 脚本 binglish.py 打包成一个独…

wordpress 子网站重命名东莞毛织厂家东莞网站建设

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

帮建网站wordpress微信个人支付

介绍&#xff1a; Python推导式是一种简洁、高效的创建列表、字典或集合的方法。它使用一种类似于数学公式的语法&#xff0c;通过一个表达式和一个循环来生成一个新的数据结构。 以下是一些常见的Python推导式&#xff1a; 列表推导式&#xff08;List Comprehension&#xf…

国外网站配色平凉哪有做网站的

【为什么要用多线程&#xff1f;】 传统的图形用户界面应用程序都仅仅有一个运行线程&#xff0c;而且一次仅仅运行一个操作。假设用户从用户界面中调用一个比較耗时的操作&#xff0c;当该操作正在运行时&#xff0c;用户界面一般会冻结而不再响应。这个问题能够用事件处理和多…

吴江区建设局网站中装建设公司待遇好吗

容器分为三类&#xff0c;顺序容器&#xff0c;关联容器和适配器。顺序容器又分为连续的容器&#xff08;vector&#xff0c;array&#xff09;&#xff0c;顺序容器中的离散容器&#xff08;list&#xff0c;slist&#xff0c;forward_list&#xff09;&#xff0c;离连形的de…

pc网站 手机网站 微信长春公司做网站

笔记整理&#xff1a;刘尧锟&#xff0c;天津大学硕士链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3404835.3462900动机面对大量的机器学习&#xff08;ML&#xff09;方法&#xff0c;为给定的数据集和任务选择合适的方法是一个挑战。一般来说&#xff0c;ML方法或数…

wordpress 双语站点自己使用原生php做网站性能

目录 1.题目描述 一 2.解题想法图解 2.1直接解 2.2巧解 3.题目描述二 3.1.1思路1 3.1.2 思路2 4.结语 1.题目描述 一 实现现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 2.解题想法图解 2.…

Python 标准库 typing 类型注解标注

Python 标准库 typing 类型注解标注Python 标准库 typing 类型注解标注说明 《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习…

redis-Geospatial类型基本命令

redis-Geospatial类型基本命令redis在3.2版本中引入了Geospatial数据类型。该类别本质上是一种集合,不过集合中的元素比较特殊, 是一种由三部分构成的数据结构,这种数据结构称之为空间元素: 经度: longitude,有效…

洛谷题单指南-进阶数论-P3861 拆分

原题链接:https://www.luogu.com.cn/problem/P3861 题意解读:将整数n拆分成不同因数之积的方案数,不含1*n的情况。 解题思路: 1、背景知识-超级合数 n的数据范围最大是10^12,尽管n很大,但是n以内的整数的约数个数…

查网站域名备案wordpress主导航菜单

AItoolchain主要模块包括&#xff1a; 模型转换&#xff1a;将深度学习模型转换为特定硬件平台可以识别和执行的格式。嵌入式运行环境&#xff1a;提供异构模型的运行库支持&#xff0c;确保模型在目标设备上的运行效率。性能验证&#xff1a;包括静态和动态性能评估&#xff…

线程的状态流转

线程的状态流转从JAVA源码可以得出有6种状态 NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED通过代码解释说明初始化状态是NEWpublic static void main(String[] args) throws InterruptedException { Th…

从方向向量获取y轴旋转值

常用方案三进行模型控制 方案 1:直接用 lookAt 如果你的方向向量是从 A → B,那么可以用 lookAt: const dir = p2.clone().sub(p1).normalize(); // 世界方向向量 const target = p1.clone().add(dir); // …

verilog一些操作符和特殊函数

还是写下来,用的少记不住 1.verilog +: reg [31:0] dword; reg [7:0] byte0; reg [7:0] byte1; reg [7:0] byte2; reg [7:0] byte3; assign byte0 = dword[0 +: 8]; // Same as dword[7:0] assign byte1 = dword[…

AI工作流详解以及应用场景(AI)

AI工作流通过节点化组件编排实现任务自动化,平衡确定性与适应性演进,形成三层技术架构(能力层、节点层、编排层)。主流平台如n8n、Dify、Coze各具优势,适用于不同场景。典型应用包括跨境电商自动化、法律合同审查…