PDA

View Full Version : [JAVA] esportare in xls


sub_zero_
08-03-2010, 17:14
Salve ragazzi, sono nuovo di questo forum e spero di trovare quello che mi serve. Prima di tutto mi scuso se questa non è la sessione adatta dove inserire questa discussione, ma nn ho trovato niente di meglio.

Vi spiego brevemente il mio problema.
Ho una pagina jsp caricata da una servlet apposita che prende dei valori da un DB Mysql e li mostra nel browser. Alla fine di questa pagina ho un bottone che serve per salvare la pagina così com'è in un file Excel utilizzando le librerie jxl.jar (mi hanno messo solo queste a disposizione!!)

Adesso il problema è: come faccio?? Io so creare un nuovo foglio di lavoro excel...ma per settare tutti i campi della pagina al posto giusto?? Se qualcuno è in grado di aiutarmi gli mando senza problemi il codice relativo alla pagina e alla servlet fatte finora!! Vi ringrazio moltissimo in anticipo!!!

Daniele

Mixmar
08-03-2010, 17:26
Puoi provare ad utilizzare POI-HSSF (http://poi.apache.org/spreadsheet/index.html); se hai fretta, guarda questo riassunto (http://poi.apache.org/spreadsheet/quick-guide.html).

sub_zero_
08-03-2010, 17:52
Innanzi tutto ti ringrazio per la tua risposta. Il problema è che devo utilizzare la libreria jxl.jar che è quella che mi hanno detto di usare.

Sinceramente non so se le due librerie hanno qualche differenza tra loro, ma questa è quella che ho. :(

Se hai bisogno del codice di quello che ho fatto per potermi aiutare più facilmente ti mando i file interessati. Ti ringrazio moltissimo per la disponibilità...

kk3z
08-03-2010, 19:06
Excel può leggere una tabella html. Quindi se tu mandi in output una tabella html e usi i giusti header (content-type: application/excel o qualcosa di simile e content-disposition:attachment) puoi scaricare un bel file excel. :)

sub_zero_
08-03-2010, 20:32
Excel può leggere una tabella html. Quindi se tu mandi in output una tabella html e usi i giusti header (content-type: application/excel o qualcosa di simile e content-disposition:attachment) puoi scaricare un bel file excel. :)


Questa è un'ottima cosa.... :D Quindi ricapitolando....se io ho una servlet che carica una pagina chiamata pippo.jsp e all'interno di questa pagina ho un pulsante che mi deve far esportare il tutto su un file .xls, creato come :

<form action="Export" method="get">
<input type ="submit" name="main" value="Export in .XLS" />
</form>

la nuova servlet Export nel metodo doGet(...) può fare quello che ho detto semplicemente mandando in output la tabella html?? Mi potresti dire brevemente le operazioni da fare all'interno del metodo doGet?...

Scusa per la mia ignoranza in materia, ma è la prima volta che mi capita una cosa del genere ed ho pochissimo tempo per farla...una volta che riesco nel mio intento studierò meglio le cose in modo da capirci anche qualcosa visto che è una cosa che mi piace pure molto...

sub_zero_
09-03-2010, 09:38
UP :mc: :mc:

ally
09-03-2010, 18:01
UP :mc: :mc:

...mah con le POI in un oretta hai implementato la funzione...non puoi proprio usare altre librerie?...hai già guardato la documentazione di quelle imposte?...

...ciao Andrea...

sub_zero_
09-03-2010, 19:14
...mah con le POI in un oretta hai implementato la funzione...non puoi proprio usare altre librerie?...hai già guardato la documentazione di quelle imposte?...

...ciao Andrea...


Grazie dell'interessamento...le POI non le ho mai utilizzate e non saprei come fare...mi hanno dato questa libreria jxs.jar e mi sono attenuto alle specifiche.
Il fatto è che non è proprio così semplice (o forse io non ci arrivo proprio!!)

