Home Page Home Page Articoli Importare dati di Excel con .NET tramite ODBC o OLEDB e Drag & Drop

Importare dati di Excel con .NET tramite ODBC o OLEDB e Drag & Drop

Spesso in ambito aziendale è necessario adattare le proprie applicazioni e consentire che possano leggere e operare su file e dati provenienti dai tools della suite di Office fra cui uno dei più usati è Excel. Vediamo quindi come importare dati da file XLS tramite ODBC/OLEDB e Drag & Drop.
Autore: Marco Farina Livello:
Negli scenari di sviluppo recenti è sempre più presente la richiesta di importazione e integrazione di dati provenenienti da Excel nei nostri applicativi.

Introduzione


Il Framework .NET 2.0 ci fornisce diverse strade per adempiere a questi compiti , le tre più conosciute ed utilizzate sono le seguenti:

1) Utilizzare le API (Assembly PIAs) e relativo Object Model di Excel
2) Utilizzare una connessione ODBC (OdbcConnection)
3) Utilizzare il Drag & Drop

Affronteremo in questo articolo le modalità 2) e 3). Per chi fosse interessato invece alla prima modalità indico questi due articoli che possono essere utili per capire cosa sono gli Assembly PIAs (che non sono altro che assembly di interoperabilità che consentono così agevolmente di accedere all'Object Model di Excel da .NET) e come utilizzarli per creare file di Excel (per leggerli è sufficiente implementare il meccanismo inverso).

ExcelDataSetLib, una libreria .NET per esportare dati in formato Excel 
Scopriamo cosa sono gli Office PIAs 

Scenario


Iniziamo quindi con la modalità numero 2) che non richiede dipendenze installate sulla macchina quindi sarà possibile implementarla senza la presenza di Excel installato sul PC. Il nostro scenario prevederà dunque una Windows Application in cui sarà presente una ListBox che conterrà un elenco di articoli.

E' possibile collegarsi al file Excel da .NET usando o una connessione ODBC (OdbcConnection) o una connessione OLEDB (OleDbConnection) tramite Driver JET 4.0.

Implementazione tramite ODBC/OLEDB


Per collegarsi tramite OdbcConnection si può creare una nuova origine dati ODBC accedendo al Pannello di Controllo di Windows, successivamente selezionare Strumenti di Amministrazione e cliccando infine su Amministrazione origine dati ODBC:





oppure utilizzare direttamente una ConnectionString come la seguente:

Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls

In questo modo si può rendere la connessione parametrica ed è possibile a runtime caricare facilmente file diversi. Analogamente si può fare anche via OLEDB e il Driver JET 4.0:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0"

E' buona abitudine andare ad inserire ConnectionString e impostazioni varie di una applicazione Windows Forms nel file app.config.

Codice XML n°1
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="SQLConnection" value="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0; "/>
</appSettings>
</configuration>

Utilizzeremo come file Excel d'esempio un semplice file con dei valori casuali inseriti nella colonna A nel Foglio1:



Ed ecco qui di seguito il frammento di codice chiave che ci consente di aprire un file Excel ed eseguire delle Query come se fosse un database relazionale. Infatti sarà necessario utilizzare la tradizionale OleDbConnection, un OleDbCommand con il relativo statement SQL e un OleDbDataAdapter per riempire la nostra DataTable.

N.B. Vi ricordo che è anche possibile utilizzare altri comandi SQL come INSERT e DELETE e quindi non solo leggere ma anche inserire o eliminare dati nel foglio di Excel.

