public class Excel extends DataBase { ResultSet rss = null; public void process(ServletConfig config,String path,String sId, String sNo, String sTrace, String beginDate,
String afterDate,HttpServletRequest request, HttpServletResponse response) {
File file = new File("D:\\soilAndPart.xls");
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
PreparedStatement export = conn
.prepareStatement("select * from diarySoilStore where sId like '%"
+ sId
+ "%' and sNo like '%"
+ sNo
+ "%' and sTrace like '%"
+ sTrace
+ "%' or convert(varchar(10),sDate,120) between '"
+ beginDate
+ "' and '"
+ afterDate
+ "'order by id");


ResultSet rss=export.executeQuery();
HashMap map = new HashMap();
map.put("SID", new Column(0, "sId", "油漆编號"));
map.put("SNO", new Column(1, "sNo", "油漆批號"));
map.put("SDATE", new Column(2, "sDate", "生產日期"));
map.put("SNUM", new Column(3, "sNum", "当前库存"));
map.put("STRACE", new Column(4, "sTrace", "追蹤單號"));
map.put("BNAME", new Column(5, "bName", "部件名稱"));
map.put("BDATE", new Column(6, "bDate", "生產日期"));
map.put("BNUM", new Column(7, "bNum", "生產數量"));
map.put("BID", new Column(8, "bId", "部件編號"));
map.put("SUSE", new Column(9, "sUse", "当前用量"));
map.put("SSTORE", new Column(10, "sStore", "终结库存"));
try {
export(new FileOutputStream(file), "產品使用涂料台賬", rss, map);


 try
  {
 
    SmartUpload su = new SmartUpload();
    su.initialize(config,request,response);
    su.setContentDisposition(null);
    su.downloadFile(path);
    }
  catch (Exception e)
  {
    e.printStackTrace();
  }


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();

// catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } } private static void export(OutputStream  os, String title, ResultSet rss,
HashMap map) {
// TODO Auto-generated method stub try {
jxl.write.WritableWorkbook wbook = Workbook.createWorkbook(os);
jxl.write.WritableSheet wsheet = wbook.createSheet("第一页", 0);
jxl.write.WritableFont wfont = null;
jxl.write.WritableCellFormat wcfFC = null;
jxl.write.Label wlabel = null; wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 16,
WritableFont.BOLD, false,
jxl.format.UnderlineStyle.NO_UNDERLINE,
jxl.format.Colour.BLACK);
wcfFC = new jxl.write.WritableCellFormat(wfont); jxl.write.Label wlabel1 = new jxl.write.Label(4, 0, title, wcfFC);
wsheet.addCell(wlabel1); int offset = 2;
if (title == null || title.trim().equals(""))
offset = 0;
else {
wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 14,
WritableFont.BOLD, false,
jxl.format.UnderlineStyle.NO_UNDERLINE,
jxl.format.Colour.BLACK);
wcfFC = new jxl.write.WritableCellFormat(wfont);
} ResultSetMetaData rsmd = rss.getMetaData();
int count = rsmd.getColumnCount();
for (int i = 1; i <= count; i++) {
String name = rsmd.getColumnName(i).toUpperCase();
if (map.containsKey(name)) {
Column col = (Column) map.get(name);
wlabel = new jxl.write.Label(col.getIndex(), offset, col
.getDisplayName());
wsheet.addCell(wlabel);
}
} wfont = new jxl.write.WritableFont(WritableFont.TIMES, 14,
WritableFont.BOLD, false,
jxl.format.UnderlineStyle.NO_UNDERLINE,
jxl.format.Colour.BLACK);
wcfFC = new jxl.write.WritableCellFormat(wfont); int rowIndex = 1 + offset;
Collection array = map.values();
while (rss.next()) {
Iterator it = array.iterator();
while (it.hasNext()) {
Column col = (Column) it.next();
String value = rss.getString(col.getMetaName());
wlabel = new jxl.write.Label(col.getIndex(), rowIndex,
value);
wsheet.addCell(wlabel);
}
rowIndex++;
} wbook.write(); // 写入文件
wbook.close();
os.flush();
os.close(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }}上面的代码可以实现客户端的下载,但在MyEclipse6.0的Console上会显示下面的信息:java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:604)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:326)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:342)
at org.apache.jsp.chinaca.soilAndPartSearch_jsp._jspService(soilAndPartSearch_jsp.java:353)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)希望各位大侠能帮帮忙,谢谢

解决方案 »

  1.   

    soilAndPartSearch.jsp出错...
    去tomcat的work下看soilAndPartSearch_jsp.java的353行 ..
      

  2.   

    在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),
    没有妥善处理好的原因。
    具体的原因就是
    在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
    有一段这样的代码
    finally {
          if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
        }
    这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
    response.getOutputStream()相冲突的!所以会出现以上这个异常。然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--
    将jsp内的所有空格和回车符号所有都删除掉),在使用完输出流以后调用以下两行代码即可:
    out.clear();
    out = pageContext.pushBody();
      

  3.   


    soilAndPartSearch_jsp.java 文件总共只有316行,大哥!
      

  4.   

    out.clear(); 
    out = pageContext.pushBody();加在哪?大侠!
    OutputStream 可没有以上方法啊
      

  5.   

    去tomcat的work下看soilAndPartSearch_jsp.java的353行 .. 确定jsp编译后只有316行啊?那不会报到353行去了 解决方法就我楼上说的那方法!
      

  6.   


    问题是tomcat的work下根本就找不到下面的文件!
    soilAndPartSearch_jsp.java
      

  7.   

    用的绿色版tomcat?
    我用myeclipse jsp.java是在这里面找的
    E:\workspace\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\work\Catalina\localhost\St2\org\apache\jsp
    St2为工程名 参考下!
      

  8.   

    JSP中下载调用后,只需加上out.clear(); 
                       out = pageContext.pushBody();即可!