用JXL导出EXCEL现要求做一个链接,链接到另一个EXCEl,这个EXCEL也是自动生成的。举个例子:EXCEL1,是一个学生表,里面有学生姓名,父母姓名然后点击父母姓名这一列,就转到另一个EXCEL,里面是父母内容这样说明白吧!现在求个思路,该怎么实现呢?是点击后生成表,还是怎么写?求前辈们指点指点,谢谢了!

解决方案 »

  1.   


    WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2"));
     link.setDescription("父母姓名");
     sheet.addHyperlink(link);
    现在我这样写,但action转到后生成的EXCEl是错误的,就是空白的!咋回事啊?
      

  2.   

    这个是我以前做的项目的代码你可以看看。不过里面有一个错误:本来应该对时间格式进行判断和处理的。你可以到网上查一下,如果有必要public String writeExcel() {
    HttpSession session = this.getRequest().getSession();
    try {
    // String filename = "";
    // if(!"".equals(this.tongjiVO) && this.tongjiVO != null){
    // if (!"".equals(this.tongjiVO.getStartTime())) {
    // filename = filename.concat(this.tongjiVO.getDepartment()+"_");
    // }
    // if (!"".equals(this.tongjiVO.getStartTime())) {
    // filename = filename.concat(this.tongjiVO.getStartTime()+"_");
    // }
    // filename = filename.concat("数据统计登记簿");
    // }else{
    // filename = filename.concat("整体导出数据统计登记簿");
    // }
    String filename = "数据统计登记簿";
    this.getResponse().setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes(),"iso8859-1")+".xls");
    OutputStream os = this.getResponse().getOutputStream();
    jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
    jxl.write.WritableSheet ws = wwb.createSheet("单表交易", 0);
    String[] title = {"编号","需求部门","需求提交人","任务编号","任务名称","执行人","状态","是否定期统计频数","需求开始时间","持续时间","提供数据说明"};
    jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES,10,WritableFont.BOLD,false);
    jxl.write.WritableCellFormat wwcf = new jxl.write.WritableCellFormat(wf);
    jxl.write.WritableFont wf2 = new jxl.write.WritableFont(WritableFont.TIMES,10,WritableFont.NO_BOLD,false);
    jxl.write.WritableCellFormat wwcf2 = new jxl.write.WritableCellFormat(wf2);
    wwcf2.setWrap(true);
    for (int i = 0; i < title.length; i++) {
    ws.addCell(new Label(i, 0, title[i],wwcf));
    }
    List<Datas2VO> list = null;
    if (null != session.getAttribute("list")) {
    list = (List<Datas2VO>) session.getAttribute("list");
    }else {
    setMessage("导出Excel模板失败!");
    return "failureMessage";
    }
    if (null != list) {
    Datas2VO dvo = new Datas2VO();
    for (int i = 1; i < list.size() + 1; i++) {
    dvo = (Datas2VO) list.get(i-1);
    //添加编号
    Label label = new Label(0, i, dvo.getId());
    ws.setColumnView(0, 8);
    ws.addCell(label);
    //添加需求部门
    label = new Label(1, i, dvo.getDepartment());
    ws.setColumnView(1, 15);
    ws.addCell(label);
    //添加需求提交人
    label = new Label(2, i, dvo.getSubmitter());
    ws.setColumnView(2, 15);
    ws.addCell(label);
    //添加任务编号
    label = new Label(3, i, dvo.getTaskId());
    ws.setColumnView(3, 15);
    ws.addCell(label);
    //添加编号名称
    label = new Label(4, i, dvo.getTaskName(),wwcf2);
    ws.setColumnView(4, 35);
    ws.addCell(label);
    //添加执行人
    label = new Label(5, i, dvo.getExecutor());
    ws.setColumnView(5, 10);
    ws.addCell(label);
    //添加状态
    label = new Label(6, i, dvo.getStatue());
    ws.setColumnView(6, 10);
    ws.addCell(label);
    //添加是否定期统计频数
    label = new Label(7, i, dvo.getWhether());
    ws.setColumnView(7, 15); 
    ws.addCell(label);
    //添加需求开始时间
    label = new Label(8, i, dvo.getStartTime());
    ws.setColumnView(8, 20);
    ws.addCell(label);
    //添加持续时间
    label = new Label(9, i, dvo.getDuration());
    ws.setColumnView(9, 15);
    ws.addCell(label);
    //添加提供数据说明
    label = new Label(10, i, dvo.getContext(),wwcf2);
    ws.setColumnView(10, 30);
    ws.addCell(label);
    }
    wwb.write();
    wwb.close();
    os.flush();
    os.close();
    this.getResponse().flushBuffer();
    }else {
    setMessage("导出Excel模板失败!");
    return "failureMessage";
    }
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    setMessage("导出Excel模板失败!");
    return "failureMessage";
    }
    // finally{
    // session.invalidate();
    // session.removeAttribute("list");
    // }
    setMessage("成功导出Excel模板");
    return "successMessage";
    }
      

  3.   

    WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2"));
                 link.setDescription("父母姓名");
                 sheet.addHyperlink(link); 你跳转的地址应该不是有浏览器的地址  我觉得应该是某一个文件的地址  而那个文件只有那一个学生父母的信息对吗?
      

  4.   

    可以说是只有一个学生父母的信息吧,暂时是这样做的,但如果要每个学生对于父母信息的链接的话又该怎么实现呢?
    那你的意思是我先生成EXCEL,然后链接到这个EXCEL?
      

  5.   

    楼主要做的不是链接到EXCEL1,而是要么生成、要么打开若EXCEL1需要生成,楼主要在已经生成的Excel1中再去监听点击动作就有点困难了所以要么就是生成EXCEL1时就顺便做好超链接,然后指向另一生成的Excel2(这个感觉有难度)要么就生成两个没有联系的Excel文档
      

  6.   


    对,我的意思就是可不可以在生成第一个EXCEL的时候就写链接,导出成功后
    点击链接,再生成第二个EXCEl
      

  7.   


    WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2"));
                 link.setDescription("父母姓名");
                 sheet.addHyperlink(link);你写法没错啊,你在WriteGlzb这个处理方法里面打个断点试试,你还要把参数父母姓名传过去吧?
    http://localhost:8080/financial/WriteGlzb.do2?parentname=XXXX
      

  8.   


    当你第一个Excel已经生成后,如何去监听该文档上的监听动作呢?我觉得有困难!
      

  9.   

    这里假设已知两个列表,分别保存学生和父母的内容。当你点击学生时,在action中取到学生的数据,用用POI或者JXL生成一个临时文件.xls,取到该文件的fileurl,用json返回。
    在页面的js中就能用ajax接收到这fileurl,当触发点击事件时,弹出下载框,如$("#exportexcel").click(function(){ 
    $.openDownloadDialog(data.fileUrl)});
    其中jQuery.openDownloadDialog = function(url,text){
    if (url == null || url=="") return;
    if (text==null || text=="") text = "已生成EXCEL文件,请点击下载!";

    var left = parseInt((document.documentElement.clientWidth - 300) / 2);
    var top = parseInt((document.documentElement.clientHeight - 150) / 2);
    $("<div style='z-index:999;background:#ddd;height:160px;width:300px;position:absolute;left:" + left + "px;top:" + top + "px;'/>").append("<div class='downBg' style='height:158px;'><div id='downloadDiv'><div class='dialogTit'><a herf='#' onclick='$(this).parent().parent().parent().parent().remove();'>[关闭]</a></div><div class='downloadDiv'><div style='white-space:nowrap'>"
    + text + "</div><div class='txtDown'>"
    + "<img src='themes/comm/images/downloadn01.gif' style='cursor:hand' onclick='window.open(\"" + url + "\");$(this).parent().parent().parent().parent().parent().remove();'/></div></div></div></div> ").appendTo(document.body);

    };
      

  10.   

    如果你在excel文件中点击:“http://localhost:8080/financial/WriteGlzb.do2"绝对是不可以的!
    我认为这个连接应该写成连接到服务器上的一个文件,如:http://localhost:8080/工程名/excel/excel2.xls,这样就应该可以!你把程序生成的文件放到一个目录下,我这里假设目录名为excel。
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    这样就可以获取到路径了。
      

  11.   

    提供一个思路吧:首先绘制一个html的表格页面 是学生信息(excel1),在这个页面上有导出excel的功能,在学生信息的父母姓名的地方加一个链接,用来显示父母的详细信息(excel2),同样也有导出excel的功能。如果你就是想用excel里面的链接的话,建议你在导出学生信息表的时候,在后台把学生信息和父母信息的excel表格全部导出,可以放在一个excel里 也可以打成包放在一个目录下。个人感觉放在一个excel的不同sheet页下 点链接过去显示比较简单,容易。ps:其实我主要是想问 天使不会飞是说明天使比较胖么。
      

  12.   

    刚才试了一下,我这边如果直接发送请求,结果是下载文件不知道你那边是什么情况,
    我觉得如果页面不是很复杂的话,你可以直接访问jsp页面,然后再jsp页面的onload之类的发送请求,再调用后台执行其他的操作,个人感觉应该是可以的。http://localhost:8080/financial/WriteGlzb.do2换成一个jsp
      

  13.   

    这个前辈说得对,以上问题都是我理解错误,后来想想也对,如果在EXCEL中做链接,没有了程序,就无法生成!天使不会飞,不是因为胖,抽象想想!