近日在项目中碰到了一个需求,客户的excel文件中的数据根据其他excel文件生成,生成后还需要编辑后再发布出去,这样其它人才能够下载查阅。excel文件的生产采用apache下的poi工具可以很好的处理,如果生成的临时文件让用户下载编辑后重新上传也可以满足用户的需求,但是客户体验不好。因此需要能够让用户通过浏览器打开excel并实现保存功能。
经过个人的一番查找到了开源的 zk spreedsheet 组件。其也有商业版本,不过开源版本已经能够满足项目的要求了!O(∩_∩)O~ 产品的访问地址为:https://www.zkoss.org/product/zkspreadsheet 下载页面为:https://www.zkoss.org/download/zkspreadsheet 这块可以下载到开源版本和相关的demo。官方也有相关的文档和例子可以参照学习。
我在项目中同时使用了其zul框架,好像必须使用其自带的ui框架。
1、页面显示excel文件
<window title="" height="100%" width="100%" apply="excel.view">
<spreadsheet id="ss"
vflex="1" hflex="1" maxVisibleRows="150" maxVisibleColumns="40"
showToolbar="true" showSheetbar="true" showFormulabar="false" showContextMenu="false"/>
</window>
其中apply标签为对应的backbean,有点类似asp.net,通过java代码可以控制显示。spreadsheet有个src标签可以直接给一个文件路径,不过我是通过excel下view类来动态控制要显示的那个文件
2、excel.view类
public class view extends SelectorComposer<Component>{
@Wire
private Spreadsheet ss;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
//这里可以指定不同的文件来进行显示
File file=new File(“c:\\test.xls”);
if (file.exists()){
ss.setSrc(“c:\\test.xls”);
ss.disableUserAction(AuxAction.ADD_SHEET, true);
actionManager.registerHandler(
DefaultUserActionManagerCtrl.Category.AUXACTION.getName(),
AuxAction.SAVE_BOOK.getAction(), new SaveBookHandler());
}else{
ss.setVisible(false);
Messagebox.show("没有找到对应的文件!", "错误", Messagebox.OK, Messagebox.ERROR);
}
}
工具栏自动的前三个按钮,新建、保存和保存成pdf是没有任何功能的,需要使用者根据实际情况来自定义实现。
实现接口UserActionHandler,如下代码所示:
@Override
public boolean isEnabled(Book book, Sheet sheet) {
return book!=null;
}
@Override
public boolean process(UserActionContext ctx){
try{
Book book = ctx.getBook();
Exporter exporter=Exporters.getExporter();
File file = new File(url);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
exporter.export(book, fos);
}finally{
if(fos!=null){
fos.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
return true;
}
然后通过UserActionManager进行注册即可(参考 view.excel类中红色部分)
至此一个简单excel在线查看编辑工具就完成了,当然了个人觉得这个工具还有一些不足,如工具栏的按钮不能隐藏,只能禁用,即使禁用了,但是还是可以点击的!