.Net : aggiornare le celle in Excel tramite VB.Net C# e Asp.Net

Articolo che illustra una tecnica di come aggiornate un file Excel, con l'esecuzione di query SQL.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

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 https://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.