Ответы с форумов MSDN

Чтение HTML из буфера обмена

Date: 02.11.2018 5:23:50

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);
            }

        }
    }
}


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub