2012-04-26 16 views
0

jspファイルの出力をExcelに保存します。 は、私は、次のコードを試してみました:jspファイルをブラウズオプションでExcelに保存

<html> 
<head> 
<meta http-equiv="pragma" content="no-cache; charset=ISO-8859-1"> 
<title>Save File</title> 
</head> 
<body> 
<%@ page import="org.apache.poi.hssf.usermodel.HSSFSheet"%> 
<%@ page import="org.apache.poi.hssf.usermodel.HSSFWorkbook"%> 
<%@ page import="org.apache.poi.hssf.usermodel.HSSFCell"%> 
<%@ page import="org.apache.poi.hssf.usermodel.HSSFRow"%> 
<%@ page import="org.apache.poi.hssf.usermodel.HSSFCellStyle"%> 
<%@ page import="org.apache.poi.hssf.util.HSSFColor"%> 
<%@ page import="java.io.* " %> 
<%@page import="java.sql.* "%> 
<% 
// String EX_DT=null; 
String filenm=request.getParameter("filenm"); 

File file=new File("c:\\"+filenm+".xls"); 

boolean exists = file.exists(); 

if (exists) 
{ 
    out.println("File or Directory exist.PLZ enter another filename"); 
} 
else 
{ 
String s1=null; 

    try 
{ 
    // EX_DT=(String)session.getAttribute("dte"); 
    // out.println("Ex_Dt in try"+EX_DT); 
    HSSFWorkbook hwb=new HSSFWorkbook(); 
    HSSFSheet sheet = hwb.createSheet("new sheet"); 
    HSSFSheet sheet1 = hwb.createSheet("new sheet1"); 
    HSSFRow rowhead= sheet.createRow((short)0); 
    //rowhead.createCell((short) 0).setCellValue("MKT"); 
    rowhead.createCell((short) 0).setCellValue("SECURITY"); 
    rowhead.createCell((short) 1).setCellValue("PREV_CL_PR"); 
    rowhead.createCell((short) 2).setCellValue("CLOSE_PRIC"); 
    rowhead.createCell((short) 3).setCellValue("NET_TRDQTY"); 
    rowhead.createCell((short) 4).setCellValue("NET_TRDVAL"); 



    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
    String url = "jdbc:sqlserver://"; 
    Connection con = DriverManager.getConnection(url,"sa","SQL1423#3"); 
    Statement st=con.createStatement(); 
    ResultSet rs=st.executeQuery("Select * from TtOne "); 
    int i=1; 
    while(rs.next()) 
    { 

    HSSFRow row= sheet.createRow((short)i); 
    //s1=rs.getString("EX_DT"); 
    // out.println("s1"+s1); 
    // if(s1.equals((String)session.getAttribute("dte"))) 
    //{ 

//  out.println("EX_DT in if of while"); 

    row.createCell((short) 0).setCellValue(rs.getString("SECURITY")); 
    row.createCell((short) 1).setCellValue(rs.getString("PREV_CL_PR")); 
    row.createCell((short) 2).setCellValue(rs.getString("CLOSE_PRIC")); 
    row.createCell((short) 3).setCellValue(rs.getString("NET_TRDQTY")); 
    row.createCell((short) 4).setCellValue(rs.getString("NET_TRDVAL")); 

    i++; 
    // } 
    } 



    FileOutputStream fileOut = new FileOutputStream(file);//file 

    hwb.write(fileOut); 

    fileOut.close(); 

    %><h1><b><i><% out.println("Your excel file has been generated!");%> 

    </i></b></h1> 



    <% 


} 

    catch (Exception ex) 
    { 
    System.out.println(ex); 
    } 

} 

    %> 
</body> 
</html> 

しかし、その代わりにハードコードされたパスのは、私はパスを指定するようにユーザーをしたいです。ファイルはその場所に保存する必要があります。だから、ブラウズオプションが利用できるダイアログボックスが必要です。パスを選択して保存をクリックすると、出力はExcelファイルに保存されます。

+0

Webサーバーが実行されているマシンに保存するか、Webブラウザーを実行するマシンにファイルを保存する必要がありますか? – BalusC

答えて

0

ユーザーがこのファイルをダウンロードできるようにする場合は、ファイルをWebサーバーのローカルディスクファイルシステムに保存しないでください。代わりに、このファイルをHTTP応答に送信する必要があります。

まず、JSPをservletにする必要があります。そうしないと、JSP自身がHTTP応答の一部であるため、JSPの独自のHTMLとテンプレートの内容でExcelファイルが破損します。

要求タイプに応じて、サーブレットのdoGet()またはdoPost()メソッドにJava(HTMLなし!out.println()ステートメント!)コードをすべて入れてください。次に、あなたがする必要があるすべては次の行

最初のものは、それがあるファイルの種類をブラウザに伝えます
response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition", "attachment;filename=\"" + filenm + "\""); 
hwb.write(response.getOutputStream()); 

して元のJavaコード

hwb.write(fileOut); 

に以下の1行を交換することで、必要に応じてデフォルトアプリケーション(MS Excel)を関連付けることができます。もう1つは、ブラウザに名前を付けて保存ダイアログがポップするはずであることを示します。 3番目はPOIに、HTTP応答にExcelファイルを書き込むべきことを伝えます。

を忘れないでください。その​​ナンセンスを削除してください。 Webサーバーが稼動するマシンにファイルを保存するだけです。実稼働環境では、WebサーバーはWebブラウザとは物理的に異なるマシンで動作することを認識する必要があります。

関連しないメモで、JDBCコードがリソースをリークしています。あなたはtryブロックのにclose()ConnectionStatementおよびResultSetを忘れました。これにより、長期的にDBが使い果たされるようになります。それに合わせて修正してください。

+0

おかげでたくさんありました。このコードを試してみましょう。 – user1358548

+0

元のコードに多くの変更を加えたので、ここではConnection、Statement、Resultsetを閉じるのを忘れていました。私の間違いを指摘してくれてありがとう。 – user1358548

+0

ありがとうございました。このコードは機能しています。しかし、今問題はExcelシートの最初の値だけを表示していることです。私はwhile(rs.next())の中にコードを入れましたが、それでもExcelシートの最初の値しか表示していません。 – user1358548

関連する問題