gpt4 book ai didi

c# - 如何使用剪贴板将数据从Excel Sheet复制到DataTable?

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

我有一个在 Microsoft Framework 3.5 上创建的 Winform 项目。用户可能已安装Windows 7或Windows XP,以及Office 2007或以上版本。

我正在处理获取剪贴板数据并将其放入 C# DataTable 的过程。我已经创建了一种从剪贴板获取原始数据并将其上传到 DataTable 的方法。

但在某些情况下,Excel 数据显示一个值,但内部有另一个值:

enter image description here

我正在研究一种从 Excel 中获取原始数据的方法:

string XmlFmt = "XML Spreadsheet";
var clipboard = Clipboard.GetDataObject();

if (clipboard.GetDataPresent(XmlFmt))
{
var clipData = clipboard.GetData(XmlFmt);
StreamReader streamReader = new StreamReader((MemoryStream)clipData);
streamReader.BaseStream.SetLength(streamReader.BaseStream.Length - 1);

string xmlText = streamReader.ReadToEnd();
var stream = new StringReader(xmlText);

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);

DataSet dsExcelData = new DataSet();
dsExcelData.ReadXml(new XmlNodeReader(xmlDocument));
}

但是,此方法为我检索了一个包含多个表的数据集,其中包含 Excel 数据的每个部分的配置: enter image description here enter image description here

基本上,我想将这些结构转换为仅包含原始数据的简单 DataTable。有人可以帮我提示如何实现这一目标吗?...我不想在此实现中使用第三方库。

最佳答案

我找到了一个干净且防弹的解决方案。这里的代码:

首先,将 XmlDocument 转换为 XElement 的扩展:

/// <summary> Convert XML Document to XDocument </summary>
/// <param name="xmlDocument">Attached XML Document</param>
public static XDocument fwToXDocument(this XmlDocument xmlDocument)
{
using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument))
{
xmlNodeReader.MoveToContent();
return XDocument.Load(xmlNodeReader);
}
}

完整的功能:

private DataTable clipboardExcelToDataTable(bool blnFirstRowHasHeader = false)
{
string strTime = "S " + DateTime.Now.ToString("mm:ss:fff");
var clipboard = Clipboard.GetDataObject();
if (!clipboard.GetDataPresent("XML Spreadsheet")) return null;

strTime += "\r\nRead " + DateTime.Now.ToString("mm:ss:fff");
StreamReader streamReader = new StreamReader((MemoryStream)clipboard.GetData("XML Spreadsheet"));
strTime += "\r\nFinish read " + DateTime.Now.ToString("mm:ss:fff");
streamReader.BaseStream.SetLength(streamReader.BaseStream.Length - 1);

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(streamReader.ReadToEnd());
strTime += "\r\nRead XML Document " + DateTime.Now.ToString("mm:ss:fff");

XNamespace ssNs = "urn:schemas-microsoft-com:office:spreadsheet";
DataTable dtData = new DataTable();

var linqRows = xmlDocument.fwToXDocument().Descendants(ssNs + "Row").ToList<XElement>();

for (int x = 0; x < linqRows.Max(a => a.Descendants(ssNs + "Cell").Count()); x++)
dtData.Columns.Add("Column " + (x + 1).ToString());

int intCol = 0;

DataRow drCurrent;

linqRows.ForEach(rowElement =>
{
intCol = 0;
drCurrent = dtData.Rows.Add();
rowElement.Descendants(ssNs + "Cell")
.ToList<XElement>()
.ForEach(cell => drCurrent[intCol++] = cell.Value);
});

if (blnFirstRowHasHeader)
{
int x = 0;
foreach (DataColumn dcCurrent in dtData.Columns)
dcCurrent.ColumnName = dtData.Rows[0][x++].ToString();

dtData.Rows.RemoveAt(0);
}

strTime += "\r\nF " + DateTime.Now.ToString("mm:ss:fff");

return dtData;
}

这个过程需要大约 15 秒来读取大约 25,000 行。

适用于任何类型的数据。基本上,该方法会创建一个与 Excel WorkSheet 具有相同结构的网格。行或列的合并将填满第一个单元格。默认情况下,所有列都是字符串数据类型。

关于c# - 如何使用剪贴板将数据从Excel Sheet复制到DataTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43793360/

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