在WEB开发中,经常遇到将列表数据导出生成Excel文件这样的功能需求。
1.编写js脚本
编写export.js,主要是将页面上table中的内容按照一定的格式转化为js数组,准备导出form的数据。
/**
* 导出excel(兼容单行多列)
*
* @param id---->需要导出table的id
* @param sName---->sheetName
* @param titleName---->标题名称
* @param cellStart---->掐头去尾-去掉的头部列数(避免导出无用的列,如序号列)
* @param cellEnd
* ---->掐头去尾-去掉的尾部列数(避免导出无用的列,如操作按钮列)
* @returns {Boolean}
*/
// 导出excel表格
function exportExcel(id, sName, titleName, cellStart, cellEnd) {
var t = document.getElementById(id);
var rl = t.rows.length;
var cl = t.rows[0].cells.length;
// alert(id);
var listData = [];
// alert(listData);
var offsetLeftArray = new Array();
var cell; // 单元格Dom
var col; // 单元格实际所在列
var cellStr; // 每个cell以row,col,rowSpan,colSpan,value形式
var cellStrArray = [];
var objTab = document.getElementById(id);
// 遍历第一次取出offsetLeft集合
for (var i = 0; i < objTab.rows.length; i++) {
for (var j = cellStart; j < objTab.rows[i].cells.length - cellEnd; j++) {
cell = objTab.rows[i].cells[j];
// if (offsetLeftArray.contains(cell.offsetLeft) == -1)
if (containsArray(offsetLeftArray, cell.offsetLeft) == -1) offsetLeftArray.push(cell.offsetLeft);
}
}
offsetLeftArray.sort(function(x, y) {
return parseInt(x) - parseInt(y);
});
// alert("offsetLeft集合:" + offsetLeftArray.join(','));
// 遍历第二次生成cellStrArray
for (var i = 0; i < objTab.rows.length; i++) {
var startIndex = cellStart;
//如果要过滤左边的无用列,解决跨行的问题
if (i != 0 && cellStart > 0) {
for (var k = 0; k < cellStart; k++) {
if (objTab.rows[i - 1].cells[k].rowSpan > 1) startIndex--;
}
startIndex = startIndex < 0 ? 0 : startIndex;
}
var endIndex = cellEnd;
//如果要过滤右边的无用列,解决跨行的问题
if (i != 0 && cellEnd > 0) {
var row = objTab.rows[i - 1];
for (var k = 0; k < cellEnd; k++) {
if (row.cells[row.cells.length - 1 - k].rowSpan > 1) endIndex--;
}
endIndex = endIndex < 0 ? 0 : endIndex;
}
for (var j = startIndex; j < objTab.rows[i].cells.length - endIndex; j++) {
cell = objTab.rows[i].cells[j];
col = containsArray(offsetLeftArray, cell.offsetLeft);
cellStr = i + ',' + col + ',' + cell.rowSpan + ',' + cell.colSpan + "," + ((Sys.firefox || Sys.ie==8.0) ? cell.innerHTML: cell.textContent);
cellStrArray.push(cellStr);
}
}
// 显示
/*
* var str = "行,列,rowSpan,colSpan,值\n"; str += cellStrArray.join('\n');
* alert(str);
*/
listData = cellStrArray;
$('#data').val(JSON.stringify(listData));
if (sName) {
$('#sName').val(sName);
} else {
$('#sName').val('导出');
}
$('#titleName').val(titleName);
if (confirm("确定要导出excel表格吗?")) {
if ($('#excelimport').html() != null) {
$('#excelimport').submit();
}
}
}
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
if (window.ActiveXObject) Sys.ie = ua.match(/msie ([\d.]+)/)[1];
else if (document.getBoxObjectFor) Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1];
function containsArray(array, obj) {
for (var i = 0; i < array.length; i++) {
if (array[i] == obj) {
return i;
break;
}
}
return - 1;
}
2.编写Java后台工具类
ExportExcel.java, 提供生成Excel表格和Excel下载的方法,package省略。
这里需要jxl的jar包,我这里用的是jxl-2.6.9.jar,其他版本也是可以的,请自行下载并导入项目。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import jxl.Workbook;
import jxl.biff.DisplayFormat;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class ExportExcel {
public synchronized static void createExcel(String filePath,List
3.Controller里编写方法,处理导出请求
若缺少jar包,请自行下载。
package com.gsww.peop.web.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gsww.peop.web.commons.ExportExcel;
@Controller
@RequestMapping("/comm")
public class CommonController extends CrudSupport{
/**
* excel导出功能
* @param request
* @param response
* @param data
* @param sName
* @param titleName
*/
@RequestMapping("/export")
public void exportExcel(HttpServletRequest request,HttpServletResponse response,
String data,String sName,String titleName){
//文件名称中文时会乱码,这里处理下,处理完火狐下还是乱码,谷歌合适。
String fileName = toUtf8String(sName+".xls");
JSONArray listDataJson = JSONArray.fromObject(data);
//
try {
File dir = new File(request.getSession().getServletContext().getRealPath("/") +"excel");
if(!dir.exists()){
dir.mkdirs();
}
String filePath = request.getSession().getServletContext().getRealPath("/") +"excel\\"+fileName;
//注意导入ExportExcel.java工具类
//生成Excel表格
ExportExcel.createExcelForAnyTable(filePath,listDataJson,sName,titleName);
//下载Excel表格
ExportExcel.download(filePath,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* (解决文件导出时文件名为乱码的问题)
* @param s
* @return
*/
public static String toUtf8String(String s){
StringBuffer sb = new StringBuffer();
for (int i=0;i= 0 && c <= 255){sb.append(c);}
else{
byte[] b;
try { b = Character.toString(c).getBytes("utf-8");}
catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
}
jsp页面
页面列表
导出的Excel
如果导出的内容不是列表上显示的,那么可以把准备导出的内容放在一个隐藏的table中,但是display设置为none是不行的,这种情况可以这么写