使用AbstractJExcelView生成excel文件并通过Spring Framework中的MailSender发送

时间:2014-01-29 10:52:04

标签: excel spring-batch jxl

目前我的项目使用Controller类并利用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工作表。我可以处理填充和创建文件,但我不知道如何在缓冲区中生成excel,或者可能在某个临时目录中,可以在发送邮件时再次附加。用户无需响应任何提示。我们也不会使用任何http请求。

提前致谢!

2 个答案:

答案 0 :(得分:1)

Spring Batch中有一个MimeMessageItemWriter可以用来发送电子邮件。您需要创建一个创建MimeMessage的ItemProcessor。您可以创建Excel文件并将其添加为该ItemProcessor中的附件,也可以生成一个步骤来生成需要发送的所有Excel文件,然后在下一步中,您可以发送它们。我有一个在我的书中发送来自Spring Batch的电子邮件的示例:Pro Spring Batch

答案 1 :(得分:1)

我做了以下工作,并达到了目的: -

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);

感谢帮助人员!