C# per leggere file Excel ed esportare dati in DataTable e database

2024-01-25 07:09:51 Administrator

La lettura di file Excel in C# è un requisito comune per molte applicazioni, sia per l'analisi dei dati, la reportistica o l'integrazione di database. Sebbene sia possibile utilizzare le librerie Interop di Microsoft, esse presentano delle limitazioni (come la necessità che Excel sia installato). Esploreremo invece un approccio più efficiente utilizzando Spire.XLS, una libreria .NET che consente di leggere e scrivere file Excel senza Interop. Questo articolo tratta:

Libreria C# .NET per Leggere Excel Senza Interop

L'Interop di Excel di Microsoft richiede che Excel sia installato sulla macchina, rendendolo inadatto per le applicazioni lato server. Invece, librerie come Spire.XLS offrono una soluzione leggera e ad alte prestazioni senza dipendenze da Excel.

Perché usare Spire.XLS?

  • Nessuna Installazione di Excel Richiesta – Funziona in modo indipendente.
  • Supporta .NET Core e .NET Framework – Compatibilità multipiattaforma.
  • Leggi/Scrivi File Excel – Supporta .xls, .xlsx e .xlsm.
  • Importa in DataTable e Database – Integrazione perfetta con ADO.NET.

Installazione di Spire.XLS

Per iniziare, installa la libreria tramite il NuGet Package Manager:

Install-Package Spire.XLS

In alternativa, puoi scaricare Spire.XLS per .NET dal nostro sito ufficiale e fare riferimento manualmente al file DLL.

Come Leggere un File Excel in C#

Questa sezione dimostra come leggere un file Excel in C# utilizzando la libreria Spire.XLS. Il processo prevede il caricamento del file, l'accesso ai fogli di lavoro e il recupero programmatico dei valori delle celle. Ciò è utile per automatizzare l'estrazione dei dati, elaborare report di Excel o integrare i dati dei fogli di calcolo nelle applicazioni.

Passaggio 1. Importa lo Spazio dei Nomi Necessario

Per utilizzare la funzionalità di Spire.XLS, è necessario importare il suo spazio dei nomi. Ciò dà accesso a classi come Workbook e Worksheet, che sono essenziali per le operazioni sui file Excel.

  • C#
using Spire.Xls;

Passaggio 2. Carica un File Excel

Per caricare un file Excel, crea un oggetto Workbook e chiama il metodo LoadFromFile. Questo legge il file in memoria, consentendo ulteriori manipolazioni.

  • C#
Workbook wb = new Workbook();
wb.LoadFromFile("input.xlsx");

Passaggio 3. Ottieni un Foglio di Lavoro Specifico

I file Excel possono contenere più fogli di lavoro. È possibile accedere a un foglio specifico indicizzando la raccolta Worksheets (in base zero). Il primo foglio si trova all'indice 0, il secondo all'1, e così via.

  • C#
Worksheet sheet = wb.Worksheets[0]; //Primo foglio

Passaggio 4. Recupera il Valore di una Cella Specifica

Per recuperare il valore di una cella, utilizzare la proprietà CellRange.Value. Specificare gli indici di riga e colonna (a partire da 1) per individuare la cella. Ciò è utile per estrarre dati strutturati come intestazioni o record individuali.

  • C#
CellRange cell = sheet.Range[1, 1]; // Riga 1, Colonna 1 (A1)
string value = cell.Value;

Di seguito è riportato un esempio completo di lettura dei dati da un intero foglio di lavoro e della loro stampa sulla console:

  • C#
using Spire.Xls;

namespace ReadExcelData
{
    class Program
    {
        static void Main(string[] args)
        {
            // Crea un oggetto Workbook
            Workbook wb = new Workbook();

            // Carica un file Excel esistente
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Ottieni il primo foglio di lavoro
            Worksheet sheet = wb.Worksheets[0];

            // Ottieni l'intervallo di celle contenente i dati
            CellRange locatedRange = sheet.AllocatedRange;

            // Itera attraverso le righe
            for (int i = 0; i < locatedRange.Rows.Length; i++)
            {
                // Itera attraverso le colonne
                for (int j = 0; j < locatedRange.Rows[i].ColumnCount; j++)
                {
                    // Ottieni i dati di una cella specifica
                    string cellValue = locatedRange[i + 1, j + 1].Value?.ToString() ?? "N/A";

                    // Allinea l'output con una larghezza di 22
                    Console.Write($"{cellValue,-22}");
                }
                Console.WriteLine();
            }
        }
    }
}

