none
Вставка табличных данных из буфера обмена

    Вопрос

  • Всем привет!

    Ребят, задача следующая: нужно достать из буфера обмена данные, а именно - столбец, скопированный из Excel и скопировать этот столбец из буфера обмена в столбец dataGridView. Будет круто, если можно будет скопировать Ctrl+C и нажав на dataGridView Ctrl+V и все красиво скопируется в ячейки.

    30 октября 2018 г. 20:14

Ответы

  • Excel помещает данные в буфер обмена в нескольких форматах. Проще всего, наверное, прочитать HTML:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();            
            }
    
            //Добавить ссылку: COM / Microsoft HTML Objects Library
    
            private void button1_Click(object sender, EventArgs e)
            {
                var data = Clipboard.GetDataObject();               
    
                string html = (string)data.GetData("HTML Format");
                if (html==null)
                {
                    MessageBox.Show("В буфере обмена нет подходящих данных");
                    return;
                }
    
                mshtml.HTMLDocument doc = null;
                mshtml.IHTMLDocument2 d2 = null;
                mshtml.IHTMLDocument3 d = null;
                mshtml.IHTMLElementCollection tables = null;
                mshtml.IHTMLElement table = null;
                mshtml.IHTMLElementCollection rows = null;
                mshtml.IHTMLElementCollection cells = null;
                mshtml.IHTMLElement rowelem = null;
                mshtml.IHTMLElement cellelem = null;
    
                DataTable dt = new DataTable();
    
                try
                {
                    //грузим документ в парсер
                    doc = new mshtml.HTMLDocument();
                    d2 = (mshtml.IHTMLDocument2)doc;
                    d2.write(html);
    
                    //находим table
                    d = (mshtml.IHTMLDocument3)doc;
                    tables = d.getElementsByTagName("table");
                    if (tables.length == 0)
                    {
                        MessageBox.Show("В буфере обмена нет таблицы");
                        return;
                    }
    
                    table = tables.item(0);                    
    
                    rows = (table as mshtml.IHTMLElement2).getElementsByTagName("tr");
                    for (int n = 0; n < rows.length; n++)                    
                    {
                        if (rowelem != null)
                        {
                            Marshal.ReleaseComObject(rowelem);
                            rowelem = null;
                        }
    
                        if (cells != null)
                        {
                            Marshal.ReleaseComObject(cells);
                            cells = null;
                        }
    
                        rowelem = rows.item(n);
    
                        //получаем значения ячеек
                        List<string> values = new List<string>();
                        cells = (rowelem as mshtml.IHTMLElement2).getElementsByTagName("td");
                        for (int i=0;i< cells.length; i++)
                        {
                            if (cellelem != null)
                            {
                                Marshal.ReleaseComObject(cellelem);
                                cellelem = null;
                            }
    
                            cellelem = cells.item(i);
                            values.Add(cellelem.innerText);                        
                        }
    
                        //добавим недостающие столбцы в DataTable
                        if (dt.Columns.Count < values.Count)
                        {
                            int cols = values.Count - dt.Columns.Count;
                            for (int k = 0; k < cols; k++) {                            
                                dt.Columns.Add();
                            }
                        }
    
                        //установим значения ячеек в DataTable
                        DataRow row = dt.NewRow();
                        for(int j = 0; j < values.Count; j++)
                        {
                            row[j] = values[j];
                        }
                        dt.Rows.Add(row);
    
                    }
    
                    dataGridView1.AutoGenerateColumns = true;
                    dataGridView1.DataSource = dt;
                    
                }
                finally
                {
                    //освобождение ресурсов
                    if (doc != null) Marshal.ReleaseComObject(doc);
                    if (d2 != null) Marshal.ReleaseComObject(d2);
                    if (d != null) Marshal.ReleaseComObject(d);
                    if (tables != null) Marshal.ReleaseComObject(tables);
                    if (table != null) Marshal.ReleaseComObject(table);
                    if (rows != null) Marshal.ReleaseComObject(rows);
                    if (cells != null) Marshal.ReleaseComObject(cells);
                    if (rowelem != null) Marshal.ReleaseComObject(rowelem);
                    if (cellelem != null) Marshal.ReleaseComObject(cellelem);
                }
    
            }
        }
    }
    

    2 ноября 2018 г. 5:23

