C#从剪贴板获取数据到DataTable
Get data from Clipboard to DataTable in C#
我正在尝试将剪贴板的内容转换为数据表。
我尝试使用 URL 中的以下代码:http://www.seesharpdot.net/?p=221
private void PasteFromExcel()
{
DataTable tbl = new DataTable();
tbl.TableName = "ImportedTable";
List<string> data = new List<string>(ClipboardData.Split('\n'));
bool firstRow = true;
if (data.Count > 0 && string.IsNullOrWhiteSpace(data[data.Count - 1]))
{
data.RemoveAt(data.Count - 1);
}
foreach (string iterationRow in data)
{
string row = iterationRow;
if (row.EndsWith("\r"))
{
row = row.Substring(0, row.Length - "\r".Length);
}
string[] rowData = row.Split(new char[] { '\r', '\x09' });
DataRow newRow = tbl.NewRow();
if (firstRow)
{
int colNumber = 0;
foreach (string value in rowData)
{
if (string.IsNullOrWhiteSpace(value))
{
tbl.Columns.Add(string.Format("[BLANK{0}]", colNumber));
}
else if (!tbl.Columns.Contains(value))
{
tbl.Columns.Add(value);
}
else
{
tbl.Columns.Add(string.Format("Column {0}", colNumber));
}
colNumber++;
}
firstRow = false;
}
else
{
for (int i = 0; i < rowData.Length; i++)
{
if (i >= tbl.Columns.Count) break;
newRow[i] = rowData[i];
}
tbl.Rows.Add(newRow);
}
}
this.WorkingTableElement.WorkingTable = tbl;
tableImportGrid.DataSource = null;
tableImportGrid.RefreshDataSource();
tableImportGrid.DataSource = tbl;
tableImportGrid.RefreshDataSource();
tableImportGrid.Refresh();
}
但是下面的部分代码:
List<string> data = new List<string>(ClipboardData.Split('\n'));
给我带来了一些麻烦。我知道 ClipboardData 应该已经引用了剪贴板内容,但我尝试使用 DataObject 来实现这一点,但这没有用。
也许有人知道如何实施这个或一些指导方针如何前进。我接触 C# 的次数不多,主要是在 Python.
中完成我的编程
Split 是一个可用于字符串的函数 class,所以我假设 ClipboardData 应该是一个字符串。
这可以通过调用 System.Windows.Forms.Clipboard.GetText()
来检索,而不是 Clipboard.GetDataObject()
,我假设您现在正在调用它。
调用 GetText()
方法时,所选单元格将转换为其文本表示形式,每个单元格由 space(或制表符?)分隔,每行由换行符分隔('\n'
)。像这样:
1 2 3 4 5 6
a b c d e f
TL;DR;你应该调用 Clipboard.GetText()
,而不是 Clipboard.GetDataObject()
.
我正在尝试将剪贴板的内容转换为数据表。
我尝试使用 URL 中的以下代码:http://www.seesharpdot.net/?p=221
private void PasteFromExcel()
{
DataTable tbl = new DataTable();
tbl.TableName = "ImportedTable";
List<string> data = new List<string>(ClipboardData.Split('\n'));
bool firstRow = true;
if (data.Count > 0 && string.IsNullOrWhiteSpace(data[data.Count - 1]))
{
data.RemoveAt(data.Count - 1);
}
foreach (string iterationRow in data)
{
string row = iterationRow;
if (row.EndsWith("\r"))
{
row = row.Substring(0, row.Length - "\r".Length);
}
string[] rowData = row.Split(new char[] { '\r', '\x09' });
DataRow newRow = tbl.NewRow();
if (firstRow)
{
int colNumber = 0;
foreach (string value in rowData)
{
if (string.IsNullOrWhiteSpace(value))
{
tbl.Columns.Add(string.Format("[BLANK{0}]", colNumber));
}
else if (!tbl.Columns.Contains(value))
{
tbl.Columns.Add(value);
}
else
{
tbl.Columns.Add(string.Format("Column {0}", colNumber));
}
colNumber++;
}
firstRow = false;
}
else
{
for (int i = 0; i < rowData.Length; i++)
{
if (i >= tbl.Columns.Count) break;
newRow[i] = rowData[i];
}
tbl.Rows.Add(newRow);
}
}
this.WorkingTableElement.WorkingTable = tbl;
tableImportGrid.DataSource = null;
tableImportGrid.RefreshDataSource();
tableImportGrid.DataSource = tbl;
tableImportGrid.RefreshDataSource();
tableImportGrid.Refresh();
}
但是下面的部分代码:
List<string> data = new List<string>(ClipboardData.Split('\n'));
给我带来了一些麻烦。我知道 ClipboardData 应该已经引用了剪贴板内容,但我尝试使用 DataObject 来实现这一点,但这没有用。
也许有人知道如何实施这个或一些指导方针如何前进。我接触 C# 的次数不多,主要是在 Python.
中完成我的编程Split 是一个可用于字符串的函数 class,所以我假设 ClipboardData 应该是一个字符串。
这可以通过调用 System.Windows.Forms.Clipboard.GetText()
来检索,而不是 Clipboard.GetDataObject()
,我假设您现在正在调用它。
调用 GetText()
方法时,所选单元格将转换为其文本表示形式,每个单元格由 space(或制表符?)分隔,每行由换行符分隔('\n'
)。像这样:
1 2 3 4 5 6
a b c d e f
TL;DR;你应该调用 Clipboard.GetText()
,而不是 Clipboard.GetDataObject()
.