Se ti va di farmi vedere un esempio con un po' di codice per capire come utilizzare queste POI e soprattutto da dove scaricarle per poterle aggiungere al mio progetto te ne sarei davvero grato...

Daniele

ally
10-03-2010, 08:39
Grazie dell'interessamento...le POI non le ho mai utilizzate e non saprei come fare...mi hanno dato questa libreria jxs.jar e mi sono attenuto alle specifiche.
Il fatto è che non è proprio così semplice (o forse io non ci arrivo proprio!!)

Se ti va di farmi vedere un esempio con un po' di codice per capire come utilizzare queste POI e soprattutto da dove scaricarle per poterle aggiungere al mio progetto te ne sarei davvero grato...

Daniele



try {
HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet("pagina 1");
HSSFRow row = null;
row = sheet.createRow(0);
row.createCell((short)0).setCellValue("xyz1");
row.createCell((short)1).setCellValue("xyz2");

HSSFSheet sheets = wb.createSheet("pagina 2");
HSSFRow rows = null;
rows = sheets.createRow(0);
rows.createCell((short)0).setCellValue("xyz1");
rows.createCell((short)1).setCellValue("xyz2");

FileOutputStream fileOut = new FileOutputStream("filetest.xls");
wb.write(fileOut);
fileOut.close();


} catch ( Exception ex ) {
ex.printStackTrace();
}



...un esempietto veloce...in sinto creo due pagine e per ogni pagina una riga con due celle alimentate da una stringa...

...ciao Andrea...

sub_zero_
10-03-2010, 11:53
Grazie per l'aiuto, ma il mio problema è un altro. Sicuramente non mi sono spiegato bene. Cercherò di farlo adesso.

Io ho una pagina jsp chiamata "riepilogo" all'interno della quale ho un button al cliccare del quale mi deve far avere l'intera pagina riepilogo su un foglio Excel.
Cliccando questo bottone il controllo passa a una servlet "Export" nel metodo doGet. Fin qui credo di essere stato chiaro. Adesso il metodo doGet mi deve dare modo di creare tale pagina excel. Nel modo che mi hai detto te dovrei settare cella per cella dell'intera pagina e credo sia un lavoro molto lungo visto che la pagina "riepilogo" non consta di poche righe.

Mi chiedevo se ci fosse un modo per poter mandare in Input al Workbook la pagina riepilogo all'interno del metodo doGet della servlet che ti ho appena detto.

Spero di essere stato sufficientemente chiaro adesso :D

Daniele

ally
10-03-2010, 12:25
...

Mi chiedevo se ci fosse un modo per poter mandare in Input al Workbook la pagina riepilogo all'interno del metodo doGet della servlet che ti ho appena detto.

Spero di essere stato sufficientemente chiaro adesso :D

Daniele

...beh il tutto sta a te...puoi salvare il file in una directory temp e mostrare il link a pagina per il download...puoi inviare l'xls in sessione...personalmente aggiungerei un bottone sulla pagina che se premuto richiede alla servlet/action/portlet di generare l'xls in base ai dati in sessione...fatto cio' salvi il file in una directory temp e visualizzi il link a video per il download...risparmiando la pesantezza di inviare alla pagina l'intero xls...

...ciao Andrea...

sub_zero_
10-03-2010, 14:13
...beh il tutto sta a te...puoi salvare il file in una directory temp e mostrare il link a pagina per il download...puoi inviare l'xls in sessione...personalmente aggiungerei un bottone sulla pagina che se premuto richiede alla servlet/action/portlet di generare l'xls in base ai dati in sessione...fatto cio' salvi il file in una directory temp e visualizzi il link a video per il download...risparmiando la pesantezza di inviare alla pagina l'intero xls...

...ciao Andrea...


