Excel export ASP.NET-ből

Gyakori feladat, hogy a webalkalmazásaink adatbázisából valamilyen használható formátumban kell adatokat exportálnunk. Egy átlagos felhasználó számára a relációs adatok használható formátuma az Excel. Íme néhány módszer Excel fájl előállítására ASP.NET-ből:

1. OLE DB

Ennél a módszernél kihasználjuk, hogy az Excel OLE DB provideren keresztül elérhető, a connection string valami ilyesmi lesz:

    private string _connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyFile.xls;Extended Properties=""Excel 8.0;""";

Miután rányitottunk OleDbConnectionnel, az OleDbCommand osztály segítségével szórhatjuk a SELECT-eket, INSERT-eket, DELETE-eket és UPDATE-eket. Minden egyes sheet táblaként érhető el.

Ennek a megközelítésnek az előnye, hogy előre elkészíthetünk és beformázhatunk egy Excel fájlt, a beleírt adatok nem rontják el a formázást. Persze ne teljes formázásra tessék gondolni, tipikusan felesleges sheetek kiírtása, magyarázó szövegek mellékelése, fejléc értelmes formában történő megadása, néhány formázás stb.

A nagy hátránya, hogy ha egy általános DataSet -> Excel export osztályt akarunk készíteni, akkor meg fog gyűlni a bajunk az SQL utasítások összefűzésével, mert persze tárolt eljárásokról szó se lehet. Gyakorlatilag INSERT utasításokat kell majd összeállítanunk a DataSet minden egyes sorához, ahol leginkább a speciális karakterek escape-elésére és az egyes mezőtípusokra kell figyelni. Sajnos az ilyen általános osztályoknál tapasztalataink szerint a dátum például sztringként szokott megérkezni az Excelbe, aposztróffal prefixelve. Puff neki, csak nyomtatni lehet, formázni nem.

2. Excel objektum modell

Van az Excelnek egy gyönyörű objektum modellje, ami elérhető, ha referenciát adunk a Microsoft Excel 11.0 Object Library COM komponensre, majd bejúzingoljuk a Microsoft.Office.Interop.Excel névteret. Tessék vele nyugodtan játszani, egy darabig még akár élmény is lehet az Excel.Workbook és az Excel.Worksheet osztályok használata és teljesen jól is fog működni a fejlesztői gépünkön.

Ezzel a megoldással két igen nagy probléma van, ha ASP.NET-ből akarjuk használni:

  • A szerverre Excelt kell telepíteni, amihez licenc kell, telepíteni kell, frissíteni kell stb.
  • Az Excelt nem szerver oldali környezetbe tervezték, ezért nem is működik jól a szerveren. Tipikusan nem szereti, ha egyszerre több szálon matatják az objektumait és bizony könnyen ki lehet akasztani, arról nem is beszélve, hogy zabálja a memóriát.

Ergó ezt a megközelítést tessék elfelejteni ASP.NET környezetben. Pont.

3. XLSX fájl előállítása

Ha megengedhetjük magunknak, hogy Excel 2007-re optimalizálunk és megkövetelhetjük a szerveren a .NET Framework 3.0-t, akkor gyárthatunk XLSX fájlokat közvetlenül kódból. Ehhez tömöríteni kell tudni és nyers XML-t írni. A tömörítéshez még használhatjuk a WindowsBase.dll-ben lévő Packaging API-t (System.IO.Packaging névtér), de az Excel specifikus XML gyártáshoz nem marad más, mint a System.Xml névtér. Ez majdnem semmi, meg kell ismernünk a teljes Excel sémát.

Ez a megoldás jól működik szerver oldalon és Excel sem kell hozzá. Bár a Microsoft ezt nagyon favorizálja, nem fehér embernek való feladat, ráadásul tényleg csak Excel 2007-tel működik (bár van Compatibility Pack a 2003-hoz).

4. HTML előállítása

Ha nincs szükségünk minden Excel funkcióra, akkor trükközhetünk egy kicsit: kihasználhatjuk, hogy az Excel meg tud nyitni HTML fájlokat és felismeri bennük a táblázatokat. Gyárthatunk tehát szerver oldalon egyszerű HTML táblázatot, mert ha azt kliens oldalon Excellel nyitjuk meg, az eredmény majdnem ugyanaz, mintha közvetlenül Excel fájlt gyártottunk volna. Az alábbi kód pont erre szolgál:

    StringWriter sw = new StringWriter();
    HtmlTextWriter wr = new HtmlTextWriter( sw );

    wr.RenderBeginTag( HtmlTextWriterTag.H1 );
    wr.Write( "Ez itt a cím" );
    wr.RenderEndTag();

    GridView grid = new GridView();
    grid.DataSource = this.GetData();
    grid.DataBind();
    grid.HeaderStyle.Font.Bold = true;
    grid.RenderControl( wr );

    this.Response.Clear();
    this.Response.ContentType = "application/vnd.ms-excel";
    this.Response.Write( sw.ToString() );
    this.Response.End();

A megoldás előnye, hogy aránylag egyszerű, nem kell Excel a szerverre, sőt még a típusok is jól mennek át. A hátrány, hogy ez nyilván egy trükközés, nem tudunk minden Excel funkciót elérni, és az Excelben megnyitott HTML oldalban nem látszanak a cellarácsok.

Íme tehát négy megoldás, mindegyiknek vannak előnyei és hátrányai, lehet választani!

 

Technorati tags: ,
Advertisements

2 thoughts on “Excel export ASP.NET-ből

  1. Andras

    4-es megoldáshoz csak annyit fűznék hozzá, hogy Excel 2007 egy warning kíséretében nyitja meg a HTML tartalmű, de XLS kiterjesztésű és excel mime típusú tartalmat. Nem nagy vész, de néhány usert megkavarhat…

  2. György

    Köszi, András, nem próbáltam és igazad van, sokaknak tényleg zavaró lehet. Bár amennyi figyelmeztető ablakot manapság feldobnak az alkalmazások, egy átlagos felhasználó hamar megtanulja westernhőshöz méltó sebességgel eltüntetni őket.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s