在服务器端用jxl导出excel文件在内存中后再怎么把这二进制数据流返回客户端下载呢?

时间:2021-03-12 17:52:13

OutputStream os = new FileOutputStream(sos);//sos是在struts2Action中response.getOutputStream()传过来的流
WritableWorkbook wwb = Workbook.createWorkbook(new File(tagF));
WritableSheet ws = wwb.createSheet("学生信息表", 0);
//把数据写入excel表,即写入sos流。

6 个解决方案

#1


不太清楚 我用的是BASE64Decoder流  

#2


有一个response.write

#3


public ActionForward exportToExcel(ActionMapping mapping, 
ActionForm form, HttpServletRequest request, 
HttpServletResponse response) {
SendMailSuccessReportForm smsrForm = (SendMailSuccessReportForm)form;
ActionMessages errors = new ActionMessages();
List<CustomerInfo> ciList = new ArrayList<CustomerInfo>();
String itemDateStr = smsrForm.getItemDate();
Date itemDate = null;
Date startDate = null;
String startTime = smsrForm.getStartTime();

try {

if(startTime != null) {
startDate = Tool.str2Date(startTime.trim(), Tool.DATE_PATTERN);
}

Corp corp = corpService.getCorp(smsrForm.getCorpId());
itemDate = Tool.str2Date(itemDateStr, Tool.DATE_PATTERN);
ciList = cService.getCustomerInfoList(startDate, itemDate, corp, CustomerInfo.WM_SENT);

//导出excel
File file = new File("成功发送量报表.xls");
WritableWorkbook wwb = Workbook.createWorkbook(file);
WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
jxl.write.Label labelDate = new jxl.write.Label(0, 0, "日期");
jxl.write.Label labelEmail = new jxl.write.Label(1, 0, "邮件地址");

ws.addCell(labelDate);
ws.addCell(labelEmail);

for(int i = 0; i < ciList.size(); i++) {
CustomerInfo ci = ciList.get(i);
Label labelCustomerDate = new Label(0, i+1, Tool.formatDate(ci.getInputDate()));
Label labelCustomerEmail = new Label(1, i+1, ci.getCustomer().getEmail());
ws.addCell(labelCustomerDate);
ws.addCell(labelCustomerEmail);
}

wwb.write();
wwb.close();
FileInputStream f = new FileInputStream(file);
byte[] fb = new byte[f.available()];
f.read(fb);
response.setHeader("Content-disposition", "attachment; filename="+new String("成功发送量报表.xls".getBytes("gb2312"),"iso8859-1"));
ByteArrayInputStream bais = new ByteArrayInputStream(fb);
int b;
while ((b = bais.read()) != -1 ) {
    response.getOutputStream().write(b);
}
response.getOutputStream().flush();
} catch(ParseException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(DAOException e) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.db"));
saveErrors(request, errors);
e.printStackTrace();
return mapping.findForward("glb_error");
} catch(CorpNotFoundException e) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.corp.notFound"));
saveErrors(request, errors);
e.printStackTrace();
return mapping.findForward("glb_error");
} catch(IOException e) {
e.printStackTrace();
}

#4


帮顶

#5


非常感谢:sean1203。
你是先导出到服务器硬盘,然后再在硬盘上读出字节返回给客户端吧?
何不都在内存中进行呢?
并且多用户同时导的话肯定有问题的!

#6


设response的类型,然后把流写到out里面就可以了啊。

#1


不太清楚 我用的是BASE64Decoder流  

#2


有一个response.write

#3


public ActionForward exportToExcel(ActionMapping mapping, 
ActionForm form, HttpServletRequest request, 
HttpServletResponse response) {
SendMailSuccessReportForm smsrForm = (SendMailSuccessReportForm)form;
ActionMessages errors = new ActionMessages();
List<CustomerInfo> ciList = new ArrayList<CustomerInfo>();
String itemDateStr = smsrForm.getItemDate();
Date itemDate = null;
Date startDate = null;
String startTime = smsrForm.getStartTime();

try {

if(startTime != null) {
startDate = Tool.str2Date(startTime.trim(), Tool.DATE_PATTERN);
}

Corp corp = corpService.getCorp(smsrForm.getCorpId());
itemDate = Tool.str2Date(itemDateStr, Tool.DATE_PATTERN);
ciList = cService.getCustomerInfoList(startDate, itemDate, corp, CustomerInfo.WM_SENT);

//导出excel
File file = new File("成功发送量报表.xls");
WritableWorkbook wwb = Workbook.createWorkbook(file);
WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
jxl.write.Label labelDate = new jxl.write.Label(0, 0, "日期");
jxl.write.Label labelEmail = new jxl.write.Label(1, 0, "邮件地址");

ws.addCell(labelDate);
ws.addCell(labelEmail);

for(int i = 0; i < ciList.size(); i++) {
CustomerInfo ci = ciList.get(i);
Label labelCustomerDate = new Label(0, i+1, Tool.formatDate(ci.getInputDate()));
Label labelCustomerEmail = new Label(1, i+1, ci.getCustomer().getEmail());
ws.addCell(labelCustomerDate);
ws.addCell(labelCustomerEmail);
}

wwb.write();
wwb.close();
FileInputStream f = new FileInputStream(file);
byte[] fb = new byte[f.available()];
f.read(fb);
response.setHeader("Content-disposition", "attachment; filename="+new String("成功发送量报表.xls".getBytes("gb2312"),"iso8859-1"));
ByteArrayInputStream bais = new ByteArrayInputStream(fb);
int b;
while ((b = bais.read()) != -1 ) {
    response.getOutputStream().write(b);
}
response.getOutputStream().flush();
} catch(ParseException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(DAOException e) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.db"));
saveErrors(request, errors);
e.printStackTrace();
return mapping.findForward("glb_error");
} catch(CorpNotFoundException e) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.corp.notFound"));
saveErrors(request, errors);
e.printStackTrace();
return mapping.findForward("glb_error");
} catch(IOException e) {
e.printStackTrace();
}

#4


帮顶

#5


非常感谢:sean1203。
你是先导出到服务器硬盘,然后再在硬盘上读出字节返回给客户端吧?
何不都在内存中进行呢?
并且多用户同时导的话肯定有问题的!

#6


设response的类型,然后把流写到out里面就可以了啊。