gpt4 book ai didi

c# - 从 Excel 粘贴到 C# 应用程序,保持完全精确

转载 作者:太空狗 更新时间:2023-10-29 20:14:20 25 4
gpt4 key购买 nike

我在 Excel 电子表格中有如下值的数据:

  • 0.69491375
  • 0.31220394

单元格的格式设置为百分比,并设置为显示两位小数。所以它们在 Excel 中显示为:

  • 69.49%
  • 31.22%

我有一个 C# 程序可以从 Clipboard 中解析这些数据。

var dataObj = Clipboard.GetDataObject();
var format = DataFormats.CommaSeparatedValue;

if (dataObj != null && dataObj.GetDataPresent(format))
{
var csvData = dataObj.GetData(format);
// do something
}

问题是 csvData 包含来自 Excel 的显示值,即“69.49%”和“31.22%”。它不包含额外小数位的完整精度。

我尝试过使用各种不同的 DataFormats 值,但数据只包含来自 Excel 的显示值,例如:

  • DataFormats.Dif
  • DataFormats.Rtf
  • DataFormats.UnicodeText
  • 等等

作为测试,我安装了 LibreOffice Calc 并将相同的单元格从 Excel 复制/粘贴到 Calc 中。 Calc 保留了原始数据的全部精度。

很明显,Excel 将这些数据放在其他程序可以访问的地方。如何从我的 C# 应用程序访问它?

编辑 - 后续步骤。

我已经下载了 LibreOffice Calc 源代码,我将四处看看是否可以找到他们如何从 Excel 中获取复制数据的完整上下文。

我还对从剪贴板返回的数据对象执行了 GetFormats() 调用,得到了 24 种不同数据格式的列表,其中一些不在 DataFormats 枚举。其中包括 Biff12Biff8Biff5Format129 等我不熟悉的格式,所以我我会调查这些,如果有任何发现,我会做出回应...

最佳答案

也不是一个完整的答案,而是对问题的一些进一步见解:

当您复制单个 Excel 单元格时,剪贴板中最终会出现一个完整的 Excel 工作簿,其中包含一个电子表格,而电子表格又包含一个单元格:

var dataObject = Clipboard.GetDataObject();
var mstream = (MemoryStream)dataObject.GetData("XML Spreadsheet");

// Note: For some reason we need to ignore the last byte otherwise
// an exception will occur...
mstream.SetLength(mstream.Length - 1);

var xml = XElement.Load(mstream);

现在,当您将 XElement 的内容转储到控制台时,您可以看到您确实获得了一个完整的 Excel 工作簿。此外,“XML 电子表格”格式包含存储在单元格中的数字的内部表示。所以我想您可以使用 Linq-To-Xml 或类似工具来获取您需要的数据:

XNamespace ssNs = "urn:schemas-microsoft-com:office:spreadsheet";

var numbers = xml.Descendants(ssNs + "Data").
Where(e => (string)e.Attribute(ssNs + "Type") == "Number").
Select(e => (double)e);

我还尝试使用 Excel Data Reader 读取 Biff 格式然而,生成的数据集总是空的......

关于c# - 从 Excel 粘贴到 C# 应用程序,保持完全精确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8614910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com