REpresentational State Transfers (aka REST)

Una bella introduzione sui REpresentational State Transfers (aka REST) presentata da Stefan Tilkov e una presentazione sulla riusabilità.

Per quanto riguarda asp.net, è possibile implementare queste architetture a diversi livelli, implementando un IHttpHandler (the hard way, e forse nemmeno troppo vantaggiosa), utilizzando una determinata organizzazione dei metodi in un'applicazione Asp.Net MVC, oppure utilizzando WCF.

Per WCF è stato realizzato uno Starter Kit che dovrebbe semplificare la vita (e posso garantire che la cosa più frustrante di wcf è proprio la complessità nel raggiungere la configurazione funzionante) e una bella guida introduttiva pubblicata da Microsoft. Una volta giunti a quel punto però wcf permette di tralasciare il livello di trasporto e di focalizzarsi sull'implementazione della logica di business.

Asp.Net MVC export to excel

Questo post vuole essere un riassunto di quanto utilizzato per effettuare l'esportazione di dati su excel da un'applicatione Asp.Net MVC.

Step 1 - Librerie

  1. Open XML Format SDK 2.0 - Libreria microsoft con il necessario per creare e gestire file excel.
  2. ExcelPackage: Office Open XML Format file creation - Sostanzialmente un façade sulla precedente libreria (senza è veramente complesso).

Step 2 - Bug fixies

Sono presenti due problemi principali nella librearia ExcelPackage:
  1. Non è possibile creare documenti su uno stream di dati ma solo su file. Per questo è necessario applicare il seguente fix (che consiste nel ricompilare la libreria e applicare alcune modifiche): Using the ExcelPackage class on a web page
  2. E' presente un errore nella gestione delle query xpath, non viene fatto l'escape della stringa di ricerca. Grazie a questo post C-Sharp function to escape single-quote on XPath expression ho modificato la funzione
    private int SetSharedString(string Value)
    ...

    // Check to see if the string already exists. If so, retrieve its index.
    // This search is case-sensitive, but Excel stores differently cased
    // strings separately within the string file.
    //MODIFIED TO USE ParseXpathString
    XmlNode stringNode = _xlWorksheet.xlPackage.Workbook.
    SharedStringsXml
    .SelectSingleNode(string.Format("//d:si[d:t={0}]",
    ParseXpathString(Value)),
    _xlWorksheet.NameSpaceManager);

Step 3. Asp.Net MVC Code

Ho infine creato un extension method che restituisce un ExcelResult che si occupa di trasformare l'object che riceve in input (che può essere IEnumerable, DataSet, DataTable) e trasformarlo in un foglio excel e fare lo streaming sulla risposta.

Step 4. Further works

Sicuramente aggiungere alcune opzioni all'esportazione, come titolo per il report, descrizione etc., il supporto di template, una sintassi per il template.