Visual Studio LightSwitch–Izvoz podataka u Excel i CSV za desktop aplikacije

Kako smo vidjeli u prethodnim postovima, LightSwitch nudi zaista velike mogućnosti u procesu izrade poslovnih aplikacija ali u svemu tome mogućnost izvještavanja ima posebnu ulogu. LightSwitch ne nudi ugrađenu mogućnost izvještavanja direktno iz LS okruženja ali postoje različiti način kako da odradimo izvještavanje.

Izvještavanje se u LightSwitch-u može ostvariti na više načina:

  • Izvoz podatak u Excel
  • Izvoz podatak u CSV
  • Open XML i Word template
  • WCF Ria Services
  • Eksenzije
  • RSS i Report builder 3.0

U ovom postu ćemo analizirati izvoz podataka u Excel i CSV za dekstop verziju LightSwitch aplikacija (OOB-Out of Broswer app):

Model podataka za naredne primjere izvoza podataka u Excel i CSV je:

ModelCSV

Izvoz podataka u Excel

LightSwitch nudi mogućnost integracije sa Microsoft Office tako što automatski omogućava izvoz podataka u Excel gdje god postoji prikaz podataka u Grid-u kao što je na primjer Search ekran (Search Employees):

ExportToExcelSearch

ili izvoz podataka iz grida za detail dio ekrana (Employee Detail i Devices sekcija ekrana):

ExportToExcelDetail

Rezultat izvoza u Excel-u:

ExcelData

Izvoza podataka u Excel je moguć u Out of browser varijantama tj. desktop varijanti LightSwitch aplikacije. Ukoliko bi pokrenuli LightSwitch aplikaciju u okviru browser-a tada ne bi imali mogućnost izvoza jer je u tom slučaju aplikacija pokrenuta u “browser sand box” gdje aplikacija nema pristupa lokalnim fajlovima i resursima kao što su Office aplikacije a sve iz bezbjednosnih razloga.

  • Da bi pokrenuli aplikaciju kao Desktop varijantu potrebno je desnim dugmetom na projekat ReportingLS/Properties/Application Type/Client odabrati Desktop:

    Publish-Desktop

    Nedostaci izvoza podataka u Excel:

  • Ne može da eksportuje slike iz baze ukoliko je polje tipa Images
  • Eksportuje podatke samo iz tekuće stranice ukoliko je uključen Paging
  • Ne funkcioniše u Web varijanti aplikacije

Izvoz podataka u CSV-osnovni

  • Tip aplikacije: Desktop
  • Podaci za izvoz podataka: svi slogovi iz entiteta

Drugi način izvoza podataka je izvoz u CSV (Comma Separated Value) format. Ono što razlikuje ovu implementaciju u odnosu na izvoza podataka u Excel je da se može izvršavati i u web browser-u. Format CSV fajla, što mu i sam naziv kaže, je da su podaci u fajlu odvojeni jednim od znakova (, ;) a sve u zavisnosti od podešavanja u REgional Settings i  okviru operativnog sistema. Podaci se mogu otvoriti bilo kojim tekstualnim editorom a moguće je odraditi Import Data From a Text File u okviru Excel te se na taj način mogu dobiti podaci kao da su u Excel formatu (sa zaglavljem i podacima raspoređenim u kolonama).

