ASP .NET  - Copiando e Colando dados do Excel em um GridView


Neste artigo vou mostrar como copiar e colar dados de uma planilha Excel em um controle GridView em uma aplicação ASP  .NET.

Eu já escrevi alguns artigos sobre a transferência de dados do Excel para o GridView e vice-versa e hoje veremos como copiar ( CTRL+C ) dados em uma planilha Excel e colar (CTRL+V) os dados em um GridView.

Para realizar essa tarefa vou usar os recursos da classe ClipBoard do namespace System.Windows.Forms.

Para colocar dados na área de transferência usamos o método - SetDataObject.

Existem dois métodos sobrecarregados:

1 - Clipboard.SetDataObject Method (Object)  - Os dados colocados no clipboard serão excluídos quando a aplicação terminar.

2- Clipboard.SetDataObject Method (object, boolean)  -  onde temos os parâmetros

object -  representa os dados que desejamos colocar no clipboard
boolean  - Pode ser True ou False : True indica que os dados irão permanecer no clipboard depois que a aplicação terminar.

Para obter dados do clipboard usamos o método GetDataObject. Os dados são retornado como um objeto que implementa a interface IDataObject pois o tipo de dados pode variar. 

Usamos então os métodos definidos em IDataObject para extrair os dados do objeto.

Se você não souber o formato dos dados a serem obtidos use o método GetFormats da interface IDataObject para obter uma lista de formatos; a seguir use o método GetData e especifique o formato que sua aplicação quer usar.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a solução no VS 2015

Abra o Visual Studio Community 2015 e clique em New Project;

Selecione Visual C# e clique em Web;

Você verá a janela abaixo exibindo dois novos tipos de projetos web:

Selecione o template Empty e marque a opção WebForms de forma a criar uma solução vazia.

A seguir no menu Project clique em Add New Item e selecione o template Web Form informando o nome Default.aspx:

A partir da ToolBox inclua no arquivo Default.aspx os controles :

Disponha os controles conforme o leiaute da figura abaixo:

O código gerado pode ser visto a seguir:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="GridView_CopiarColarExcel._Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h1>Macoratti .net</h1>
     <hr />
    <asp:GridView ID="gvDados" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="30" />
        <asp:BoundField DataField="Nome" HeaderText="Nome" ItemStyle-Width="150" />
        <asp:BoundField DataField="Pais" HeaderText="Pais" ItemStyle-Width="150" />
    </Columns>
    </asp:GridView>
    <br />
    <asp:TextBox ID="txtCopiado" runat="server" TextMode="MultiLine" AutoPostBack="true"
    OnTextChanged="ColarParaGridView" Height="200" Width="400" />
    </div>
    </form>
</body>
</html>

Vamos implementar o código javascript no evento onload definindo entre as tags <head> do arquivo Default.aspx o código a seguir:

...
<head runat="server">
    <title>Copiar Colar - Excel-GridView</title>     
  <script type="text/javascript">
    window.onload = function () {
        document.getElementById("<%=txtCopiado.ClientID %>").onpaste = function () {
            var txt = this;
            setTimeout(function () {
                __doPostBack(txt.name, '');
            }, 100);
        }
    };
  </script>
</head>
...

Dessa forma assim que colarmos alguma coisa o evento PostBack será acionado e o evento OnTextChanged do TextBox será disparado.

Populando o GridView com os dados copiados do Excel

Vamos definir agora o código no arquivo code-behind Default.aspx.vb para o método ColarParaGridView de forma que assim que algo for colado no TextBox o evento será disparado.

    Protected Sub ColarParaGridView(sender As Object, e As EventArgs)  Handles txtCopiado.TextChanged
        Dim dt As New DataTable()

        dt.Columns.AddRange(New DataColumn(2) {New DataColumn("Id", GetType(Integer)), 
                                                                         New DataColumn("Nome", GetType(String)), 
                                                                         New DataColumn("Pais", GetType(String))})
        Dim conteudoCopiado As String = Request.Form(txtCopiado.UniqueID)

        For Each linha As String In conteudoCopiado.Split(ControlChars.Lf)
            If Not String.IsNullOrEmpty(linha) Then
                dt.Rows.Add()
                Dim i As Integer = 0
                For Each celula As String In linha.Split(ControlChars.Tab)
                    dt.Rows(dt.Rows.Count - 1)(i) = celula
                    i += 1
                Next
            End If
        Next
        gvDados.DataSource = dt
        gvDados.DataBind()
        txtCopiado.Text = ""
End Sub

Neste código criamos um DataTable com a mesma estrutura dos dados que desejamos copiar e a seguir obtemos o conteúdo copiado e usando o método Split que retorna um array de única dimensão contendo o número de substrings separadas no processo dependendo do critério e delimitador usado.

Depois percorremos os dados salvando no DataTable.

Ao final exibimos o conteúdo do DataTable no gridview.

Agora é só alegria...

Abra uma planilha Excel e copie os dados de uma planilha conforme abaixo usando um CTRL + C:

Execute o projeto ASP .NET e a seguir cole os dados no TextBox usando CTRL+V:

Pegue o projeto completo aqui : GridView_CopiarColarExcel.zip

"Verdadeiramente ele (Jesus) tomou sobre si as nossas enfermidades, e as nossas dores levou sobre si; e nós o reputávamos por aflito, ferido de Deus, e oprimido."
Isaías 53:4

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti