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

假设您打算让用户下载此文件,则不应将该文件存储在 webserver 的本地磁盘文件系统中。相反,您应该将此文件发送到 HTTP 响应。

您首先需要将您的 JSP 转换为servlet,否则 excel 文件将被 JSP 自己的 HTML 和模板内容损坏,因为 JSP 本身是 HTTP 响应的一部分。

根据请求类型,将所有 Java(没有 HTML!没有out.println()语句!)代码放在 servlet 的doGet()or方法中。doPost()然后,您需要做的就是替换原始 Java 代码中的以下单行

hwb.write(fileOut);

通过以下几行

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

第一个告诉浏览器它是什么类型的文件,以便它可以在必要时将默认应用程序 (MS Excel) 与它相关联。第二个告诉浏览器应该弹出一个“另存为”对话框。第三个告诉 POI 它应该将 Excel 文件写入 HTTP 响应。

不要忘记删除那些new File()废话。它只会将文件保存在运行网络服务器的机器上。您需要意识到,在实时生产环境中,网络服务器在物理上与网络浏览器不同的机器上运行。

在不相关的说明中,您的 JDBC 代码正在泄漏资源。您忘记close()Connection,Statement和块ResultSetfinallytry这将导致数据库长期用完它们。相应地修复它。

于 2012-04-26T14:16:58.047 回答