Primjer za Export u CSV ću prikazati za Search ekran koji je kreiran za entitet Employee.

  • Da bi pokrenuli aplikaciju kao Web varijantu potrebno je desnim dugmetom na projekat ReportingLS/Properties/Application Type/Client odabrati Web:

    Publish-Web

    Rezultat izvoza podataka dobijamo klikom na dugme Export to CSV u okviru Search Employee ekrana:

    ExportToCSVBtn

    Postavljanje dugmeta se vrši u dizajneru ekrana tako što ćemo iskoristiti funkcionalnost Add\New Button u sekciji Command Bar u okviru Data Grid-a pri čemu ćemo za naziv metode dati naziv ExportToCSV:

    ExportBtn

    Prvi red u CSV fajlu će biti naziv atributa (property) iz entiteta dok će ostali redovi predstavaljati podatke. Rezultat izvoza podataka:

    CSVData

    Naredne metode ću smjestiti u klasu vezanu za pretragu zaposlenih (Ekran za pretragu zaposlenih-SearchEmployees). Najjednostavnije je za kreirano dugme ExportToCSV dodati programski kod putem opcije Edit Execute Code kako bi se pozicionirali u željenoj klasi:

    EditExecuteCode

    Prvo je potrebno u klasi dodati dva namespace-a za StringBuilder i SaveFileDialog:

    using System.Text;
    using System.Windows.Controls;

    Potom dodati naredne metode:

    partial void ExportToCSV_Execute()
    {
      SetupExportCSV();
    }
    
    private void SetupExportCSV()
    {
      string csv = GetCSVData(this.DataWorkspace.ApplicationData.Employees);
    
      //Open SaveFileDialog to save file on file system
      // SaveFileDialog must be opened on the UI thread
      Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
      {
        SaveFileDialog dialog = new SaveFileDialog();
        dialog.Filter = "CSV (*.csv)|*.csv";
    
        if (dialog.ShowDialog() == true)
        {
          using (StreamWriter stream = new StreamWriter(dialog.OpenFile()))
          {
            stream.Write(csv);
            stream.Close();
          }
        }
      });
    }
    
    private string GetCSVData(IEntitySet entitySet)
    {
      StringBuilder csv = new StringBuilder();
      bool header = false;
      foreach (IEntityObject entity in entitySet)
      {
        //Header row
        if (!header)
        {
          foreach (var prop in entity.Details.Properties.All().OfType<Microsoft.LightSwitch.Details.IEntityTrackedProperty>()) //IEntityStorageProperty
          {
            csv.Append(prop.Name + ",");
          }
          csv.Replace(",", System.Environment.NewLine, csv.Length - 1, 1); //Replace last "," with newline
          header = true;
        }
        //Data rows
        foreach (var prop in entity.Details.Properties.All().OfType<Microsoft.LightSwitch.Details.IEntityTrackedProperty>()) //IEntityStorageProperty
        {
          csv.Append(prop.Value.ToString() + ",");
        }
        csv.Replace(",", System.Environment.NewLine, csv.Length - 1, 1); //Replace last "," with newline
      }
      return csv.ToString(0, csv.Length - 1); //return data to caller method
    }

    Korišćene su tri metode:
    – ExportToCSV_Execute (dugme koje inicira eksport podataka)
    – SetupExportCSV (inicira pronalaženje podataka i pokretanje dijaloga za snimanje dobijenih rezultata)
    – GetCSVData (kreira zaglavlje za naslov i onoliko redova za podatke koliko postoji redova u posmatranom entietu)

    Da bi dio funkcionalnosti koji priprema podatke za CSV – GetCSVData() bio dostupan za svaki ekran, moguće je premjestiti kod GetCSVData u posebnu klasu na putanji Client/User Code što nije učinjeno u konretnom primjeru radi jednostavnosti rješenja.

    Par napomena:

  • IEntityTrackedProperty daje sve atribute iz entiteta uključujući i vrijednosti spoljnih ključeva (npr. vrijednost City.Name na osnovu atributa City u entitetu Employee)
  • IEntityStorageProperty (umjesto IEntityTrackedProperty) bi prikazao sve Storage property posmatranog entiteta, tačnije samo atribute entiteta koji ne uključuju spoljne ključeve, preračunate atribute (computed properties) ili kolekcije
  • SaveFileDialog() mora biti pokrenut u UI thread-u
  • Metoda GetCSVData kreira header i redove za posmatrani entiet. Svaki podatak je odvojen zarezom, a na kraju reda postoji enter

    Nedostaci Export to CSV:

  • Vrši izvoz za sve podatke iz entiteta bez obzira na paging ili kriterijum pretrage
  • Ukoliko želite export podataka samo prikazanih na osnovu unešenog kriterijuma u Search Text Box možete kreirati upit (query) za entitet sa željenim poljima u Filter sekciji i da na osnovu tog upita kreirati Search ekran. Na taj način je moguće imati kontrolu nad upitom koji se izvršava.

About Spaso Lazarevic

Spaso Lazarevic is Senior Software Developer working with Microsoft technologies. Leader of .NET User Group Bijeljina, speaker at Microsoft events, writter and blogger. Microsoft MVP for Visual C#.
This entry was posted in Programming, Step by Step and tagged , , , . Bookmark the permalink.

2 Responses to Visual Studio LightSwitch–Izvoz podataka u Excel i CSV za desktop aplikacije

  1. asimze says:

    Dragi Spaso, prvo da ti čestitat Novu godinu i poželim puno zdravlja i sreće. Članak je jako lijep i sve je jasno objašnjeno, komentari u kodu i plus objašnjenje šta koji objekat predstavlja na kraju članka. Ako mogu da te zamolim i dan prijedlog za dva članka:
    1. Uvoz iz Excela
    2. Referenciranje na objekte entiteta i na objekte ekrana

    • Hvala Asime na čestitkama. I ja vama želim sve najbolje u Novoj godini.
      Prva predložena teme za LightSwitch je u fazi pripreme (Uvoz podataka iz Excel i CSV u LightSwitch) jer je dio šire cjeline rada sa fajlovima koju želim da obradim. Ako za drugu temu možeš malo detaljnije da objasniš, na šta misliš.
      Pozdrav

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s