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.DescendingDim rowField = pivotTable.Fields(rowFieldName)
pivotTable.RowFields.Add(rowField)
rowField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.AscendingDim columnField = pivotTable.Fields(columnFieldname)
pivotTable.ColumnFields.Add(columnField)
columnField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.AscendingDim dataField = pivotTable.Fields(dataFiledName)
With pivotTable.DataFields.Add(dataField)
.Format = dataFormat
End WithReturn pivotWorksheet
End Function
Mooooooolto interessante, la giro ai miei colleghi del settore sviluppo, sai se esista una equivalente per i documenti di tipo weord, quindi doc/docx/rtf ?
Finora per problemi del geenere ho visto sempre usare la http://poi.apache.org/ ma come ben sai è per sviluppo java.
Dimenticavo, da che versione di Excel installato si può ricorrere a questo escamotage? Solo 2013 o anche qualche versione precedente?
Nell’esempio ho generato un xlsx quindi Excel dalla versione 2007 è in grado di usare questi file, (la versione 2003 è comunque in grado di aprirli installando l’apposito compatibility pack)
Per una libreria per file di testo docx puoi usare la libreria DocX qui un articolo
http://www.codeproject.com/Articles/660478/Csharp-Create-and-Manipulate-Word-Documents-Progra