将jsp页面的表格通过jxl的方式导出到excel中

时间:2022-12-17 22:18:36

最近在做公司销量的统计报表,需要导出功能,在网上找了很久也没找到合适的插件,由于现在的浏览器安全级别越来越高,普通的js导出都需要降低浏览器的安全级别,相对而言用户体验不是很好。于是考虑将页面的table数据通过java jxl导出。主要代码如下:

第一步:将页面表格的数据转换成json字符串

//初始化表格二维数组
var tableArray = new Array();
for(var i = 0;i < maxRow ;i++){
var trArray = new Array();
for(var j = 0;j < maxCol; j++){
var obj = new Object();
obj.rowIndex = i;
obj.colIndex = j;
obj.colSpan = 1;
obj.rowSpan = 1;
obj.value = "";
obj.useful = true;
trArray[j] = obj;
}
tableArray[i] = trArray;
}

//获取到原表格  用原表格数据  填充表格二维数组中的值
var table = $("#" + tableId);
for(var i = 0;i<tableArray.length;i++){
var tdIndex = 0;
for(var j = 0;j<tableArray[i].length; j++){
//判断当前单元格是否可用  若为不可用  则表示当前单元格已被之前的跨行或跨列所赋值
if(tableArray[i][j].useful){
var td = table.find("tr").eq(i).find("td").eq(tdIndex)
//用单元格的值替换对应的二维数组中的值
tableArray[i][j].value = td.html();
//如果当前单元格存在跨行  则跨行后的单元格设置为不可用状态  useful = false
if(td.attr("rowspan") != undefined){
tableArray[i][j].rowSpan = td.attr("rowspan");
for(var temp = 1;temp < parseInt(td.attr("rowspan"));temp ++){
//设置单元格为不可用
tableArray[i + temp][j].useful = false;
}
}
//如果当前单元格存在跨列  则跨列后的单元格设置为不可用状态  useful = false
if(td.attr("colspan") != undefined){
tableArray[i][j].colSpan = td.attr("colspan");
for(var temp = 1;temp < parseInt(td.attr("colspan"));temp ++){
//设置单元格为不可用
tableArray[i][j + temp].useful = false;
}
}
tdIndex ++;
}
}
}

第二步:在java代码中将表格数据写入到excel中

try {
//判断文件名是否为空  文件名为空时  用当前时间作为文件名
if (!StringUtil.isFine(fileName)) {
fileName = System.currentTimeMillis() + "";
}
//将文件名编码为 iso-8859-1  防止中文文件名乱码
fileName = new String(fileName.getBytes(), "iso8859-1");


OutputStream os = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流 防止缓存
response.setHeader("Content-disposition", "attachment; filename="
+ fileName + ".xls");
response.setContentType("application/vnd.ms-excel");// 定义输出类型为excel
WritableWorkbook wbook = Workbook.createWorkbook(os);//创建表格对象
WritableSheet wsheet = wbook.createSheet("sheet1", 0);//创建sheet  此处默认sheet名
JSONArray jsonArr = JSONArray.fromObject(tableStr);
//单元格格式化  可自行扩展  将页面table样式 转换成对应的excel样式
WritableCellFormat cellFormat = new WritableCellFormat();
cellFormat.setAlignment(Alignment.CENTRE);//设置excel单元格左右居中
cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);//设置excel单元格上下居中
//遍历表格二维数组  将值填充到excel中
for (Object tr : jsonArr.toArray()) {
for (Object td : JSONArray.fromObject(tr).toArray()) {
JSONObject jo = JSONObject.fromObject(td);
//判断当前单元格是否可用  可用时才设置值  若为不可用时则不设置值,避免合并单元格时出错
if(jo.getBoolean("useful")){
//根据传入的单元格对象 设置excel对应单元格的值
Label label = new Label(jo.getInt("colIndex"),
jo.getInt("rowIndex"), jo.getString("value"));
//设置单元格的格式  此处可扩展
label.setCellFormat(cellFormat);
//将当前单元格添加到sheet中
wsheet.addCell(label);
}
//如果当前单元格存在跨行或者跨列时  则合并excel中对应单元格
if(jo.getInt("colSpan") > 1 || jo.getInt("rowSpan") > 1){
//合并开始单元格的列坐标
int a = jo.getInt("colIndex");
//合并开始单元格的行坐标
int b = jo.getInt("rowIndex");
//合并结束单元格的列坐标   开始列 + 跨行
int c = a + jo.getInt("colSpan") - 1;
//合并结束单元格的行坐标  开始行 + 跨列
int d = b + jo.getInt("rowSpan") -1;
wsheet.mergeCells(a,b,c,d);
}
}
}
wbook.write(); // 写入文件
wbook.close();
os.close(); // 关闭流
} catch (Exception e) {
e.printStackTrace();
}

源代码下载地址:http://download.csdn.net/detail/qiulinq/9058519