有一个关于导出excel的问题 


//js 代码 
var form = $("<form>");//定义一个form表单
form.attr('style', 'display:none');//设置为不展示
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', url);//url为后台请求的地址
//参数以input的方式 放入form中 params :{key:value}
for(var key in params){
form.append(
"<input type='hidden' name='" + key + "' value='" + params[key] + "' />"
);
}
$('body').append(form);//将表单放置在web中
form.submit();//表单提交
form.remove();//下载完成之后 删除form
后台代码就不赘述了 不过有一点
String fileName = "测试";
fileName=URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+new
String(fileName.getBytes("UTF-8"),"iso-8859-1")+".xls");

//有一些浏览器下载的时候会出现文件名称会出现乱码情况
//可以先把fileName编码 然后再getBytes 再转换成iso-8859-1
//这样就可以解决乱码 当然可能还会出现其他乱码 那我暂时没遇到~

  下边是一个excel简单导出的util类 可能存在很多不足 但是基本的应用倒是没问题

/** 这是一个excel简单导出的util类 
* Created by Lm
*/
public class ExportMapExcel {
/**
*
* @param title sheet页名称
* @param headersName 表格头名称
* @param headersId 表格头对应数据中Map的key
* @param dtoList 数据
* @param fileName 导出文件名称
* @param response
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void exportExcel(String title, List<String> headersName, List<String> headersId,
List<Map<String, Object>> dtoList,String fileName,HttpServletResponse response) {
/*
(一)表头--标题栏
*/
Map<Integer, String> headersNameMap = new HashMap<Integer, String>();
int key = 0;
for (int i = 0; i < headersName.size(); i++) {
if (!headersName.get(i).equals(null)) {
headersNameMap.put(key, headersName.get(i));
key++;
}
}
/*
(二)字段---标题的字段
*/
Map<Integer, String> titleFieldMap = new HashMap<Integer, String>();
int value = 0;
for (int i = 0; i < headersId.size(); i++) {
if (!headersId.get(i).equals(null)) {
titleFieldMap.put(value, headersId.get(i));
value++;
}
}
/*
(三)声明一个工作薄:包括构建工作簿、表格、样式
*/
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(title);
sheet.setDefaultColumnWidth(15);

// 生成一个样式
HSSFCellStyle style = wb.createCellStyle();
HSSFRow row = sheet.createRow(0);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell;
Collection c = headersNameMap.values();//拿到表格所有标题的value的集合
Iterator<String> headersNameIt = c.iterator();//表格标题的迭代器
/*
(四)导出数据:包括导出标题栏以及内容栏
*/
//根据选择的字段生成表头--标题
int size = 0;
while (headersNameIt.hasNext()) {
cell = row.createCell(size);
cell.setCellValue(headersNameIt.next().toString());
cell.setCellStyle(style);
size++;
}
//表格一行的字段的集合,以便拿到迭代器
Collection zdC = titleFieldMap.values();
Iterator<Map<String, Object>> titleFieldIt = dtoList.iterator();//总记录的迭代器
int zdRow = 1;//真正的数据记录的列序号
while (titleFieldIt.hasNext()) {//记录的迭代器,遍历总记录
Map<String, Object> mapTemp = titleFieldIt.next();//拿到一条记录
row = sheet.createRow(zdRow);
zdRow++;
int zdCell = 0;
Iterator<String> zdIt = zdC.iterator();//一条记录的字段的集合的迭代器
while (zdIt.hasNext()) {
String tempField =zdIt.next();//字段的暂存
if (mapTemp.get(tempField) != null) {
Object valueObj = mapTemp.get(tempField);
boolean isNum = false;
if(valueObj != null && !"".equals(valueObj)){
isNum = valueObj.toString().matches("^(-?\\d+)(\\.\\d+)?$");
}
if(isNum){//数字
row.createCell(zdCell).setCellValue(Double.valueOf(StrUtil.ObjToStr(mapTemp.get(tempField))));//写进excel对象
}else{
row.createCell(zdCell).setCellValue(String.valueOf(mapTemp.get(tempField)));//写进excel对象
}
zdCell++;
}
}
}

try {
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("utf-8");
fileName=URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"iso-8859-1")+".xls");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}