0

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 ファイルに保存されます。

4

1 に答える 1

0

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

最初に JSP をサーブレットに変換する必要があります。そうしないと、JSP 自体が HTTP 応答の一部であるため、Excel ファイルが JSP 独自の HTML およびテンプレート コンテンツで破損します。

リクエストのタイプに応じて、すべての Javaout.println()コード (HTML なし! ステートメントなし!) をサーブレットのdoGet()orメソッドに入れます。doPost()次に、元の Java コードの次の 1 行を置き換えるだけです。

hwb.write(fileOut);

次の行で

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=\"" + filenm + "\"");
hwb.write(response.getOutputStream());

最初のものは、必要に応じてデフォルトのアプリケーション (MS Excel) を関連付けることができるように、ブラウザにファイルの種類を伝えます。2 つ目は、ブラウザーが [名前を付けて保存] ダイアログを表示する必要があることを示しています。3 番目のものは、HTTP 応答に Excel ファイルを書き込む必要があることを POI に伝えます。

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

関係のない話ですが、JDBC コードがリソースをリークしています。ブロックのとを忘れましたclose()。これにより、DB が長期的にそれらを使い果たすことになります。それも適宜修正。ConnectionStatementResultSetfinallytry

于 2012-04-26T14:16:58.047 に答える