:help: :help: .... sinceramente non ho capito molto la soluzione :(

ally
10-03-2010, 14:39
:help: :help: .... sinceramente non ho capito molto la soluzione :(

...scusa i dati normalmente come li passi alla jsp?...o come li peschi dallo strato persistente?...

...ciao Andrea...

sub_zero_
10-03-2010, 14:41
i dati alla jsp me li vado a prendere da DB mysql...nella servlet poi uso la getParameter...

ally
10-03-2010, 14:44
i dati alla jsp me li vado a prendere da DB mysql...nella servlet poi uso la getParameter...

...request.getParameter() ?...e hai annegato la logica mysql direttamente nella pagina?...

...ciao Andrea...

sub_zero_
10-03-2010, 14:48
si...io non ho fatto tutto questo....mi hanno dato le pagine jsp già fatte....e dovevo connetterle fra loro con delle servelt. Nelle servelt ho fatto tutti i controlli sulla correttezza dei dati inseriti nel DB e il passaggio da una pagina all'altra.

Nell'ultima pagina devo annettere a quel bottone quello che ti ho spiegato prima e non ho proprio idea di come fare perchè non riesco in nessun modo a salvarmi la pagina per poi "passarla in Input" alla pagina Excel.

ally
10-03-2010, 14:54
si...io non ho fatto tutto questo....mi hanno dato le pagine jsp già fatte....e dovevo connetterle fra loro con delle servelt. Nelle servelt ho fatto tutti i controlli sulla correttezza dei dati inseriti nel DB e il passaggio da una pagina all'altra.

Nell'ultima pagina devo annettere a quel bottone quello che ti ho spiegato prima e non ho proprio idea di come fare perchè non riesco in nessun modo a salvarmi la pagina per poi "passarla in Input" alla pagina Excel.

...veramente in sessione puoi mettere tutto cio' che credi e riprenderlo quando credi...



request.getSession().setAttribute("oggettone",oggetto);



....ciao Andrea...

sub_zero_
10-03-2010, 14:58
quindi te mi dici di fare nella servlet Export una

request.getSession()....

e quello che mi restituisce lo passo come parametro ai dati della pagina excel??
Scusa la mia ignoranza ma queste librerie che non sono di default di JDK non le ho proprio mai usate e mi restano ignote....

ally
10-03-2010, 15:02
quindi te mi dici di fare nella servlet Export una

request.getSession()....

e quello che mi restituisce lo passo come parametro ai dati della pagina excel??
Scusa la mia ignoranza ma queste librerie che non sono di default di JDK non le ho proprio mai usate e mi restano ignote....

...posta il tuo codice...evitiamo di stravolgere quanto hai scritto fin ora...

...ciao Andrea...

sub_zero_
10-03-2010, 15:07
ok....allora

Questa è la pagina jsp:

<%--
Document : paginaRiepilogo
Created on : 23-set-2009, 16.15.20
Author : Daniele Bertelli
--%>

<html>
<%@page import="java.sql.*, java.text.DecimalFormat, java.util.GregorianCalendar, java.text.SimpleDateFormat, java.util.Calendar" %>
<head>
<title> WEST SYSTEMS </title>
<script type="text/javascript">
function SelectPost()
{
document.reload.method = "post";
document.reload.action = "Riepilogo";
document.reload.submit();
}
</script>

</head>
<body>
<%!private static final String DATE_FORMAT = "dd MMMMMMMMM yyyy";%>
<%
String par = (String) request.getAttribute("parametro");
String url = "com.mysql.jdbc.Driver";
Connection conn = null;
try {
Class.forName(url);
conn = DriverManager.getConnection("jdbc:mysql://localhost/tirocinio?user=root&password=10a5gr8b");
} catch (Exception exc) {
out.println(exc.toString());
}

%>
<div align="center">
<strong>
<label for="Intestazione"> RIEPILOGO DATI PREVENTIVO </label><br><br>
</strong>
<form name="myform" action="PrimaPagina" method="get">
<p>
</p>
<table width="688" border="0" cellspacing="1" cellpadding="2">
<%Statement stm = null, stm2 = null;
ResultSet rst = null;
String queryPrev = "";
int ID = 0;
stm = conn.createStatement();
stm2 = conn.createStatement();
if (par.equalsIgnoreCase("nessun_parametro")) {
queryPrev = "SELECT * FROM preventivo";
} else {
String[] tmp = par.split(",");
ID = Integer.parseInt(tmp[0]);
queryPrev = "SELECT * FROM preventivo WHERE IDpreventivo=" + ID + ";";
}
rst = stm.executeQuery(queryPrev);
ResultSet prev = stm2.executeQuery("SELECT * FROM preventivo");
rst.last();
ID = Integer.parseInt(rst.getString("IDpreventivo"));
%>
<tr>
<td width="154"><label for="Nome" >Nome: </label></td>
<td width="523" bgcolor="#EAEAEA"><input type="text" name="nome" size="50" value="<%=rst.getString("Nome")%>" readonly/></td>
</tr>
<tr>
<td><label for="Descrizione" >Descrizione:</label></td>
<td bgcolor="#DBDBDB"><input type="text" name="descrizione" size="50" value="<%=rst.getString(3)%>" readonly/></td>
</tr>
<tr>
<%Statement temp = null;
ResultSet rstTemp = null;
temp = conn.createStatement();
rstTemp = temp.executeQuery("SELECT Nome FROM clienti WHERE IDcliente=" + Integer.parseInt(rst.getString(6)) + ";");
rstTemp.next();
%>
<td><label for="Committente" >Committente:</label></td>
<td bgcolor="#DBDBDB"><input type="text" name="committente" size="50" value="<%=rstTemp.getString("Nome")%>" readonly/></td>
</tr>
<tr>
<%temp = null;
rstTemp = null;
temp = conn.createStatement();
rstTemp = temp.executeQuery("SELECT Nome, Cognome FROM utenti WHERE IDutente=" + Integer.parseInt(rst.getString(7)) + ";");
rstTemp.next();
%>
<td><label for="Responsabile" >Responsabile:</label></td>
<td bgcolor="#DBDBDB"><input type="text" name="responsabile" size="50" value="<%=rstTemp.getString("Nome") + " " + rstTemp.getString("Cognome")%>"readonly/></td>
</tr>
<tr>
<%String[] data = rst.getString(4).split("-");
GregorianCalendar gc = new GregorianCalendar(Integer.parseInt(data[0]),
Integer.parseInt(data[1]) - 1, Integer.parseInt(data[2]));
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
%>
<td><label for="Inizio" >Data di inizio:</label></td>
<td bgcolor="#DBDBDB"><input type="text" name="inizio" size="50" value="<%=sdf.format(gc.getTime())%>" readonly/></td>
</tr>
<tr>
<td><label for="Durata">Durata Preventivata:</label></td>
<td bgcolor="#DBDBDB"><input type="text" name="durata" size="50" value="<%=rst.getString(5)%> mesi" readonly/></td>
</tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr>
<%gc.add(Calendar.MONTH, Integer.parseInt(rst.getString(5)));%>
<td><label for="Fine"><b>Fine prevista per il:</b></label></td>
<td bgcolor="#DBDBDB"><b><input type="text" name="fine" size="50" value="<%=sdf.format(gc.getTime())%>" readonly/></b></td>
</tr>
</table>
<br><br>
<%
/* Calcolo il COSTO TOTALE MANODOPERA */
temp = null;
rstTemp = null;
temp = conn.createStatement();
rstTemp = temp.executeQuery("SELECT IDqualifica, NumeroOre FROM preventivoqualifica WHERE IDpreventivo=" + Integer.parseInt(rst.getString(1)) + ";");
double costo = 0.00;
Statement in = null;
while (rstTemp.next()) {
in = conn.createStatement();
ResultSet s = in.executeQuery("SELECT CostoOrario FROM qualifica WHERE IDqualifica=" + rstTemp.getString("IDqualifica") + ";");
s.next();
costo += Double.parseDouble(s.getString("CostoOrario")) * Double.parseDouble(rstTemp.getString("NumeroOre"));
in.close();
}
DecimalFormat format = new DecimalFormat("0.00");
%>
<label for="Costo">
<b><font color="blue">Costo della manodopera qualificata utilizzata:</font></b>
</label>
<input type="text" name="durata" size="20" value="<%=format.format(costo)%>" readonly/>
<label for="euro">Euro</label><br><br>
<table width="500" border="0" cellspacing="1" cellpadding="2">

<% Statement att = null, att2 = null, att3 = null, inQ = null;
ResultSet rstAtt = null, rstQual = null;
att = conn.createStatement();
att2 = conn.createStatement();
att3 = conn.createStatement();
inQ = conn.createStatement();
rst = att.executeQuery("SELECT * FROM preventivo;");
rst.last();
rstAtt = att2.executeQuery("SELECT * FROM attivitapreventivo WHERE IDpreventivo=" + ID + ";");
while (rstAtt.next()) {
rstQual = inQ.executeQuery("SELECT * FROM preventivoqualifica WHERE IDpreventivo=" + ID + " AND IDattivita=" + Integer.parseInt(rstAtt.getString("IDattivita")) + ";");
rstTemp = att3.executeQuery("SELECT Nome FROM attivita WHERE IDattivita=" + Integer.parseInt(rstAtt.getString("IDattivita")) + ";");
rstTemp.next();
%>
<tr>
<td></td>
<td><hr noshade size="1" style="color:black"></td>
<td><hr noshade size="1" style="color:black"></td>
<td></td>
</tr>
<tr>
<td width="150"><label for="Attività" style="color:blue">Attivit&agrave;</label></td>
<td width="150"><label for="Durata" style="color:blue">Durata</label></td>
<td width="150"><label for="Numero Ore" style="color:blue">Numero di ore</label></td>
<td width="50"><label for="Shift" style="color:blue" >Shift</label></td>
</tr>
<tr>
<td width="150"> <%=rstTemp.getString("Nome")%></td>
<td width="150"><%=rstAtt.getString("Durata")%> mese/i</td>
<td width="150"><%=rstAtt.getString("NumeroOre")%></td>
<td width="50"><%=rstAtt.getString("ShiftTemporale")%></td>
</tr>

<%
while (rstQual.next()) {
rstTemp = att3.executeQuery("SELECT Descrizione FROM qualifica WHERE IDqualifica=" + Integer.parseInt(rstQual.getString("IDqualifica")) + ";");
rstTemp.next();

%>
<tr>
<td width="150"></td>
<td width="150"><label for="Durata" style="color:red">Qualifica</label></td>
<td width="150"><label for="Numero Ore" style="color:red">Numero di ore</label></td>
<td width="50"><label for="Shift" style="color:red" >Shift</label></td>
</tr>
<tr>
<td width="150"></td>
<td width="150"><%=rstTemp.getString("Descrizione")%></td>
<td width="150"><%=rstQual.getString("NumeroOre")%></td>
<td width="50"><%=rstQual.getString("ShiftTemporale")%></td>
</tr>

<%
}
}%>
</table>
<br><br><input type="submit" name="submit" value="Inserisci altri preventivi"/>
</form>
</div>
<p></p>
<div align="center">
<table border="0">
<tr>
<td width="100" align="center" valign="middle">
<form action="Start" method="get">
<input type ="submit" name="main" value="Torna alla HomePage" />
</form>
</td>
<td width="100" align="center" valign="middle">
<p>
<label for=spazio" ></label>
</p>
</td>
<td width="100" align="center" valign="middle">
<p>
<label for=Scelta" >Scegli il preventivo da visualizzare</label>
</p>
</td>
<td width="100" align="center" valign="middle">
<form action="Riepilogo" name="reload" method="get">
<select name="Prev" id="Prev" onchange="SelectPost()">
<option selected> <%=" "%></option>
<% while (prev.next()) {%>
<option>
<%=prev.getString("IDpreventivo") + ", " + prev.getString("Nome")%>
</option>
<%}%>
</select>
</form>
</td>
</tr>
<tr>
<td></td>
<td></td>

</tr>
</table>

</div>
<p></p>
<div align="center">
<table border="0">
<tr>
<td width="100" align="center" valign="middle">
<form action="Export" method="get">
<input type ="submit" name="main" value="Export in .XLS" />
</form>
</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
</div>
</body>
</html>


mentre questa è la servlet che dovrei fare...qui c'è solo un esempio da me fatto per la creazione di un nuovo foglio excel con una cella riempita....funzionante

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Export extends HttpServlet {

@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
OutputStream out = null;
try {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment");
WritableWorkbook w = Workbook.createWorkbook(response.getOutputStream());
WritableSheet s = w.createSheet("Demo", 0);
s.addCell(new Label(0, 0, "Hello World"));
w.write();
w.close();

} catch (Exception e) {
throw new ServletException("Exception in Excel Sample Servlet", e);
} finally {
if (out != null) {
out.close();
}
}
}
}



Grazie ancora per l'immensa disponibilità....

ally
10-03-2010, 16:50
...miseriaccia...non annegare tutto la logica sulla pagina...risulta molto illegibile...esegui sempre le operazioni sul db sulla servlet o meglio ancora su uno strato separato...esegui lato servlet la creazione del file xls e slavalo su una locazione raggiungibile lato web tipo :


getServlet().getServletContext().getRealPath("/")+"Temp";


...nella servlet implementi la funzione di creazione del file con salvataggio nel path appena descritto...nelle pagine riporti il link...non odiarmi appena posso ti completo l'esempio...

...ciao Andrea...

sub_zero_
11-03-2010, 20:54
Grazie Andrea...veramente disponibilissimo anche davanti alla mia ignoranza in materia...il fatto è che non posso modificare la logica delle pagine jsp...ho dovuto aggiungere solo la comunicazione tra le pagine perchè così me le hanno date...aspetto veramente la manna dal cielo perchè così come sono fatte non riesco...

ally
12-03-2010, 09:52
Grazie Andrea...veramente disponibilissimo anche davanti alla mia ignoranza in materia...il fatto è che non posso modificare la logica delle pagine jsp...ho dovuto aggiungere solo la comunicazione tra le pagine perchè così me le hanno date...aspetto veramente la manna dal cielo perchè così come sono fatte non riesco...

...quindi di fatto puoi solo aggiungere codice alla jsp senza modificarne la logica?...

...ciao Andrea...

sub_zero_
14-03-2010, 22:01
Di fatto potrei farlo...

sub_zero_
15-03-2010, 13:46
UP....

ally
15-03-2010, 13:52
....si scusa non avevo cisto le notifiche...hai provato ad implementare qualcosa?...

...ciao Andrea...

sub_zero_
15-03-2010, 22:08
Sinceramente in questo momento sono dietro alla tesi per l'università...e questa cosa l'ho messa in disparte per qualche giorno...quindi non ho guardato molto! Il fatto è che finchè ho provato ad implementare qualcosa non trovavo altre che errori nella risposta....oppure una pagina di excel bianca...

non so proprio dove mettere le mani...e anche guardando in rete nn è che si trovino molti esempi...

sub_zero_
20-03-2010, 10:39
ciao Andrea....finita la tesi mi rimetto su questo lavoro....posso ancora contare sul tuo aiuto?? magari dandomi uno spunto di codice su quello che ti ho postato un po' di tempo fa da modificare....soprattutto sulla jsp in modo da poter fare il lavoro che voglio....

grazie ancora....