jsp导出Excel(续)

    技术2022-05-11  54

    上篇的导出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 serverapache+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代码,不妨告诉一下,^_^

     

    最新回复(0)