Libreria .NET per la generazione di file Excel

Una delle necessità che talvolta si presenta negli applicativi gestionali è quella di poter generare dei file di Excel per l’esportazione di dati o per la creazione di report.

Se sul computer in cui viene eseguita l’applicazione che deve generare il file è installato Excel è possibile sfruttare le PIA di Office per la generazione, ma se invece sul computer non è installato Excel è possibile utilizzare una delle varie librerie che si appoggiano all’Open XML SDK.

Uno scenario in cui può essere utile la generazione di file Excel senza la presenza di Office installato è ad esempio un’area riservata web che permette l’esportazione di dati in formato Excel, oppure un applicativo esposto tramite Remote Desktop Services in uno scenario B2B senza che sul server RDS Session Host sia installato Office con un ovvio risparmio in termini di licensing.

Come ho detto precedentemente di librerie ve ne sono svariate sia free che a pagamento, io ho optato per EPPlus, al momento la versione stabile è la 3.1, ma l’autore sta lavorando alla versione 4.0 di cui ha reso disponibile la Beta 2. EPPlus è in realtà l’evoluzione del progetto ExcelPackage, infatti l’autore è partito dai sorgenti di quest’ultimo per creare EPPlus.

Io ho testato la versione stabile ovvero la 3.1 che ha ovviamente qualche funzionalità in meno rispetto a quelle che saranno presenti nella versione 4.0 su cui l’autore sta lavorando per rendere disponibili le seguenti migliorie:

  • Possibilità di inserire colonne in un foglio
  • Maggior velocità e minor consumo di memoria
  • Utilizzo di DotNetZip al posto delle Packaging API per risolvere i problemi con Isolated Storage e abilitare il multi threading
  • Aggiunta di più di 100 nuove funzioni
  • Maggior supporto alla gestione delle formule

In ogni caso per un utilizzo base anche la versione 3.1 può andare bene io l’ho utilizzata con la versione 2.5.5631.0 del file DocumentFormat.OpenXml.dll contenuto nell’Open XML SDK 2.5.

Per un semplice esempio di creazione di un file Excel si veda il post Creating Reports in Excel 2007 using EPPlus (Header, Footer, Comments, Image, Formatting, Shape and Formula).

Nel mio caso vista la necessità di generare fogli contenenti tabelle Pivot mi sono creato un paio di estensioni, la prima per impostare la caption delle colonne, funzionalità che con questa versione non è supportata (a riguardo si veda How to set column name on pivot table), ma è possibile implementare via Reflection invocando il metodo setXmlNodeStringMethod:

<System.Runtime.CompilerServices.Extension()>
Public Sub SetPivotColumnHeaderCaption(pivotTable As OfficeOpenXml.Table.PivotTable.ExcelPivotTable, caption As String)
    Dim setXmlNodeStringMethod = pivotTable.GetType().GetMethod(“SetXmlNodeString”,
                                   Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance,
                                   Nothing, New Type() {GetType(String), GetType(String)}, Nothing)
    setXmlNodeStringMethod.Invoke(pivotTable, New String() {“@colHeaderCaption”, caption})
End Sub

La seconda estensione invece è pensata per creare rapidamente fogli con tabelle Pivot per la somma di derminate colonne in un altro foglio dati permettendo l’impostazione delle dimensioni di riga e colonna e di un fitro:

<System.Runtime.CompilerServices.Extension()>
Public Function AddSUMPivotWorksheet(ep As OfficeOpenXml.ExcelPackage, workSheetName As String, dataWorkSheet As OfficeOpenXml.ExcelWorksheet, filterFieldName As String, rowFieldName As String, columnFieldname As String, dataFiledName As String, dataFormat As String) As OfficeOpenXml.ExcelWorksheet
    ‘Creazione Sheet
    Dim pivotWorksheet = ep.Workbook.Worksheets.Add(workSheetName)
    ‘Estrazione range di dati
    Dim dataRange = dataWorkSheet.Cells(dataWorkSheet.Dimension.Address.ToString())
    ‘Creazione Pivot
    Dim pivotTable = pivotWorksheet.PivotTables.Add(pivotWorksheet.Cells(“A3”), dataRange, workSheetName)
    pivotTable.MultipleFieldFilters = True
    pivotTable.RowGrandTotals = True
    pivotTable.ColumGrandTotals = True
    pivotTable.Compact = True
    pivotTable.CompactData = True
    pivotTable.GridDropZones = False
    pivotTable.Outline = False
    pivotTable.OutlineData = False
    pivotTable.ShowError = True
    pivotTable.ErrorCaption = “[errore]”
    pivotTable.ShowHeaders = True
    pivotTable.UseAutoFormatting = True
    pivotTable.ApplyWidthHeightFormats = True
    pivotTable.ShowDrill = True
    pivotTable.FirstDataCol = 3
    pivotTable.RowHeaderCaption = rowFieldName
    ‘Set del ColumnHeaderCaption tramite estensione
    pivotTable.SetPivotColumnHeaderCaption(columnFieldname)

    Dim filterField = pivotTable.Fields(filterFieldName)
    pivotTable.PageFields.Add(filterField)
    filterField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.Descending

    Dim rowField = pivotTable.Fields(rowFieldName)
    pivotTable.RowFields.Add(rowField)
    rowField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.Ascending

    Dim columnField = pivotTable.Fields(columnFieldname)
    pivotTable.ColumnFields.Add(columnField)
    columnField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.Ascending

    Dim dataField = pivotTable.Fields(dataFiledName)
    With pivotTable.DataFields.Add(dataField)
        .Format = dataFormat
    End With

    Return pivotWorksheet
End Function