Risultato:

leggi file excel in c#

Leggi i Dati di Excel in una DataTable

L'esportazione dei dati di Excel in una DataTable consente un'integrazione perfetta con i controlli dell'interfaccia utente come DataGridView o l'elaborazione dei dati di backend. Spire.XLS semplifica questo processo con il suo metodo integrato ExportDataTable(), che converte automaticamente i dati del foglio di lavoro in una DataTable strutturata preservando le intestazioni delle colonne e i tipi di dati.

Passaggio 1. Importa lo Spazio dei Nomi Necessario

Includi lo spazio dei nomi Spire.XLS per accedere alle classi essenziali.

  • C#
using Spire.Xls;

Passaggio 2. Crea un Modulo e un Evento Click del Pulsante

Crea un modulo (ad es. Form1) e aggiungi un pulsante con un gestore di eventi per la lettura del file Excel.

  • C#
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Il codice andrà qui
    }
}

Passaggio 3. Carica la Cartella di Lavoro

All'interno dell'evento click del pulsante, crea un oggetto Workbook e carica il file Excel.

  • C#
Workbook wb = new Workbook();
wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

Passaggio 4. Esporta i Dati in DataTable

Accedi a un foglio di lavoro specifico tramite il suo indice ed esporta i suoi dati in una DataTable utilizzando il metodo ExportDataTable.

  • C#
DataTable dataTable = wb.Worksheets[0].ExportDataTable();

Passaggio 5. Associa i Dati a DataGridView

Supponendo di avere un controllo DataGridView sul modulo, associa la DataTable al DataGridView per visualizzare i dati.

  • C#
dataGridView1.DataSource = dataTable;

Di seguito è riportato il codice completo per leggere i dati da un file Excel in una DataTable e visualizzarli in un controllo DataGridView di Windows Forms:

  • C#
using Spire.Xls;
using System.Data;

namespace ReadExcelIntoDataTable
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Crea un oggetto Workbook
            Workbook wb = new Workbook();

            // Carica un file Excel esistente
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Ottieni il primo foglio di lavoro
            Worksheet sheet = wb.Worksheets[0];

            // Esporta i dati dal foglio di lavoro in una DataTable
            DataTable dataTable = sheet.ExportDataTable();

            // Associa la DataTable a DataGridView
            dataGridView1.DataSource = dataTable;

            // Rilascia le risorse
            wb.Dispose();
        }
    }
}

Risultato:

I dati di Excel vengono visualizzati in una tabella MySQL.

Leggi i Dati di Excel in un Database

L'integrazione dei dati di Excel con un database può semplificare la gestione dei dati. Di seguito, illustreremo il processo di lettura di un file Excel e di importazione del suo contenuto in un database MySQL. Questo metodo è ideale per automatizzare la migrazione dei dati, la creazione di report o la sincronizzazione dei dati di Excel con un database strutturato.

Passaggio 1. Installa la Libreria Dati MySQL

Per interagire con i database MySQL nelle tue applicazioni .NET, dovrai installare la libreria MySql.Data. Questo pacchetto NuGet fornisce le classi e i metodi necessari per connettersi e manipolare i database MySQL.

  • C#
Install-Package MySql.Data

Passaggio 2. Importa gli Spazi dei Nomi Necessari

Prima di lavorare con file Excel e MySQL, è necessario includere gli spazi dei nomi richiesti. Spire.XLS viene utilizzato per le operazioni su Excel, mentre MySql.Data.MySqlClient abilita la connettività al database MySQL.

  • C#
using Spire.Xls;
using MySql.Data.MySqlClient;

Passaggio 3. Estrai Intestazioni e Dati da Excel

Il seguente frammento di codice dimostra come estrarre intestazioni e dati dal file Excel. Le intestazioni vengono pulite per evitare conflitti di denominazione delle colonne MySQL, mentre i dati vengono archiviati in un formato strutturato per un inserimento successivo.

  • C#
// Crea un oggetto Workbook
Workbook wb = new Workbook();

// Carica un documento Excel
wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

// Ottieni un foglio specifico
Worksheet sheet = wb.Worksheets[0];

