Issues when publishing an Excel file
我在财务团队中的同事米歇尔(Michelle)有一份日常工作。 她必须每周发布一次预算报告。 以前,她不得不从数据库查询预算数据。 然后,将预算数据手动填写到模板表中,如下所示:
由于这是一项常规任务,我觉得我可以通过自动执行数据归档过程来为她提供帮助,这样她就不必手动和重复进行此操作。
另一个问题是她一直以附件形式发布预算报告。 读者必须下载文件才能在支持Excel的设备上查看内容。 另外,很难控制附件的发送目的地,她必须先删除所有敏感和原始数据,然后再将其发送出去。
To solve the above issues, I created a web page with a web spreadsheet component, Keikai. Keikai allows me to reuse the existing Excel budget template so that I don’t need to create everything from scratch. It is also important that I can control it with Java.
Load the template file first
To start simple, I loaded the Excel template sheet into Keikai to show it in a browser:
Such page was created by ZUL, an XML format language from ZK framework:
<spreadsheet id="ss" height="100%" width="100%" src="/WEB-INF/books/budget.xlsx"
maxVisibleRows="150" maxVisibleColumns="40"
showContextMenu="true" showToolbar="true" showSheetbar="true"
showSheetTabContextMenu="true" showFormulabar="true"/>
But you can also use Keikai with JSP.
标签,<spreadsheet>代表Keikai电子表格,我可以通过标签属性配置Keikai。
When a user visits http://localhost:8080/database.zul, keikai will respond with a set of javascript and CSS and render the content file in the browser.
Data Access Object
为了从数据库中加载数据,我创建了Expense.java存储每个记录并ExpenseDao.java查询和更新数据库。
Create a controller to populate data
接下来,我实现了一个Java控制器类来填充数据库中的数据。 控制器必须扩展选择器合成器这样就可以注入试算表我的对象。
public class BudgetComposer extends SelectorComposer<Component> {
@Wire
private Spreadsheet spreadsheet;
...
}
@线可以注入试算表页面上的对象,这就是为什么我没有调用任何类似的构造函数的原因new 试算表()。
Range API
然后,我需要将数据设置为范围。 一范围对象可以代表一个或多个单元格/行/列,甚至一张。 我可以得到一个范围使用工厂方法的对象范围s.range(Sheet targetSheet, int rowIndex, int columnIndex)。 例如,范围s.range(currentSheet, 0, 0)代表A1。
要显示单元格中的数据,只需调用range.setCellValue()。 因此,代码非常简单。 查询完列表后费用,我可以像这样在循环中将数据填充到单元格中:
private void fillExpenses(List<Expense> list) {
for (int i = 0; i < list.size(); i++) {
Expense expense = list.get(i);
Ranges.range(spreadsheet.getSelectedSheet(), START_ROW + i, 1)
.setCellValue(expense.getQuantity());
Ranges.range(spreadsheet.getSelectedSheet(), START_ROW + i, 2)
.setCellValue(expense.getSubtotal());
}
}
Result
I was able to quickly turn my colleague’s manual Excel routine into an automated Web app. Now whenever we access the budget report page, Keikai queries the data and displays
it within the report template like:
Try it yourself
If you find this article interesting, there are more examples and demos on Keikai’s website. Or you can run the example project on github.