WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2")); link.setDescription("父母姓名"); sheet.addHyperlink(link); 现在我这样写,但action转到后生成的EXCEl是错误的,就是空白的!咋回事啊?
这个是我以前做的项目的代码你可以看看。不过里面有一个错误:本来应该对时间格式进行判断和处理的。你可以到网上查一下,如果有必要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"; }
WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2")); link.setDescription("父母姓名"); sheet.addHyperlink(link); 你跳转的地址应该不是有浏览器的地址 我觉得应该是某一个文件的地址 而那个文件只有那一个学生父母的信息对吗?
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
当你第一个Excel已经生成后,如何去监听该文档上的监听动作呢?我觉得有困难!
这里假设已知两个列表,分别保存学生和父母的内容。当你点击学生时,在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);
WritableHyperlink link = new WritableHyperlink(24, 1, new URL("http://localhost:8080/financial/WriteGlzb.do2"));
link.setDescription("父母姓名");
sheet.addHyperlink(link);
现在我这样写,但action转到后生成的EXCEl是错误的,就是空白的!咋回事啊?
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";
}
link.setDescription("父母姓名");
sheet.addHyperlink(link); 你跳转的地址应该不是有浏览器的地址 我觉得应该是某一个文件的地址 而那个文件只有那一个学生父母的信息对吗?
那你的意思是我先生成EXCEL,然后链接到这个EXCEL?
对,我的意思就是可不可以在生成第一个EXCEL的时候就写链接,导出成功后
点击链接,再生成第二个EXCEl
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
当你第一个Excel已经生成后,如何去监听该文档上的监听动作呢?我觉得有困难!
在页面的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);
};
我认为这个连接应该写成连接到服务器上的一个文件,如:http://localhost:8080/工程名/excel/excel2.xls,这样就应该可以!你把程序生成的文件放到一个目录下,我这里假设目录名为excel。
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
这样就可以获取到路径了。
我觉得如果页面不是很复杂的话,你可以直接访问jsp页面,然后再jsp页面的onload之类的发送请求,再调用后台执行其他的操作,个人感觉应该是可以的。http://localhost:8080/financial/WriteGlzb.do2换成一个jsp