Articolo wiki
  • Questo articolo wiki è bloccato
Applicabile a 40 visualizzazioni

Excel - C# ed Excel ? - C# ed Excel ! - Parte 2

Livello tecnico : Intermedio

Riepilogo

Vediamo come produrre con C# un file di Excel con un foglio popolato da dati prelevati da un database di Access.

Dettagli

In questo secondo articolo dedicato alla creazione di un file di Excel con C#, affrontiamo un problema reale: la necessità di produrre un file di Excel senza che l'utente abbia la possibilità di modificare il codice che lo crea.

Se utilizzassimo il VBA inserito in un altro file (o nel file stesso) o un file .VBS, l'utente potrebbe modificare il codice con il rischio di produrre un file diverso da quello che abbiamo impostato e/o di danneggiare il codice stesso. Ricordo che il codice VBA non è difendibile in modo assoluto.

Utilizzando Visual Studio e C#, avremo invece un file eseguibile non modificabile. L'utente, è bene saperlo, potrebbe visualizzare il codice ma non modificarlo.

Nel caso specifico, in un database di Access situato nella cartella C:\Prova\ avremo una semplice tabella con la quale popoleremo il Foglio1 del file di Excel che andremo a creare.

Non ripeterò la parte della procedura per la creazione di un programma Console Application già vista nell'articolo:

e passiamo subito al codice.

Come prima cosa, dopo aver referenziato nei Riferimenti la libreria della versione di Excel presente sulla macchina (anche questo già visto nell'articolo di cui sopra), andremo a modificare in questo modo la parte dichiarativa del modulo di codice (indicate dalla freccia le parti aggiunte):

In più rispetto a quanto già visto nell'articolo precedente, abbiamo aggiunto uno *using* che ci consente di gestire il db di Access. Ripeto che qui non approfondiamo il linguaggio C# e le funzionalità di Visual Studio, lasciandovi liberi per questo di scegliere libri/tutorial/altro e che domande e spiegazioni approfondite vanno poste nella Community MSDN:

Ed ecco il codice ampiamente commentato del nostro programmino:

    class Program
    {
        static void Main(string[] args)
        {
            //Variabile string di connessione al db
            string myConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Prova\Test.mdb";
            //Creo un nuovo oggetto Excel.Application
            Excel.Application xls = new Excel.Application();
            //Aggiungo un Workbook alla mia applicazione Excel
            Excel.Workbook wrk = xls.Workbooks.Add(Missing.Value);
            //Metto un riferimento all'oggetto Foglio1 del Workbook
            Excel.Worksheet sh1 = (Excel.Worksheet)wrk.Worksheets.get_Item("Foglio1");
            //Creazione dell'oggetto OleDbConnection
            using (OleDbConnection cn = new OleDbConnection(myConnectionString))
            {
                try
                {
                    //Variabile long per ciclare le righe del foglio di Excel
                    long lRiga = 2;
                    //Passo la stringa di connessione all'oggetto OleDbConnection
                    cn.ConnectionString = myConnectionString;
                    //Apro la connessione
                    cn.Open();
                    //Creo un OleDBCommand
                    using (OleDbCommand cmd = cn.CreateCommand())
                    {
                        //Passo la stringa SQL all'OleDbCommand
                        cmd.CommandText = "SELECT * FROM ANAGRAFICA ORDER BY ID";
                        //carico l'oggetto reader dei dati prelevati dal db
                        OleDbDataReader reader = cmd.ExecuteReader();
                        //ciclo l'oggetto reader e inserisco i dati nel foglio di Excel
                        while (reader.Read())
                        {
                            //ciclo le colonne della riga
                            for (int iCol = 1; iCol <= reader.FieldCount; iCol++)
                            {
                                sh1.Cells[lRiga, iCol].Value = reader[iCol - 1].ToString();
                            }
                            //aumento di 1 la variabile che indica la riga
                            lRiga = ++lRiga;
                        }
                        //Chiudo il reader
                        reader.Close();
                        //Visualizzo Excel
                        xls.Visible = true;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Errore nel recupero dati dal db " + ex.ToString());
                    Console.ReadLine();
                    //Environment.Exit(0);
                }
                finally
                {
                    //Rilascio dalla memoria degli oggetti Excel creati
                    rilascioOggetto(sh1);
                    rilascioOggetto(wrk);
                    rilascioOggetto(xls);
                }
            }
        }

        private static void rilascioOggetto(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                Console.WriteLine("Errore nel rilascio degli oggetti " + ex.ToString());
                Console.ReadLine();
            }
            finally
            {
                GC.Collect();
            }
        }
    }

Non ci resta che lanciare il debug per vedere se tutto va come dovrebbe e se non ci sono errori. Ricordo che il debug si può lanciare con la freccia verde che abbiamo in alto nell'editor o tramite il tasto F5 sulla tastiera.

Alcune note:

  • il file di Access che trovate all'interno della cartella .zip al link più sotto, deve trovarsi all'interno della cartella C:\Prova\; se volete posizionarla altrove modificate la parte della stringa di connessione che fa riferimento alla path del file di Access
  • potete modificare la stringa con la query SQL *giocando* con i dati da estrarre
  • il db può trovarsi su altra macchina o NAS, nel caso modificate la stringa di connessione
  • la correzione degli errori (eccezioni) è parziale e ripeto ancora che domande su C# vanno postate nella Community MSDN

La programmazione ad oggetti era ed più che mai fondamentale, sempre!

Questo è il link per scaricare il file che ho utilizzato per l'esempio:

Testato in Windows7 Pro/8.1 Pro/10 Pro con Office2007/2010/2013/2016.

E questo il risultato che abbiamo nel file di Excel *creato al volo*:

Se vogliamo utilizzare il file eseguibile (.exe) creato quando lanciamo il debug, lo troviamo nella cartella bin del nostro progetto.

Come scrivevo più sopra, a meno di non ricorrere a particolari programmi il codice dell'eseguibile è visualizzabile (ma non modificabile). Ad esempio un disassemblatore *vedrebbe* così l'eseguibile del nostro programmino:

Per ora ci fermiamo qui. Buon lavoro a tutti.

Commenti.

Sono graditi i tuoi commenti a questo articolo Wiki e, se lo ritieni interessante, per favore spunta la voce : E' stato utile all'inizio della pagina.

Grazie.

Risorse.


 Avvio Pulito di Windows
(courtesy of Microsoft MVP Franco Leuzzi)

Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)

Commenti (0)

avanzamento