C# WinForm:从Excel复制单元格完整数值至DataGridView的方法
解决Excel复制原始数值到C# WinForm DataGridView的问题
当Excel单元格设置了显示格式(比如保留两位小数),直接用Clipboard.GetText()只能拿到格式化后的显示值,无法获取单元格的原始数值。要解决这个问题,需要读取剪贴板中Excel存储的原始数据,而非纯文本格式。
解决方案:解析剪贴板的HTML格式数据
Excel复制单元格时,会在剪贴板中同时存储HTML格式的数据,其中<td>标签的x:num属性保存了单元格的原始数值。我们可以通过解析这段HTML提取原始值。
步骤1:安装HtmlAgilityPack包
先在项目中安装HtmlAgilityPack NuGet包,用于解析HTML内容。
步骤2:编写代码读取并解析剪贴板数据
using System; using System.Windows.Forms; using System.Globalization; using HtmlAgilityPack; // 检查剪贴板是否包含HTML格式数据 if (Clipboard.ContainsData(DataFormats.Html)) { string htmlContent = Clipboard.GetText(TextDataFormat.Html); HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 查找包含x:num属性的td节点 var targetTd = htmlDoc.DocumentNode.SelectSingleNode("//td[@x:num]"); if (targetTd != null) { // 获取原始数值字符串 string originalNumStr = targetTd.Attributes["x:num"].Value; // 根据系统区域转换为数值类型(示例用不变文化,若你的系统用逗号做小数分隔符,需替换为对应区域Culture) if (decimal.TryParse(originalNumStr, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out decimal originalValue)) { // 将原始值添加到DataGridView dataGridView1.Rows.Add(originalValue); } } }
说明
- 若你的系统区域设置使用逗号作为小数分隔符(如土耳其语区域),解析时需将
CultureInfo.InvariantCulture替换为CultureInfo.GetCultureInfo("tr-TR")(或对应区域代码)。 - 该方法仅适用于Excel复制的内容,若剪贴板内容来自其他软件,可能不包含
x:num属性。
内容的提问来源于stack exchange,提问作者Gokhan
相关产品推荐
相关产品推荐