Все ответы

  • Excel помещает данные в буфер обмена в нескольких форматах. Проще всего, наверное, прочитать HTML:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();            
            }
    
            //Добавить ссылку: COM / Microsoft HTML Objects Library
    
            private void button1_Click(object sender, EventArgs e)
            {
                var data = Clipboard.GetDataObject();               
    
                string html = (string)data.GetData("HTML Format");
                if (html==null)
                {
                    MessageBox.Show("В буфере обмена нет подходящих данных");
                    return;
                }
    
                mshtml.HTMLDocument doc = null;
                mshtml.IHTMLDocument2 d2 = null;
                mshtml.IHTMLDocument3 d = null;
                mshtml.IHTMLElementCollection tables = null;
                mshtml.IHTMLElement table = null;
                mshtml.IHTMLElementCollection rows = null;
                mshtml.IHTMLElementCollection cells = null;
                mshtml.IHTMLElement rowelem = null;
                mshtml.IHTMLElement cellelem = null;
    
                DataTable dt = new DataTable();
    
                try
                {
                    //грузим документ в парсер
                    doc = new mshtml.HTMLDocument();
                    d2 = (mshtml.IHTMLDocument2)doc;
                    d2.write(html);
    
                    //находим table
                    d = (mshtml.IHTMLDocument3)doc;
                    tables = d.getElementsByTagName("table");
                    if (tables.length == 0)
                    {
                        MessageBox.Show("В буфере обмена нет таблицы");
                        return;
                    }
    
                    table = tables.item(0);                    
    
                    rows = (table as mshtml.IHTMLElement2).getElementsByTagName("tr");
                    for (int n = 0; n < rows.length; n++)                    
                    {
                        if (rowelem != null)
                        {
                            Marshal.ReleaseComObject(rowelem);
                            rowelem = null;
                        }
    
                        if (cells != null)
                        {
                            Marshal.ReleaseComObject(cells);
                            cells = null;
                        }
    
                        rowelem = rows.item(n);
    
                        //получаем значения ячеек
                        List<string> values = new List<string>();
                        cells = (rowelem as mshtml.IHTMLElement2).getElementsByTagName("td");
                        for (int i=0;i< cells.length; i++)
                        {
                            if (cellelem != null)
                            {
                                Marshal.ReleaseComObject(cellelem);
                                cellelem = null;
                            }
    
                            cellelem = cells.item(i);
                            values.Add(cellelem.innerText);                        
                        }
    
                        //добавим недостающие столбцы в DataTable
                        if (dt.Columns.Count < values.Count)
                        {
                            int cols = values.Count - dt.Columns.Count;
                            for (int k = 0; k < cols; k++) {                            
                                dt.Columns.Add();
                            }
                        }
    
                        //установим значения ячеек в DataTable
                        DataRow row = dt.NewRow();
                        for(int j = 0; j < values.Count; j++)
                        {
                            row[j] = values[j];
                        }
                        dt.Rows.Add(row);
    
                    }
    
                    dataGridView1.AutoGenerateColumns = true;
                    dataGridView1.DataSource = dt;
                    
                }
                finally
                {
                    //освобождение ресурсов
                    if (doc != null) Marshal.ReleaseComObject(doc);
                    if (d2 != null) Marshal.ReleaseComObject(d2);
                    if (d != null) Marshal.ReleaseComObject(d);
                    if (tables != null) Marshal.ReleaseComObject(tables);
                    if (table != null) Marshal.ReleaseComObject(table);
                    if (rows != null) Marshal.ReleaseComObject(rows);
                    if (cells != null) Marshal.ReleaseComObject(cells);
                    if (rowelem != null) Marshal.ReleaseComObject(rowelem);
                    if (cellelem != null) Marshal.ReleaseComObject(cellelem);
                }
    
            }
        }
    }
    

    2 ноября 2018 г. 5:23
  • Спасибо большое, все работает! Правда я думал можно как-то проще сделать))

    Андрей

    3 ноября 2018 г. 8:11