工作中用到了,然后用点时间就做下笔记,下面是用到的:让我尽快做完,做的比较赶进度
例子:
1.在jsp页面加一个到处按钮
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就不用展示了吧,如果他非法操作,你会让他下载个什么?看你心情把。
插入表的逻辑是什么?
如果你是在(周四2014-1-9上午到2014-1-9上午)有工作,那么你应该在周四的上午插入数据,那如果我2014-1-9下午到2014-1-10上午,那你插入的数据应该是在周四下午和周五上午显示,也就是瞄那打那。
看看数据库表的我测试的一条数据:
也就是说6号下午开始11号上午结束,记得是周计划,多余的删掉,如果根据你的业务,可以修改,这个很简单。
输出结果:下面的一样
我修改数据库数据如下:
输出结果:
记得下载jxl,jar包,还有,下载的excl有点瑕疵,自己看吧。我觉得如果用mvc框架来处理的话,会更方便。