2016-02-19 91 views
8

Sto lavorando a un'applicazione Web MVC5 in cui è necessario generare un report da qualsiasi tabella di database. L'utente selezionerà la tabella che desidera stampare, quindi scegli quali colonne includere nel report e il sistema dovrebbe semplicemente visualizzare una griglia (tabella) con i dati.Report dati dinamici su tabella in ASP.Net

La visualizzazione dei dati in una tabella HTML non rappresenta un problema e sono anche riuscito a generare file Excel con i dati, che l'utente può scaricare.

Tuttavia, devo anche fornire una forma stampabile del rapporto come PDF o un altro formato che non richiede un software speciale (come MS Office) per aprire e stampare.

All'inizio pensavo di dover utilizzare il controllo ReportViewer, ma il problema è che il mio rapporto è dinamico poiché l'utente seleziona le colonne di cui ha bisogno. Ho visto tentativi da parte di altri di generare il file di definizione del report, ma speravo in qualcosa di meno brutto.

C'è un modo per prendere una tabella HTML, che calcola il dimensionamento delle celle piacevolmente e creare un PDF da esso? Ovviamente non mi dispiace dividere il report orizzontalmente in più pagine se le colonne sono troppe.

+1

Dato che si dispone già di HTML, suggerisco di dare un'occhiata a XMLWorker di iText: http://developers.itextpdf.com/examples/xml-worker/html-tables. Gli esempi sono in Java, ma dovrebbero essere abbastanza ovvi per C#. iTextSharp è la porta .NET di iText. Divulgazione: lavoro su iText Software. –

+0

Interessante. Posso in qualche modo gestire la colonna che si adatta orizzontalmente? Voglio dire, se ci sono troppe colonne per rientrare in una pagina, posso spostarne alcune alla successiva? – kagelos

+0

@kagelos Ho una soluzione che farà esattamente ciò che vuoi, ma richiede jquery. Quindi posso usare jquery e darti una soluzione? –

risposta

2

Si potrebbe provare Spartacus.

È una libreria .NET relativamente nuova, completamente scritta in C#. Può connettersi a molti database diversi e generare report in Excel e PDF.

ho caricato 3 file in Google Drive:

Per poter utilizzare Spartacus, è necessario fare riferimento System.Data e System.Xml pacchetti, così come Spartacus.dll.

Nel seguente esempio, ho creato report.pdf da template.xml in semplici passi:

Spartacus.Database.Generic v_database; 
Spartacus.Reporting.Report v_report; 
System.Data.DataTable v_table; 

v_database = new Spartacus.Database.Postgresql("127.0.0.1", "database", "postgres", "password"); 

v_table = v_database.Query(
    "select 'Example of Report made with Spartacus' as title, " + 
    "  product, " + 
    "  description, " + 
    "  unit, " + 
    "  quantity, " + 
    "  total_cost, " + 
    "  unit_cost " + 
    "from table", "REPORT"); 

v_report = new Spartacus.Reporting.Report(1, "template.xml", v_table); 
v_report.Execute(); 
v_report.Save("report.pdf"); 

Si noti che non è necessario utilizzare gli oggetti Spartacus.Database. Se è possibile ottenere System.Data.DataTable con altri mezzi, è possibile passarlo all'oggetto Report.

Tuttavia, c'è un problema.Come si può vedere nel modello XML, per ogni colonna, è necessario sapere:

  • Nome colonna (ovviamente)
  • Titolo
  • Allinea (sinistra, destra o centrale)
  • Fill (cento , 100 la larghezza totale della larghezza della pagina meno dei margini)
  • tipo (intero, reale, BOOLEAN, CHAR, DATE o STRING)

riempimento e tipo sono essenziali, e si mA Devi mantenere le informazioni su tutte le tue colonne. Se questo è troppo difficile da raggiungere, e si può ottenere solo nome di colonna e tipo, si può calcolare un'approssimazione basata solo su tipo, come la seguente:

  • prodotto è di tipo stringa, riempimento di default = 30
  • descrizione è di tipo STRING, riempimento predefinito = 30
  • unità è di tipo STRING, riempimento predefinito = 30
  • quantità è di tipo REAL, riempimento di default = 15
  • total_cost è di tipo REAL, riempimento di default = 15
  • unit_cost è di tipo REAL, riempimento di default = 15

la somma di tutti riempimento predefinito sono 30 + 30 + 30 + 15 + 15 + 15 = 135, superiore a 100. Così si può normalizzare a 100, in questo modo:

  • Colonna fill = default Colonna di riempimento * (somma di inadempienza riempie/100)

Dopodiché, sarà necessario generare file template.xml dinamici con informazioni di campo dinamiche.

DISCLAIMER: Sono il creatore e manutentore di Spartacus.

+0

Sembra molto bello. Come posso gestire i casi in cui le colonne non si adattano in una sola pagina in senso orizzontale? – kagelos

+0

@kagelos Spartacus non lo consente. Se si specifica che una colonna ha il 30% della larghezza totale, avrà sempre il 30% della larghezza totale. Se il contenuto non si adatta a questo spazio, Spartacus taglia il contenuto in modo dinamico. – wind39

0

SSRS ha un ottimo supporto per la gestione automatica dell'impaginazione, ma il rispetto delle sue regole è fondamentale.

Understanding Pagination in Reporting Services (Report Builder 3.0 and SSRS)

Se è stata progettata una relazione da una pagina di larghezza, ma rende su più pagine, verificare che la larghezza del corpo del report, inclusi i margini, non è più grande della dimensione della pagina fisica larghezza. Per impedire l'aggiunta di pagine vuote al report, è possibile ridurre le dimensioni del contenitore trascinando l'angolo del contenitore a sinistra.

+0

Credo che ti sia sfuggita la parte più importante della domanda, ovvero che le colonne del rapporto vengono aggiunte/rimosse dinamicamente. Se si trattasse di un report statico, o se fossi interessato solo a convertire HTML in PDF, non porrei una domanda in primo luogo. Sto cercando una soluzione in cui posso dividere a livello di codice il report orizzontalmente in più pagine. – kagelos

+0

IMHO SSRS ha il miglior supporto per questo, ma non eri appassionato dal suono delle cose. –

+0

@JeremyThompson Come posso creare un report in SSRS a livello di codice dove aggiungo dinamicamente le colonne?Come ho detto nella mia domanda, le soluzioni che ho visto finora tentano di creare il file di definizione stampando (brutto) testo/codice. Vorrei evitare questo. – kagelos