前段时间,项目要求加一个Excel导入导出的功能,要求对导出的Excel文件编辑后,能够重新导入并保存,一开始用的是直接将response设置为返回excel格式,但在导入时提示出错。在网上查了一下,原来直接导出的excel文件还是网页模式的,而非真正的excel,需要将修改后的excel文件另存为一个excel文件后才能正常导入,这当然是一个非常不友好的缺陷。
网上大牛真是多,有人说jxl控件是专门用来进行excel操作的,试验了一下,还真是好用,下面把我的应用用demo的形式记录一下,请大家批评指正。
项目用的是ext3.3+SSH架构,目前应该比较大众化,ext3.3中的文件上传用的是扩展控件,在ext4.0中已经集成了文件上传控件,速度更新还真是快啊,让人不能蛋定。我的步骤是先设计界面,然后写代码,由于是后来增加的功能也不管什么设计流程了,用了最原始的作坊流程。
(1) 在前台下拉框中,选择导出为Excel文件,此时ext触发导入的action,js代码如下
// 将策略另存为选择的类型
function saveAsSelectedType(type) {
window.location.href = basePath + '/task/frm!exportExcel.action?type='
+ type;
}
(2)在action中获取要导出的数据,传给方法exportExcelAsSet,执行excel导出。参数分别为文件名、表格名、type(本文分msdoc和msexcel)。headers,headerNames, array是和数据相关的数组和字段名称、类型。
public void exportExcel()throws IOException,RowsExceededException, WriteException
{
String type = this.getRequest().getParameter("type");
// 先从session中获取策略信息,如果没有则重新获取策略信息
JSONObject json = (JSONObject) this.getRequest().getSession().getAttribute("localdispatch");
if(json == null){
json = frmTaskService.localDispatch(this.getLocalNmsinfo());
}
JSONArray array =(JSONArray) json.get("result");
String fileName = "本地策略." + (type.equals("msexcel")?"xls":"doc");
String tableCaption = "本地已启动任务相关策略";
this.exportExcelAsSet(fileName,tableCaption, type, headers, headerNames, array);
}
(3)在exportExcelAsSet中执行excel导出
public void exportExcelAsSet(StringfileName, String tableCaption,String type, String[]headers, String[]headeNames,JSONArray array) throws IOException, RowsExceededException, WriteException{
//获取并设置response
HttpServletResponseresponse = this.getResponse();
// 循环添加数据
if(type.equals("msexcel")){
// 输出流
OutputStream outputStream = response.getOutputStream();
// 创建一个excel文件,并绑定到outputStream
WritableWorkbook workbook = Workbook.createWorkbook(outputStream);
// 添加一个excel中的sheet
WritableSheet sheet =workbook.createSheet("sheet1", 0);
// 设置表头,第0列 0行
sheet.addCell(new Label(0,0,tableCaption,setTitle(20)));
// 合并表头单元格
sheet.mergeCells(0,0, headers.length-1, 0);
// 设置标题栏
for(int i=0;i<headeNames.length;i++){
sheet.addCell(new Label(i,1,headeNames[i],setTitle(13)));
// 设置列的宽度
if(i>0 && i<headeNames.length-1)
if(headeNames[i].equals("设备类型"))
sheet.setColumnView(i, 18);
else
sheet.setColumnView(i, 10);
else {
sheet.setColumnView(i, 18);
}
}
for(int i=0;i<array.size();i++){
for(int j=0;j<headeNames.length;j++){
// 读取并添加数据
sheet.addCell(new Label(j,i+2,array.getJSONObject(i)
.getString(headers[j]),setTitle(10)));
}
}
// 输出Excel
workbook.write();
workbook.close();
}else{
//……doc导出
}
}