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

问题描述 投票:0回答:3

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

这是我们正在执行的类似代码:-

Controller

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请求。

提前感谢!

excel spring-batch jxl
3个回答
1
投票

Spring Batch中有一个MimeMessageItemWriter,您应该可以使用它发送电子邮件。您需要创建一个创建MimeMessage的ItemProcessor。您可以创建Excel文件并将其作为附件添加到该ItemProcessor中,或者一步一步生成所有需要发送的Excel文件,然后在下一步中进行发送。我的书中有一个从Spring Batch发送电子邮件的示例:Pro Spring Batch


1
投票

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

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

现在是获取值的吸气剂:-

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

感谢您的帮助!


0
投票

您能否分享对您有用的代码。我有一个相同的要求,我必须创建一个Excel工作表并将其邮寄。在这里,变量“文件”是什么意思。还有为什么您需要getter函数以及在哪里使用它?

© www.soinside.com 2019 - 2024. All rights reserved.