jsp页面实现excl下载,java使用jxl.jar实现excl下载

工作中用到了,然后用点时间就做下笔记,下面是用到的:让我尽快做完,做的比较赶进度


例子:

1.在jsp页面加一个到处按钮

jsp页面实现excl下载,java使用jxl.jar实现excl下载_第1张图片

2.写一个js的方法:来用触发导出事件

 function importExcel(){
 	var row = $('#plandatagrid').datagrid('getSelected');
 	if (row){
 		this.location="../tempFile/importExcel.jsp?serialNo="+row.taskno;
 	}else{
 		alert("请选一行");
 	}
 }

提示:serialNo导出是根据这个来导出的,也就是它要根据这个属性去数据库获取一条记录。

3.跳转到处理的jsp:代码如下一堆:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%		
		Date d=new Date();
		String fileName=d.toLocaleString().replace("-","").replace(":","").replace(" ","")+d.getTime();
		//fileName用时间来拼接一个下载文件的名字,这样长啊,看起来是不是像那么回事
		ByteArrayOutputStream bo =null;//创建一个数组流,这里可能有人会先写到服务器端然后再写到客户端,本人觉得直接放到服务器端内存写入客户端不是更省事么?
		try{
		//就这个方法罪重要
		bo=new WorkPlanManageOpper().importExecl(request.getParameter("serialNo"));	
		//用来告诉客户端,我是一个要下载的东西,为什么这样写?龟腚!
		response.addHeader("Content-Disposition","attachment;filename="+fileName+".xls");
		//获取输出流
		OutputStream os = response.getOutputStream();
		//转换byte数组
		byte[]b2=bo.toByteArray();
		InputStream fis = new ByteArrayInputStream(b2);
		//学过流的都懂下面的不解释
		byte[] b = new byte[1024*1024];
		int temp  = -1;
		while((temp=fis.read(b))!=-1){
			os.write(b, 0, temp);
		}
		os.flush();
		os.close();
		bo.close();
		fis.close();

		
		}catch(Exception e){
		
		}finally{
		//这里需要说下,如果你不加这2句,后台报异常。为什么?同时打开2个流,jsp页面的out和response.getOutputStream();所以加这个可以让其安静
		out.clear();
		out = pageContext.pushBody();
		}
		
%>

4.下面谈谈那个“重要的方法”:

提示:这里用到的是jxl.jar,反正网上能找到,就是一个对中文处理excl支持比较好的,说是韩国人写的。

	public ByteArrayOutputStream  importExecl(String serialNo){
			ByteArrayOutputStream bo=new ByteArrayOutputStream();
			WritableWorkbook book=null;
			Workbook wb=null;
			//ibatis查询数据库,返回一条记录,可能为null
			WorkPlanManageSchema w=this.queryWorkPlanManageByserialNo(serialNo);
			if(w.getDateStart()!=null&&w.getEtimeQuantum()!=null&&w.getDateEnd().getTime()-w.getDateStart().getTime()>=0){
				//星期几,给定1990-12-08这样的日期格式,告诉你,星期几
				int i=DateUtil.decideDayWeekly(DateUtil.formatDate2String(w.getDateStart()));
				//用来计算的临时变量
				int m=0;
				//相差天数,给定2个日期,告诉你,这2个日期相差的天数
				long quot = w.getDateEnd().getTime()-w.getDateStart().getTime();
	   			quot = quot / 1000 / 60 / 60 / 24;
	   			//用来控制循环的次数和输出的计算,因为是周计划,所以按一个星期5天处理
				if(6-i<(int)quot-i){
				m=6;
				}else{
				m=(int)quot+i+1;
				}
				//下面的表格逻辑自己去鼓捣吧,本人一下午就想这个问题了,反正就是自己想办法把数填进去,有好的方法请分享
				//  Excel获得文件
				try {
					//d:/1.xls这是一个模板文件,就安这个模板的格式插入数据
					wb = Workbook.getWorkbook(new File("d:/1.xls"));
					book = Workbook.createWorkbook(bo, wb);
					//  打开一个文件的副本,并且指定数据写回到原文件
					WritableSheet sheet1 = book.getSheet(0);
					//备注
					
                     WritableSheet sheet1 = book.getSheet(0);
					//备注
					sheet1.addCell( new  Label( 7 , 2 ,w.getRemarks()));					
					int n=i;
					for(;i<m;i++){
						//时间
						//DateTime labelDT = new DateTime(3, 2,new java.util.Date());
						//sheet1.addCell(labelDT); 
						if(n==i&&w.getStimeQuantum().equals("am")){
							this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
							if(quot>0||w.getEtimeQuantum().equals("pm")){
								this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
							}
							continue;
						}
						if(n==i&&w.getStimeQuantum().equals("pm")){
							this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
							continue;
						}
						if(n!=i&&i!=m-1){
							this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
							
							this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
							continue;
						}
						if(i==m-1&&w.getEtimeQuantum().equals("am")){
							this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
							if(quot-n>6-n){
								this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
							}
							continue;
						}
						if(i==m-1&&w.getEtimeQuantum().equals("pm")){
							this.inputToExcel(sheet1,w,2*i,"09:00-12:00");
							
							this.inputToExcel(sheet1,w,2*i+1,"13:30-18:00");
							continue;
						}
					}
						book.write();
						book.close();
					} catch (Exception e) {
						this.buildError("importExecl","importExecl失败");
						e.printStackTrace();
					} 	
				
				return bo;
			}else{
				try {
					//
					File file=new File("d:/2.xls");
					InputStream in=new FileInputStream(file);
					byte[] buff=new byte[1024];
					int len=0;
					while(-1!=(len=in.read(buff))){
						bo.write(buff,0,len);
					}
					bo.flush();
					in.close();
				
				} catch (Exception e) {
					e.printStackTrace();
				}
				return bo;
			}
			
		
	}
	private void inputToExcel(WritableSheet sheet1,WorkPlanManageSchema w,int n,String str) throws Exception{
		System.out.println("execl正在插入第"+n+"行,所属时间是:"+str);
		sheet1.addCell( new  Label( 3 , n ,str ));
		sheet1.addCell( new  Label( 4 , n,w.getWorkArrangement() ));
		sheet1.addCell( new  Label( 5 , n ,w.getParticipantName()));
		sheet1.addCell( new  Label( 6 , n,w.getAddress()));
		
	}
