您的位置:首页 > Web前端 > JavaScript

jsp导出Excel(续)

2007-02-13 13:50 211 查看
上篇的导出Excel中我用到了JavaBean,但是有时候我不想用bean,想把bean移植到jsp当中来,因为原理都是一样的,jsp最终也会被编译成servlet的。于是我就对原来的代码进行移植,刚开始的代码如下所示:
exporting.jsp:刚开始的代码
<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="com.cicro.cws.database.DBManager" %>
<%@ page import="com.cicro.cws.parameter.*" %>
<%@ page import="com.cicro.common.util.*" %>
<%@ page import="java.util.*" %>
<%@ page import="jxl.*"%>
<%@ page import="jxl.write.*"%>
<%@ page import="java.io.*"%>
<%
String year=request.getParameter("year");
String sql="select name,gender,birth,id,unit,address,phone,result,year from check_base_info where year='"+year+"'";
String[][] resultList = DBManager.getStringArray("mysql", sql);
if(resultList!=null && !"".equals(resultList)){
String title[]={"姓名","性别","出生日期","身份证号","工作单位","通信地址","联系电话","年审结果","年审年份"};
//out.println(sql);
response.reset();
response.setContentType("application/vnd.ms-excel");
try{
WritableWorkbook workbook=Workbook.createWorkbook(response.getOutputStream());//创建工作薄
WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称
Label label=null;//用于写入文本内容到工作表中去
String value="";

//开始写入第一行,即标题栏
for(int i=0;i<title.length;i++){
label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容
worksheet.addCell(label);//写入单元格
}

//开始写入内容
for(int i=0;i<resultList.length;i++){
//获取一条记录
for(int j=0;j<resultList[i].length;j++){
value=resultList[i][j];
label=new Label(j,i+1,value);
worksheet.addCell(label);
}
}

workbook.write();
workbook.close();
}
catch(Exception e){
e.printStackTrace();
}
}
else{out.println("没有记录");}
%>
注:DBManager.getStringArray("mysql", sql)方法是我已经封装好的了一个方法,其作用就是以二维数组的形式返回查询结果。
因为是给第三方做开发,所用的web server是apache+tomcat,是那边公司已经做好了的一套软件,公司名字叫做时光软件公司,不知道大家听说没有。这个东西很郁闷的地方就是只要jsp页面有错误,那么调用这个页面时就会死在那里,并且没有出错信息,相当不好调试。很不幸的是,我调用exporting.jsp的时候页面死了,这说明该页面有错误。于是我只能“悲壮”地用最原始的排除法来寻找错误所在地,最终,让我发现问题出在
response.getOutputStream()这句上面,只要有这句,页面就会死掉,我就纳闷了,这句话之前不是用的好好的么,怎么这次就不行了呢?
于是我以response.getOutputStream()为关键字baidu,在浏览了众多的帖子之后总算找到了问题的所在:response.getOutputStream()只能被调用一次!不过我确实只调用了一次,但为什么还是有错呢?这都是源于这个非常bt的原因:
<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="com.cicro.cws.database.DBManager" %>
<%@ page import="com.cicro.cws.parameter.*" %>
<%@ page import="com.cicro.common.util.*" %>
<%@ page import="java.util.*" %>
<%@ page import="jxl.*"%>
<%@ page import="jxl.write.*"%>
<%@ page import="java.io.*"%>
所有的<%.................%>都要连着写,不能回车换行,即%><%要连在一起,最后正确的jsp文件的开始应该是这样:
<%@ page contentType="text/html;charset=utf-8" %><%@ page import="com.cicro.cws.database.DBManager" %><%@ page import="com.cicro.cws.parameter.*" %><%@ page import="com.cicro.common.util.*" %><%@ page import="java.util.*" %><%@ page import="jxl.*"%><%@ page import="jxl.write.*"%><%@ page import="java.io.*"%><%
我的代码
%>
在做了这样的修改之后,程序就运行正常了,:)。
为什么会这样呢?
大家可以查看一下tomcat下面的work目录,看一下jsp被编译之后产生的servlet代码,我们会发现,只要出现了换行,就会出现如下的代码:
out = pageContext.getOut();
_jspx_out = out;

out.write("/r/n");//出现一次换行,就会出现该语句一次
而这个out.write(“”)会和response.getOutputStream()发生冲突,因此页面就会错误而死在那里了,这个是我遇到的最bt的错误了,:(。
注:在这种情况下,页面中最好也不要出现任何的html标签了,否则会得不到正确的输出了,不过最好是不用用response.getOutputStream()
另外,哪位大哥知道在apache+tomcat下如何快速的调试jsp代码,不妨告诉一下,^_^。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: