martedì 2 maggio 2017

.Net Excel aggiornare i dati tramite oledb con VB.Net e C#

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-aggiornate-le-celle-in-excel-tramite_1495.aspx


In questo articolo, vedremo come tramite la tecnologia .Net, in particolare con il linguaggio di programmazione Visual Basic Net e C#, possiamo effettuare l’aggiornamento dei dati in Excel, utilizzandolo come database proprio tramite le classi messe a disposizione da Ado.Net.
In un articolo precedente qui http://www.iprogrammatori.it/articoli/programmazione/art_aspnet-visualizzare-un-file-excel-in-una_1443.aspx abbiamo visto come caricare una griglia, prelevando i dati da Excel.
In questo articolo vedremo come aggiornare i dati di un foglio Excel.

Stesura del codice

Prima di tutto, creare un file “Excel” con due intestazioni (nome e cognome) rispettivamente in A1 e B1.
Salvate il file nel proprio pc.
Aprite Visual Studio 2015, selezionando il linguaggio di proprio interesse e come progetto, Windows Application oppure web application (asp.Net) . I frammenti di codice sono per entrambi gli scenari.
Dopo aver creato il progetto, inserite nella form o nella pagina web, un pulsante, una casella di testo.
Passiamo in visualizzazione codice, facendo doppio click sul pulsante.
In alto, sopra ogni dichiarazione, inserimento lo spazio dei nomi, che ci permette di utilizzare le classi Ado.Net, per gestire il file Excel come se fosse un database.



VB.Net

Imports System.Data.OleDb

C#

using System.Data.OleDb;

Mentre per il progetto web la dichiarazione sarà la seguente:




VB.Net

Imports System.Data.OleDb

Imports System.IO

C#

using System.Data.OleDb;

using System.IO;

A questo punto non ci resta che scrivere il codice per l’evento click del pulsante. Per quanto riguarda le web application, mettiamo anche una parte per scaricare il file.


VB.Net

Private Sub BtnEsegui_Click(sender As System.Object, e As System.EventArgs) Handles BtnEsegui.Click

 

        Dim ConnectionString As String = ""

        ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=No"";", "E:\fileExcel.xls")

        Using ConDati As New OleDbConnection(ConnectionString)

            ConDati.Open()

            Dim Sql As String = "UPDATE [Foglio1$A2:A2] SET F1='" + TextBox1.Text + "'"

            Dim UpdateOleDbCommand As New OleDbCommand(Sql, ConDati)

            UpdateOleDbCommand.ExecuteNonQuery()

 

            ConDati.Close()

 

        End Using

 

 

    End Sub

C#

private void BtnEsegui_Click(object sender, EventArgs e)

        {

            string ConnectionString = "";

            ConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=No\";", "E:\\fileExcel.xls");

             using (OleDbConnection ConDati = new OleDbConnection(ConnectionString))

            {

                ConDati.Open();

                string Sql = "UPDATE [Foglio1$A2:A2] SET F1='" + TextBox1.Text + "'";

                OleDbCommand UpdateOleDbCommand = new OleDbCommand(Sql, ConDati);

                UpdateOleDbCommand.ExecuteNonQuery();

 

                ConDati.Close();

            }

        }


Come si vede dal codice, tramite la classe per la connessione ad un db, ci si connette al file Excel poi tramite la classe oledbcommand si effettua una query di tipo update.
F1 è una parola chiave per le istruzioni Update, nel senso che aggiornerà le celle che si trovano dopo il simbolo del dollaro che distingue il foglio.
A questo punto tramite il metodo Excecutenonquery viene eseguita la query.
Qui di seguito si riporta l’esempio di codice per l’ambiente Asp.Net.



VB.Net

Protected Sub BtnEsegui_Click(sender As Object, e As EventArgs) Handles BtnEsegui.Click

        Dim PercorsoNomeFile As String = "E:\fileExcel.xls"

        Dim ConnectionString As String = ""

        ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=No"";", PercorsoNomeFile)

        Using ConDati As New OleDbConnection(ConnectionString)

            ConDati.Open()

            Dim Sql As String = "UPDATE [Foglio1$A2:A2] SET F1='" + TextBox1.Text + "'"

            Dim UpdateOleDbCommand As New OleDbCommand(Sql, ConDati)

            UpdateOleDbCommand.ExecuteNonQuery()

 

            ConDati.Close()

        End Using

 

        Dim NomeFile As String = New FileInfo(PercorsoNomeFile).Name

        Dim ms As New MemoryStream(File.ReadAllBytes(PercorsoNomeFile))

        Dim byteArray As [Byte]() = ms.ToArray()

        ms.Flush()

        ms.Close()

        Response.BufferOutput = True

        Response.Clear()

        Response.ClearHeaders()

        Response.AddHeader("Content-Disposition", Convert.ToString("attachment" + "; filename=") & NomeFile)

        Response.ContentType = "application/octet-stream"

        Response.BinaryWrite(byteArray)

        Response.End()

    End Sub

C#

protected void BtnEsegui_Click(object sender, EventArgs e)

        {

            string PercorsoNomeFile = "E:\\fileExcel.xls";

            string ConnectionString = "";

            ConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=No\";", PercorsoNomeFile);

            using (OleDbConnection ConDati = new OleDbConnection(ConnectionString))

            {

                ConDati.Open();

                string Sql = "UPDATE [Foglio1$A2:A2] SET F1='" + TextBox1.Text + "'";

                OleDbCommand UpdateOleDbCommand = new OleDbCommand(Sql, ConDati);

                UpdateOleDbCommand.ExecuteNonQuery();

 

                ConDati.Close();

            }

 

         string NomeFile = new FileInfo(PercorsoNomeFile).Name;

        MemoryStream ms = new MemoryStream(File.ReadAllBytes(PercorsoNomeFile));

        Byte[] byteArray = ms.ToArray();

        ms.Flush();

        ms.Close();

        Response.BufferOutput = true;

        Response.Clear();

        Response.ClearHeaders();

        Response.AddHeader("Content-Disposition", "attachment" + "; filename=" + NomeFile);

        Response.ContentType = "application/octet-stream"; 

        Response.BinaryWrite(byteArray);

        Response.End();
 

        }


Come si vede dall’esempio precedente, dopo aver effettuato l’aggiornamento, tramite la classe memorystream e l’oggetto Response, viene effettuato il download del file Excel.

Conclusioni

In questo articolo si è voluta fornire una panoramica di come si possono aggiornate i dati su Excel, utilizzando le classi di Ado.Net, permettendo in questo modo di gestire il file come se fosse un vero e proprio database.
Tecnica che può tornare utile, anche nel caso che si devono realizzare applicazioni complessi oppure applicazioni che richiedono diverse versioni di Excel.

Nessun commento: