Playframework Excel文件生成

我已经安装了excel模块,以便从我的应用程序logging到数据库中的数据生成报告。 它工作正常:我可以创build报告只需点击一个链接到我的主页,并呈现为Excel模板。

但我宁愿定期生成Excel文件(使用作业),并将其保存到共享文件夹,并没有任何人为的行为(所以不要点击链接)。

这就像我想触发相关的控制器自动呈现到我的模板。

有没有人对我有任何提示?

所以问题是你不能传递一些参数到工作中,或者…?

使用这样的东西只是不起作用?

@On("0 45 4-23 ? * MON-FRI") public class ExcelJob extends Job { public void doJob() { // generate excel } } 

我使用JExcel编写了自己的Excel生成器,并将其用于计划生成,没有任何问题。 它也不需要模板,因为报告结构是从注释派生的。 这大概是20行代码 – 你可能想自己尝试一下。

这是非常粗糙的,缺乏良好的用户反馈,但给你的想法…

Excel生成器 – 不以任何方式播放

 public class ExcelGenerator { public void generateReport(Function successCallback, Function failureCallback) { try { byte[] report = // generate your report somehow successCallback.execute(report); } catch (Exception e) { failureCallback.execute(e.getMessage()); } } } 

callback函数接口(非常基本)

 public interface Function { public void execute(Object... args); } 

您的Play控制器

 public class MyController extends Controller { public static void index() { render(); } public static void createReport() { Function failureCallback = new Function() { public void execute(Object... args) { flash.error(args[0]); indxe(); } }; Function successCallback = new Function() { public void execute(Object... args) { renderBinary((byte[])args[0]); } }; ExcelGenerator excelGenerator = new ExcelGenerator(); excelGenerator.generateReport(successCallback, failureCallback); } } 

最后,从工作中重新使用ExcelGenerator

 public class MyJob extends Job { public void doJob() { Function failureCallback = new Function() { public void execute(Object... args) { Logger.error(args[0]); } } Function successCallback = new Function() { public void execute(Object... args) { byte[] report = (byte[])args[0]; // write report to disk } } ExcelGenerator excelGenerator = new ExcelGenerator(); excelGenerator.generateReport(successCallback, failureCallback); } } 

您仍然需要编写自己的报告生成器,或者重构现有的Excel模块以提供您所需要的内容。

所以如果你想运行和pipe理几个工作,你可以做这样的事情

  for (int i = 0; i < 10; i++) { SendingMessageJob sendingMessageJob = new SendingMessageJob(); promises.add(sendingMessageJob.now()); } boolean allDone = false; while (!allDone) { allDone = true; for (F.Promise promise : promises) { if (!promise.isDone()) { allDone = false; break; } } } // when arrive here all jobs have finished their process 

您可以查看Play文档,特别是作业部分 ,您将在其中查看有关如何创build自动触发的方法的示例。 这应该可以解决你的问题。

编辑(更新评论):

你可以手动触发一个工作,做到这一点:

 new MyExcelGeneratorJob().doJob(); 

事情是,Play是无状态的,所以工作应该使用数据库中的数据。 而不是尝试从您的请求传递参数到作业(将不起作用)尝试将数据存储在数据库的临时区域中,作业加载和处理以生成excel。