// Recupera intestazioni
List<string> headers = new List<string>();
for (int col = 1; col <= sheet.LastColumn; col++)
{
    string header = sheet.Range[1, col].Value?.ToString();
    // Rimozione degli spazi per evitare conflitti con i nomi delle colonne MySQL
    string cleanHeader = header?.Replace(" ", "");
    headers.Add($"`{cleanHeader}`");
}

// Recupera dati
List<List<string>> data = new List<List<string>>();
for (int row = 2; row <= sheet.LastRow; row++) {
    List<string> record = new List<string>();
    for (int col = 1; col <= sheet.LastColumn; col++)
    {
        record.Add(sheet.Range[row, col].Value?.ToString() ?? string.Empty);
    }
    data.Add(record);
}

Passaggio 4. Connettiti a un Database MySQL

Viene stabilita una connessione al database MySQL utilizzando una stringa di connessione, che include i dettagli del server, le credenziali e il nome del database di destinazione. L'istruzione using garantisce il corretto smaltimento delle risorse.

  • C#
string connectionString = "server=localhost;user=root;password=yourpassword;database=yourdatabase;";
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
    connection.Open();
    // La connessione è stabilita; eseguire qui le operazioni sul database
}

Passaggio 5. Crea Dinamicamente una Tabella in MySQL

Questo passaggio genera dinamicamente una tabella MySQL con colonne corrispondenti alle intestazioni di Excel. Per semplicità, tutte le colonne sono impostate come VARCHAR(255), ma i tipi di dati possono essere regolati in base ai requisiti.

  • C#
// Crea una tabella con colonne dinamiche basate sulle intestazioni
List<string> columns = new List<string>();
foreach (string header in headers)
{
    // Supponendo che tutti i valori di intestazione siano VARCHAR per semplicità; regolare i tipi secondo necessità
    columns.Add($"{header} VARCHAR(255)");
}

// Crea una tabella nel database
string columnsSql = string.Join(", ", columns);
string createTableQuery = $ @"
    CREATE TABLE IF NOT EXISTS my_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        {columnsSql}
)";

// Esegui la query di creazione della tabella
using (MySqlCommand createCommand = new MySqlCommand(createTableQuery, connection))
{
    createCommand.ExecuteNonQuery();
}

Passaggio 6. Popola la Tabella con i Dati

I dati Excel estratti vengono inseriti nella tabella MySQL utilizzando query con parametri per prevenire l'iniezione di SQL. Ogni riga del file Excel viene mappata a un record di database corrispondente.

  • C#
// Prepara l'istruzione SQL INSERT
string placeholders = string.Join(", ", new string[headers.Count].Select(h => "?"));
string insertQuery = $"INSERT INTO my_table ({string.Join(", ", headers.Select(h => h.Trim('`')))}) VALUES ({placeholders})";

// Inserisci i dati nella tabella
foreach (List<string> record in data)
{
    using (MySqlCommand insertCommand = new MySqlCommand(insertQuery, connection))
    {
        for (int i = 0; i < record.Count; i++)
        {
            insertCommand.Parameters.AddWithValue($" @2024\本地文件打包__20180302\Spire.Web\trunk\src\website\components\com_virtuemart\themes\default\templates\browse\includes\browse_searchparameter_form.tpl.php{i}", record[i]);
        }
        insertCommand.ExecuteNonQuery();
    }
}

Ecco il codice completo per importare i dati da un file Excel in una tabella MySQL:

  • C#
using Spire.Xls;
using MySql.Data.MySqlClient;

