使用AbstractJExcelView在Spring框架中生成excel文件并通过MailSender发送

目前,我的项目使用一个控制器类,并利用AbstractJExcelView类生成一个Excel报告,提示用户打开或保存Excel文件。 Basicall它使用http协议来调用控制器。 现在我需要做的是在(Spring)批处理作业中生成相同的Excel文件,并通过电子邮件直接作为附件发送。 我们使用org.springframework.mail.MailSender发送邮件。 我不应该使用任何其他的外部API,我不知道从哪里开始。

这是我们正在做的类似的代码:

调节器

public class RevenueReportController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { String output = ServletRequestUtils.getStringParameter(request, "output"); //dummy data Map<String,String> revenueData = new HashMap<String,String>(); revenueData.put("Jan-2010", "$100,000,000"); revenueData.put("Feb-2010", "$110,000,000"); revenueData.put("Mar-2010", "$130,000,000"); revenueData.put("Apr-2010", "$140,000,000"); revenueData.put("May-2010", "$200,000,000"); if(output ==null || "".equals(output)){ //return normal view return new ModelAndView("RevenueSummary","revenueData",revenueData); }else if("EXCEL".equals(output.toUpperCase())){ //return excel view return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData); }else{ //return normal view return new ModelAndView("RevenueSummary","revenueData",revenueData); } } 

视图

 public class ExcelRevenueReportView extends AbstractJExcelView{ @Override protected void buildExcelDocument(Map model, WritableWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String,String> revenueData = (Map<String,String>) model.get("revenueData"); WritableSheet sheet = workbook.createSheet("Revenue Report", 0); sheet.addCell(new Label(0, 0, "Month")); sheet.addCell(new Label(1, 0, "Revenue")); int rowNum = 1; for (Map.Entry<String, String> entry : revenueData.entrySet()) { //create the row data sheet.addCell(new Label(0, rowNum, entry.getKey())); sheet.addCell(new Label(1, rowNum, entry.getValue())); rowNum++; } } 

}

有没有办法做到这一点? 我需要生成与通过和失败的工作数据的Excel表。 我可以处理填充和创build文件,但我不知道如何生成缓冲区中的Excel或可能在某些临时目录,可以再次发送邮件时附加。 用户不需要回应任何提示。 我们也不会使用任何http请求。

提前致谢!

Spring Batch中有一个MimeMessageItemWriter,您应该可以使用它来发送电子邮件。 您需要创build一个创buildMimeMessage的ItemProcessor。 您可以创buildExcel文件并将其作为附件添加到该ItemProcessor中,也可以通过一个步骤生成需要发送的所有Excel文件,然后在下一步中发送它们。 在我的书中有一个从Spring Batch发送电子邮件的例子: Pro Spring Batch

我做了以下事情,它的目的是: –

 private ByteArrayOutputStream outputStream; outputStream = new ByteArrayOutputStream(); WritableWorkbook workbook = Workbook.createWorkbook(outputStream); . . . . workbook.write(); workbook.close(); 

现在,获取值的getter: –

 public ByteArrayOutputStream getOutputStream() { return this.outputStream; } 

最后,对于电子邮件附件:

 JavaMailSenderImpl sender = new JavaMailSenderImpl(); MimeMessage message = sender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo(destiny); helper.setSubject(subject); helper.setText(msg); helper.setFrom(from); . . . FileSystemResource fsr = new FileSystemResource(file); helper.addAttachment("Sample.xls", fsr); 

谢谢你的帮助guyz!