Ciao a tutti.
Sono nuovo e spero perdonerete qualche mio strafalcione se doveste rilevarne.
Ho la necessità di creare "al volo" un documento in formato .csv partendo dal resultSet di una select Oracle: non voglio creare un file fisico, ma aprire il documento risultante da browser.
Il risultato della select, dato che lo devo utilizzare anche per altre operazioni, per comodità l'ho trasferito su un vettore di Hashtable: da questo parto per aprire il documento .csv.
Di seguito il codice che ho scritto:
codice:
private void scriviFileDownload(HttpServletResponse res,HttpSession session, Vector listaRichieste) throws Exception {
// creo un nome univoco per il file che andrò a generare
Calendar oggi = Calendar.getInstance();
String nomeFile = "dwn" +
new Integer(oggi.get(Calendar.YEAR)).toString() +
new Integer(oggi.get(Calendar.MONTH)).toString() +
new Integer(oggi.get(Calendar.DAY_OF_MONTH)).toString() +
new Integer(oggi.get(Calendar.HOUR_OF_DAY)).toString() +
new Integer(oggi.get(Calendar.MINUTE)).toString() +
new Integer(oggi.get(Calendar.SECOND)).toString();
// configuro response per il browser
res.setContentType("text/x-comma-separated-values");
res.setHeader("Content-Disposition","attachment;filename=" + nomeFile + ".csv");
//
try
{
ServletOutputStream sos = res.getOutputStream();
StringBuffer sb = new StringBuffer();
// Riga di intestazione del file
sb.append("CODICE USERID");
sb.append(',');
sb.append("CODICE ASSEGNAZIONE");
sb.append(',');
sb.append("COGNOME");
sb.append(',');
sb.append("NOME");
sb.append(',');
sb.append("AMMINISTRAZIONE");
sb.append(',');
sb.append("UFFICIO");
sb.append(',');
sb.append("EMAIL USER");
sb.append(',');
sb.append("DATA ASSEGNAZIONE");
sb.append(',');
sb.append("DATA SCADENZA");
sb.append('\n');
// Ciclo per la scrittura dei dati - estraggo i dati dalle Hash contenute nel Vector e li separo
// con una virgola. Alla fine di ogni riga inserisco un carriage return
Enumeration e = (Enumeration) listaRichieste.elements();
if (e.hasMoreElements()) {
while (e.hasMoreElements()) {
Hashtable ht = (Hashtable) e.nextElement();
sb.append(ht.get("userid"));
sb.append(',');
sb.append(ht.get("c_assegn"));
sb.append(',');
sb.append(ht.get("cognome"));
sb.append(',');
sb.append(ht.get("nome"));
sb.append(',');
sb.append(ht.get("amministrazione"));
sb.append(',');
sb.append(ht.get("ufficio"));
sb.append(',');
sb.append(ht.get("email_user"));
sb.append(',');
sb.append(ht.get("dt_assegn"));
sb.append(',');
sb.append(ht.get("dt_scad"));
sb.append('\n');
}
} else {
sb.append("NESSUNA RICORRENZA ESTRATTA PER IL RANGE DI RICERCA INDICATO");
}
InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
byte[] outputByte = new byte[4096];
//copio il contenuto binario su output stream
while(in.read(outputByte, 0, 4096) != -1)
{
sos.write(outputByte, 0, 4096);
}
in.close();
sos.flush();
sos.close();
} catch (Exception e) {
throw e;
}
}
Tutto sembrerebbe funzionare, ma in realtà il file risultante contiene stranezze rispetto a ciò che mi aspetto: record doppi, talvolta incompleti ecc.
C'è qualcosa di sbagliato nel mio codice?
Grazie.