namespace ExcelToMySQL
{
    class Program
    {
        static void Main(string[] args)
        {
            // Crea un oggetto Workbook
            Workbook wb = new Workbook();

            // Carica un documento Excel
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Ottieni un foglio specifico
            Worksheet sheet = wb.Worksheets[0];

            // Recupera intestazioni
            List<string> headers = new List<string>();
            for (int col = 1; col <= sheet.LastColumn; col++)
            {
                string header = sheet.Range[1, col].Value?.ToString();
                // Rimozione degli spazi per evitare conflitti con i nomi delle colonne MySQL
                string cleanHeader = header?.Replace(" ", "");
                headers.Add($"`{cleanHeader}`");
            }

            // Recupera dati
            List<List<string>> data = new List<List<string>>();
            for (int row = 2; row <= sheet.LastRow; row++)
            {
                List<string> record = new List<string>();
                for (int col = 1; col <= sheet.LastColumn; col++)
                {
                    record.Add(sheet.Range[row, col].Value?.ToString() ?? string.Empty);
                }
                data.Add(record);
            }

            // Stabilisci una connessione al database MySQL
            string connectionString = "server=localhost;user=root;password=admin;database=excel_db;";
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();

                // Crea una tabella con colonne dinamiche basate sulle intestazioni
                List<string> columns = new List<string>();
                foreach (string header in headers)
                {
                    // Supponendo che tutti i valori di intestazione siano VARCHAR per semplicità; regolare i tipi secondo necessità
                    columns.Add($"{header} VARCHAR(255)");
                }

                // Crea una tabella nel database
                string columnsSql = string.Join(", ", columns);
                string createTableQuery = $ @"
                    CREATE TABLE IF NOT EXISTS my_table (
                        id INT AUTO_INCREMENT PRIMARY KEY,
                        {columnsSql}
                    )";

                // Esegui la query di creazione della tabella
                using (MySqlCommand createCommand = new MySqlCommand(createTableQuery, connection))
                {
                    createCommand.ExecuteNonQuery();
                }

                // Prepara l'istruzione SQL INSERT
                string placeholders = string.Join(", ", new string[headers.Count].Select(h => "?"));
                string insertQuery = $"INSERT INTO my_table ({string.Join(", ", headers.Select(h => h.Trim('`')))}) VALUES ({placeholders})";

                // Inserisci i dati nella tabella
                foreach (List<string> record in data)
                {
                    using (MySqlCommand insertCommand = new MySqlCommand(insertQuery, connection))
                    {
                        for (int i = 0; i < record.Count; i++)
                        {
                            insertCommand.Parameters.AddWithValue($" @2024\本地文件打包__20180302\Spire.Web\trunk\src\website\components\com_virtuemart\themes\default\templates\browse\includes\browse_searchparameter_form.tpl.php{i}", record[i]);
                        }
                        insertCommand.ExecuteNonQuery();
                    }
                }
            }

            Console.WriteLine("Dati esportati con successo!");
        }
    }
}

Risultato:

I dati di Excel vengono visualizzati in una tabella MySQL.

Conclusione

Leggere file Excel in C# non è mai stato così facile, grazie a librerie come Spire.XLS. Questa guida ti ha illustrato il processo di caricamento dei file Excel, la lettura del loro contenuto e persino l'importazione dei dati in un database MySQL. Con queste tecniche, puoi migliorare notevolmente le capacità di gestione dei dati delle tue applicazioni.

Domande Frequenti

D1: Posso leggere file Excel protetti da password?

R: Sì, Spire.XLS supporta la lettura di file Excel crittografati utilizzando:

  • C#
wb.OpenPassword = "psd";
wb.LoadFromFile("file.xlsx");

D2: Come posso leggere i risultati delle formule invece della formula stessa?

R: Hai due opzioni per recuperare i risultati delle formule:

Per singole celle:

Verifica se una cella contiene una formula usando CellRange.HasFormula e ottieni il valore con CellRange.FormulaValue:

  • C#
CellRange cell = sheet.Range[1, 1];
if (cell.HasFormula)
{
    string result = cell.FormulaValue.ToString();
}

Per l'esportazione di massa in DataTable:

Usa Worksheet.ExportDataTable() con computedFormulaValue: true per esportare i valori calcolati:

  • C#
DataTable data = sheet.ExportDataTable(range, exportColumnNames: true, computedFormulaValue: true);

D3: Come posso leggere i dati di Excel in una DataTable?

R: Usa il metodo Worksheet.ExportDataTable() fornito da Spire.XLS.

D4: Come posso leggere un file Excel riga per riga?

R: Fare riferimento al seguente codice:

  • C#
Workbook workbook = new Workbook();
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];

for (int row = 1; row <= sheet.LastRow; row++)
{
    for (int col = 1; col <= sheet.LastColumn; col++)
    {
        string cellValue = sheet.Range[row, col].Value?.ToString() ?? string.Empty;
        Console.WriteLine(cellValue);
    }
}

Ottieni una Licenza Gratuita

Per sperimentare appieno le funzionalità di Spire.XLS per .NET senza alcuna limitazione di valutazione, puoi richiedere una licenza di prova gratuita di 30 giorni.

Vedi Anche