//查询数据库的方法,上面用到了
	public WorkPlanManageSchema queryWorkPlanManageByserialNo(String serialNo){
		List<WorkPlanManageSchema> list = null;
		this.init();
		try {
			list= (List<WorkPlanManageSchema>) sqlMap.queryForList("queryWorkPlanManageByserialNo",serialNo);
		} catch (SQLException e) {
			this.buildError("query","查询SQl执行失败");
			e.printStackTrace();
		}
		return list.get(0);
		
	}

//给一个日期,告诉你星期几的方法:上面也用到了
	 public static int decideDayWeekly(String paramStrDate) {
	  int flag = -1;
	  if (paramStrDate == null || paramStrDate.trim().length() == 0) {
	   return flag;
	  }
	  boolean isCurrent = false;
	  long minusDay = 0;
	  // 定义基准日期:2010-07-04是星期日
	  Date baseDate = 
	    constructDateByString("2010-07-04 00:00:00");

	  Date paramDate =constructDateByString(paramStrDate
	    + " 00:00:00");

	  if (paramDate == null) {
	   System.err.println("The Date Format Is Not Available.");
	   return flag;
	  }
	  // 基准日期之前的日期
	  if (!isCurrent && paramDate.before(baseDate)) {
	   minusDay = (baseDate.getTime() - paramDate.getTime())
	     / (24 * 60 * 60 * 1000);
	   // 注意:往前推算的算法
	   flag = Integer.parseInt("" + ((7 - minusDay % 7)) % 7);
	   // System.out.println("=minusDay of 1 is:=" + minusDay + "=end=");
	   isCurrent = true;
	  }
	  // 基准日期之后的日期
	  if (!isCurrent && paramDate.after(baseDate)) {
	   minusDay = (paramDate.getTime() - baseDate.getTime())
	     / (24 * 60 * 60 * 1000);
	   // 注意:往后推算的算法
	   flag = Integer.parseInt("" + minusDay % 7);
	   // System.out.println("=minusDay of 2 is:=" + minusDay + "=end=");
	   isCurrent = true;
	   
	  }
	  return flag;
	 }
	  /**
	   * 将日期格式的字符串转化为日期类型,要求格式为:yyyy-mm-dd hh24:mi:ss,如:2010-07-05
	   * 
	   * @param paramStr
	   *            String 源字符串,要求格式为:yyyy-mm-dd hh24:mi:ss,如:2010-07-05
	   *            00:00:05或者:2010-7-5 00:00:05
	   * @return Date
	   * @since modify on 2010-07-05
	   */
	  public static Date constructDateByString(String paramStr) {

	   if (paramStr == null || paramStr.trim().length() == 0) {
	    return null;
	   }

	   Date retDate = null;
	   try {
	    retDate = DateFormat.getDateTimeInstance().parse(paramStr);
	   } catch (ParseException ex) {
	    ex.printStackTrace();
	   }

	   return retDate;
	  }


//ibatis配置如下:
<select id="queryWorkPlanManageByserialNo" resultClass="WorkPlanManageSchema" parameterClass="java.lang.String">
  select * from Work  where serialNo=#serialNo#
</select>

下面看看提前准备好的模板:d:/1.xls

差不多就长下面这样,模板2.xls就不用展示了吧,如果他非法操作,你会让他下载个什么?看你心情把。

jsp页面实现excl下载,java使用jxl.jar实现excl下载_第2张图片

插入表的逻辑是什么?

如果你是在(周四2014-1-9上午到2014-1-9上午)有工作,那么你应该在周四的上午插入数据,那如果我2014-1-9下午到2014-1-10上午,那你插入的数据应该是在周四下午和周五上午显示,也就是瞄那打那。

看看数据库表的我测试的一条数据:

也就是说6号下午开始11号上午结束,记得是周计划,多余的删掉,如果根据你的业务,可以修改,这个很简单。

输出结果:下面的一样

jsp页面实现excl下载,java使用jxl.jar实现excl下载_第3张图片

我修改数据库数据如下:

输出结果:

记得下载jxljar包,还有,下载的excl有点瑕疵,自己看吧。我觉得如果用mvc框架来处理的话,会更方便。




你可能感兴趣的:(jsp页面实现excl下载,java操作execl)