c# - C#中从剪贴板获取数据到DataTable

标签 c# clipboard data-conversion

我正在尝试将剪贴板的内容转换为数据表。

我尝试使用 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 是 String 类可用的函数,因此我假设 ClipboardData 应该是一个字符串。

这可以通过调用:System.Windows.Forms.Clipboard.GetText() 来检索,而不是 Clipboard.GetDataObject(),我假设您正在调用它目前。

在调用 GetText() 方法时,所选单元格将转换为其文本表示形式,每个单元格由空格(或制表符?)分隔,每行由换行符分隔( '\n')。像这样的事情:

1 2 3 4 5 6
a b c d e f

TL;博士;您应该调用 Clipboard.GetText(),而不是 Clipboard.GetDataObject()

关于c# - C#中从剪贴板获取数据到DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982868/

相关文章:

c# - MSpec -> 如何验证一个方法被调用

c# - 在 .NET 项目中移动项目文件

c# - Rebus RabbitMQ 对象序列化

jquery - 从剪贴板粘贴

javascript - 如何读取网站中的剪贴板数据?

python - 如何将回溯对象( sys.exc_info()[2] ,与 sys.exc_traceback 相同)作为字符串获取?

python - 如何将 JSON 字符串转换为 Python 中的字典?

c# - 如何使用反射动态获取对象属性的实例

c - 如何在 C 中将字符串复制到剪贴板?

mysql - 在 MySQL 中将 VARBINARY 转换为 Base64