您的位置:首页 > 编程语言 > Java开发

Ext + jxl + struts 实现Excel导入导出(一)

2011-11-27 20:02 363 查看
前段时间,项目要求加一个Excel导入导出的功能,要求对导出的Excel文件编辑后,能够重新导入并保存,一开始用的是直接将response设置为返回excel格式,但在导入时提示出错。在网上查了一下,原来直接导出的excel文件还是网页模式的,而非真正的excel,需要将修改后的excel文件另存为一个excel文件后才能正常导入,这当然是一个非常不友好的缺陷。

网上大牛真是多,有人说jxl控件是专门用来进行excel操作的,试验了一下,还真是好用,下面把我的应用用demo的形式记录一下,请大家批评指正。

项目用的是ext3.3+SSH架构,目前应该比较大众化,ext3.3中的文件上传用的是扩展控件,在ext4.0中已经集成了文件上传控件,速度更新还真是快啊,让人不能蛋定。我的步骤是先设计界面,然后写代码,由于是后来增加的功能也不管什么设计流程了,用了最原始的作坊流程。

一、将数据导出为Excel文件,前台界面如下图所示

(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导出
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: