Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C#] Creazione file compresso

    Salve a tutti!

    Ho una pagina aspx che, dopo un'interrogazione ad un DB, mi permette di visualizzare una tabella con determinate informazioni.
    L'utente può decidere di salvare in locale tale tabella mediante selezione di un radiobutton, specificando se vuole il risultato il formato excel od in formato txt.

    E' presente un altro radiobutton che consente anche il salvataggio di tali file (xls o txt) anche in formato compresso (zip)...potreste aiutarmi ed indicarmi come muovermi in tale direzione?

    I file xls e txt vengono creati così:

    if(rbFormato.SelectedValue=="EXCEL")
    {
    Response.Clear();
    Response.Buffer=true;

    Response.ContentType="application/vnd.ms-excel;filename=\Elenco.xls\""
    // per il file txt è: Response.ContentType="text/plain;filename=\Elenco.txt\""

    Response.Charset="";

    this.EnableViewState=false;

    System.IO.StringWriter tw=new System.IO.StringWriter();

    //Prima riga di intestazione
    tw.Write("Colonna1");
    tw.Write("Colonna2");
    tw.Write("Colonna3");

    // Carico poi tutti i dati con un foreach

    Response.Write(tw.ToString());
    Response.End();
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    CIAO!
    hai bisogno di una libreria "famosa" per questo scopo... chiamata ZipLib

    http://www.dotnethell.it/articles/Ziplib.aspx
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  3. #3
    Ciao!
    Ho inserito la libreria ed usato il codice così:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using ICSharpCode.SharpZipLib.Zip;
    using System.IO;
    using System.Configuration;
    using System.Collections;


    namespace Zip1
    {
    class Program
    {
    static void Main(string[] args)
    {
    string Elenco = ConfigurationManager.AppSettings["nomeFile"];
    //string ElencoNomeFile = ConfigurationManager.AppSettings["pathFilename"];
    string Archivio = ConfigurationManager.AppSettings["fileDaCreare"];

    FileStream fs = File.OpenRead(Elenco);
    ZipOutputStream s = new ZipOutputStream(File.Create(Archivio));


    byte[] buffer = new byte[fs.Length];

    fs.Read(buffer, 0, buffer.Length);


    ZipEntry myentry = new ZipEntry(Elenco);

    s.PutNextEntry(myentry);

    s.Write(buffer, 0, buffer.Length);
    }
    }
    }

    Dove 'Elenco' punta al file .txt da zippare, mentre Archivio al file di output(.zip) che dovrebbe esser creato: ebbene...il file Archivio.zip viene si creato, ma mi solleva un errore:

    l'archivio o è danneggiato o è in un formato sconsciuto...

    Perchè?


    ****EDIT: penso d'aver risolto: dovevo chiudere e fare il dispose...Anche se non mi è molto chiaro ancora dove viene creato e poi come scompattare l'archivio, ma ci sto lavorando su...grazie! ;-)***

    ***EDIT2: Il problema ora è un altro: come integrare questa libreria con il Response? Questo script necessita la creazione di un file tutto nuovo, mentre io vorrei che si aprisse la finestra di salvataggio come accade per l'excel o il txt...come risolvo?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    CIAO!
    su questo ti posso aiutare,
    perche l'ho fatto...
    quando arrivo a casa ti mando la snippet!
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    Ciao!
    Sostituisci File.Create(archivio)
    con

    Response.OutputStream

    ZipOutputStream s = new ZipOutputStream(Response.OutputStream);
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  6. #6
    Stefano...tu sei un santo...ma ti chiedo di aiutarmi ancora, perchè non mi ci raccapezzo...

    Ecco il mio codice (lo prendo da quando c'è il check sul radiobutton che seleziona il file EXCEL):

    if (rbFormato.SelectedValue == "EXCEL")
    {
    Response.Clear();
    Response.Buffer = true;

    Response.ContentType = "application/vnd.ms-excel;filename=\"ElencoPagamenti.xls\"";

    Response.Charset = "";
    this.EnableViewState = false;

    System.IO.StringWriter tw = new System.IO.StringWriter();

    //Prima riga di intestazione
    tw.Write("Pagamento\t");
    tw.Write("Mod. Pag.\t");
    tw.Write("Anno Imp.\t");

    //elenco è l'arraylist che contiene i dati provenienti dal DB
    foreach (DatiPagamento datiPag in elenco)
    {
    tw.Write(datiPag.TipoPag + "\t");
    tw.Write(datiPag.ModPag + "\t");
    tw.Write(datiPag.AnnoImposta + "\t");
    tw.Write("\t\r");
    }

    Response.Write(tw.ToString());

    //Da qui comincia la parte 'incriminata'
    if (rbModPag.SelectedValue == "ZIP")
    {

    /*Cosa devo inserire qui?
    * volendo evitare, come ti dicevo, di creare una cartella
    * apposita dove inserire il file, ma fare in modo che mi si
    * apra la finestrella che mi consenta di salvare dinamicamente
    * dove voglio io il file compresso, che sintassi usare?

    }

    //questo va qui o nell'if???
    Response.End();


    Grazie immensamente per l'aiuto!

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    CIAO!

    allora, innanzi tutto cambia il content type nel ramo ZIP:
    Response.ContentType = "application/vnd.ms-excel;filename=\"ElencoPagamenti.xls\"";
    diventera' (nel ramo zip) Response.ContentType = "application/x-zip;filename=\"ElencoPagamenti.zip\"";

    quindi, aggiungi le seguenti righe (nel ramo zip):

    string Elenco = ConfigurationManager.AppSettings["nomeFile"];


    FileStream fs = File.OpenRead(Elenco);

    //la seg. riga di permettere di scrivere nello stream http
    ZipOutputStream s = new ZipOutputStream(Response.OutputStream);


    byte[] buffer = new byte[fs.Length];

    fs.Read(buffer, 0, buffer.Length);


    ZipEntry myentry = new ZipEntry(Elenco);

    s.PutNextEntry(myentry);

    s.Write(buffer, 0, buffer.Length);


    infine il response.End va messo alla fine (perche in tutti i casi stai generando un allegato)

    Spero di averti aiutato
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  8. #8
    Ma in tal modo io dovrei specificare nel WebConfig (è un file aspx) la cartella ed il file dove dovrà esser salvato il file zippato...mentre io desidero che sia l'utente a specificare il path, uguale a come accade quando salvo come .xls.

    Dal tuo codice io salvo il file in formato .zip, ma poi quando lo scompatto cosa diventa? Non si fa mai riferimento all'arraylist proveniente dal db e quindi non mi spiego come poi, una volta salvato e spacchettato, possa vedere il formato del mio file...

    Ci sono 2 scelte, EXCEL o TXT e per ognuna di queste ZIP o ESTESO...ma devo cmq mantenere il formato scelto (xls o txt) e poi comprimerlo...

    giuro, mi sto scemunendo!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    Scusami,
    non avevo capito la problematica!!
    quindi in realta' hai QUATTRO scelte non tre...

    testo normale/compresso e excel normale/compresso....

    if (rbFormato.SelectedValue == "EXCEL")
    {
    Response.Clear();
    Response.Buffer = true;
    if(!opzioneZipExcel)
    {
    Response.ContentType = "application/vnd.ms-excel;filename=\"ElencoPagamenti.xls\"";
    }

    else
    {
    Response.ContentType = "application/x-zip;filename=\"ElencoPagamenti.zip\"";
    }

    if(!opzioneExcel)
    {
    Response.Write(tw.ToString());
    }
    else
    {
    ZipOutputStream s = new ZipOutputStream(Response.OutputStream);
    byte[] buffer = Encoding.ASCII.GetBytes(tw.ToString());
    ZipEntry myentry = new ZipEntry("ElencoPagamenti.xls");
    s.PutNextEntry(myentry);
    s.Write(buffer, 0, buffer.Length);
    // chiudi stream
    }

    }

    Analogo discorso per il formato di testo!
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  10. #10
    Stefano...io ti ringrazio per la pazienza...ma io ci sto uscendo matto!

    Il fatto è che la libreria non ti da neanche spiegazioni sulle varie funzioni della Zip, quindi non so in che direzione muovermi!

    questo è quello che ho fatto (nel caso di selezione dell'EXCEL):

    if (rbFormato.SelectedValue == "EXCEL")
    {
    Response.Clear();
    Response.Buffer = true;

    if (rbModPag.SelectedValue == "ZIP")
    {
    Response.ContentType = "application/x-zip;filename=\"ElencoPagamenti.zip\"";
    }
    else if (rbModPag.SelectedValue == "ESTESO")
    {
    Response.ContentType = "application/vns.ms-excel;filename=\"ElencoPagamenti.xls\"";
    }

    if (rbModPag.SelectedValue == "ESTESO")
    {
    Response.Charset = "";
    this.EnableViewState = false;

    System.IO.StringWriter tw = new System.IO.StringWriter();

    //Prima riga di intestazione
    tw.Write("Pagamento\t");
    tw.Write("Mod. Pag.\t");
    tw.Write("Anno Imp.\t");

    foreach (DatiPagamento datiPag in elenco)
    {
    tw.Write(datiPag.TipoPag + "\t");
    tw.Write(datiPag.ModPag + "\t");
    tw.Write(datiPag.AnnoImposta + "\t");
    tw.Write("\t\r");
    }

    Response.Write(tw.ToString());
    }
    else
    {
    Response.Charset = "";
    this.EnableViewState = false;

    System.IO.StringWriter tw = new System.IO.StringWriter();

    //Prima riga di intestazione
    tw.Write("Pagamento\t");
    tw.Write("Mod. Pag.\t");
    tw.Write("Anno Imp.\t");

    foreach (DatiPagamento datiPag in elenco)
    {
    tw.Write(datiPag.TipoPag + "\t");
    tw.Write(datiPag.ModPag + "\t");
    tw.Write(datiPag.AnnoImposta + "\t");

    tw.Write("\t\r");
    }

    ZipOutputStream s = new ZipOutputStream(Response.OutputStream);
    byte[] buffer = Encoding.ASCII.GetBytes(tw.ToString());
    ZipEntry myEntry = new ZipEntry("ElencoPagamenti.xls");

    s.PutNextEntry(myEntry); **************************
    s.Write(buffer, 0, buffer.Length);

    s.Close();
    tw.Close();

    }
    }

    Mi si schianta all'altezza degli asterischi:
    'Specified argument was out of the range of valid values.
    Parameter name: offset


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.