Codice .NET n°2
string filename = @” c:\test\fileExcel.xls”;
OleDbConnection connection = new OleDbConnection(ConfigurationManager.AppSettings["ConnectionStringODBC"].ToString()+ "Data Source=" + fileName);
using (connection)
{
connection.Open();
{
string SQL = "select * from Foglio1”;
OleDbCommand command = new OleDbCommand(SQL, connection);
OleDbDataAdapter adpt = new OleDbDataAdapter(command);
DataTable table = new DataTable();
adpt.Fill(table);
command.Dispose();
connection.Close();
}


La DataTable riempita a questo punto può agevolmente diventare il Data Source di una nostra DataGrid o ListBox. Non verrà mostrato il codice di DataBind della Table con la GridView in quanto ampiamente descritto in altri articoli, per esempio qui:

Tutorial ADO.NET ed esempi pratici - Parte 2 



Implementazione tramite Drag & Drop


La modalità più suggestiva e che riscuote sicuramente maggior successo anche per usabilità e interattività per l'utente è quella che si basa sul Drag and Drop delle celle direttamente dal file Excel aperto. La prima operazione che dobbiamo compiere è impostare la proprietà AllowDrop della ListBox a true. Ciò permette alla ListBox di essere sensibile ad eventuali operazioni di trascinamento.



Ora dovremmo preoccuparci di gestire gli eventi fondamentali del Drag and Drop riepilogati qui di seguito:

- DragEnter
- DragDrop

In particolare l'evento DragEnter ci servirà per fare un controllo di coerenza sui dati che stiamo trascinando nella nostra ListBox, permettendo o meno all'utente di trascinare particolari tipi di valori. Nel nostro caso daremo all'utente la possibilità di fare Drag and Drop di soli valori ASCII separati da virgola.

Codice .NET n°3
 if(e.Data.GetDataPresenter(DataFormats.CommaSeparatedValue))
{
e.Effect = DragDropEffect.All
}


A questo punto possiamo sbizzarrirci con l'evento DragDrop della ListBox che scatta nel momento in cui si rilascia il mouse dopo aver iniziato il trascinamento andando a gestire la logica di importazione dei dati. Per semplificare l'esempio andremo a implementare un'operazione banale come l'importazione di un elenco di codici nella ListBox.
In questo esempio avremo bisogno anche di un'area temporanea in cui immagazzinare i dati, faremo quindi ricorso alla classe MemoryStream:

Codice .NET n°4
MemoryStream memoryData = (MemoryStream)e.Data.GetData(DataFormats.CommaSeparatedValue,false);
if(memoryData!=null && memoryData.lenght>0)
{
byte[] buffer = new byte[memeoryData.lenght];
int i = memoryData.Read(buffer,0,(int)memoryData.lenght);
ASCIIEncoding asciiEncoding = new ASCIIEncoding();
string result = asciiEncoding.GetString(buffer);
}


Ora ci è sufficiente attraverso la funzione Split della classe String andare a fare il parse per individuare i nostri codici ed attraverso un ciclo foreach popolare la nostra ListBox:

Codice .NET n°5
string separator = ",";
string[] commaSeparatedCodes = result.Split(separator.ToCharArray());
foreach(string code in commaSeparatedCodes)
{
this.listBox1.Items.Add(code);
}


A questo punto, così come nell'implementazione precedente, troveremo lo stesso risultato ossia la nostra ListBox popolata con i codici presenti nelle celle del file Excel.



Naturalmente è possibile estendere questi concetti e costruire applicazioni più evolute ed avanzate che possano anche gestire non solo dati multi-riga ma anche dati multi-colonna quindi importare integralmente griglie di dati da Excel.
Voto medio articolo: 5.0 Numero Voti: 2
Marco Farina

Marco Farina

Ho 27 anni, mi sono laureato in Ing. Informatica presso il politecnico di Milano. Ho lavorato per 3 anni in un'industria elettronica sviluppando in .NET 2.0 (Windows e Web) applicativi per la configurazione di device proprietari. Ho lavorato per una società di servizi sviluppando soluzioni enterprise con tecnol... Profilo completo

Articoli collegati

Gestire le Access Control List (ACL) NTFS di file e directory con .NET
Scopriamo come nel .NET Framework 2.0 sia diventato facile recuperare e modificare la lista controllo accessi dei file e directory e in generale come gestire le ACL.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Costruire un client FTP usando il .NET Framework 2.0
In questo articolo tratteremo una delle novità più attese del .NET Framework 2.0, le classi per l'utilizzo del protocollo FTP. Realizzeremo un mini client FTP con alcune fra le funzionalità più comuni.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 28
Alla scoperta di WMI, questo sconosciuto
WMI o Windows Management Instrumentation è un componente fondamentale del sistema operativo Windows. La sua utilità è permettere l'accesso a informazioni fondamentali del sistema, come informazioni sull'hardware, software, servizi, ecc. Vediamo come sfruttarlo con .NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2
Gestire e sfruttare i campi BLOB usando .NET
I database server sono software con una potenza elevata e offrono una vasta gamma di features che spesso non vengono utilizzate. Una di queste sono i campi BLOB (campi per contenere dati in formato binario). Vediamo in questo articolo come utilizzarli con .NET.
Autore: David De Giacomi | Difficoltà: | Commenti: 13
Catturare immagini da una Webcam con .NET
In questo articolo mostreremo come è possibile costruire una applicazione per catturare immagini da una Webcam, utilizzando componenti già presenti in Windows, in questo caso l' Avicap32.dll
Autore: Giovanni Ferron | Difficoltà: | Commenti: 22 | Voto:
Usare il protocollo POP3 per creare un Client di posta
Volete costruirvi un client di posta? Volete costruire una Web Mail ? Ecco un articolo che vi introduce al protocollo POP3 e vi insegna come costruire un mini client di posta elettronica.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2 | Voto:
La stampa di una Win Form
Vedremo in questo articolo i passi necessari per creare una stampa sia di testo che di grafica di una WinForm attraverso .NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 9 | Voto:
Creare un Setup di un progetto con Visual Studio .NET
Ecco delle semplici ma dettagliate istruzioni passo-passo per costruire un pacchetto di Setup (Setup Package) per le nostre Applicazioni WinForms.
Autore: Marco Caruso | Difficoltà: | Commenti: 18
Creare un?icona nella Taskbar di Windows con .NET
Scoprirete come potenziare la vostra applicazione aggiungendo un'icona nella barra di Windows nella famosa Tray Area a fianco dell'orologio del sistema. Disponibile sia codice VB.NET che C#.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 1 | Voto:
Costruire un Servizio di Windows usando .NET
Un avanzato tutorial che vi spiegherà passo passo e in modo dettagliato le istruzioni per costruire un Servizio Windows, utilizzando ciò che il .NET Framework ci mette a disposizione. Disponibile sia codice C# che VB.NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 13 | Voto:
Windows XP Visual Styles con .NET e Win Forms
Come usare lo stile XP nelle vostre applicazioni .NET ? Questo articolo vi spiega come applicare a Buttons, Textbox, ListViews (ai controlli di Windows in genere) lo stile/tema grafico della GUI introdotto dal sistema operativo Windows XP.
Autore: David De Giacomi | Difficoltà: | Commenti: 7
Come sfruttare le funzioni di una DLL unmanaged esterna creata in C/C++
Come usare la classe DllImportAttribute messa a disposizione dal namespace System.Runtime.InteropServices per sfruttare le funzioni di una DLL unmanaged Win32 old-style scritta con Visual C++ 6.0
Autore: David De Giacomi | Difficoltà: | Commenti: 4 | Voto:
Creare una DLL in Visual C++ 6.0
Vedremo in questo articolo come creare una Dynamic Link Link Library, comunemente chiamata DLL con Visual C++ 6.0. Questo passo è necessario per poi dimostrare l'utilizzo di librerie C/C++ in .NET tramite il package System.Runtime.InteropServices
Autore: David De Giacomi | Difficoltà: | Commenti: 11 | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5