这是个工具类,这次使用的jxl的包,下面就是生成的过程
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.CellView;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class ExportExcel {
// @Autowired
// SysUsersMapper usersMapper;
/*
* @param contenttitle EXCEL文件名称
*
* @param listTitle EXCEL文件第一行列标题集合
*
* @param datalist 数据list
*
* @param cols 字段列表
*
* @param path 生成的文件路径
* @return
*/
@SuppressWarnings("rawtypes")
public static boolean exportExcel(String path, String contenttitle,String[] listTitle, List<Map> datalist, String[] cols) {
try {
//File logo = new File("./src/main/webapp/assets/biz-logic/images/logo.png"); //读入logo图片
File Folder = new File(path);
//找到文件夹
if(!Folder.exists()){
Folder.mkdirs();
}
//文件
File file = new File(path+contenttitle+".xls");
// WritableWorkbook wb = Workbook.createWorkbook(file);
/** **********创建工作簿************ */
WritableWorkbook workbook = Workbook.createWorkbook(file);
/** **********创建工作表************ */
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
/** **********设置纵横打印(默认为纵打)、打印纸***************** */
jxl.SheetSettings sheetset = sheet.getSettings();
sheetset.setProtected(false);
/** ************设置单元格字体************** */
WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);
/** ************以下设置三种单元格样式,灵活备用************ */
// 用于标题居中
WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
//wcf_center.setIndentation(33);//Border 边框 Indentation 缩格
wcf_center.setLocked(true);
wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
wcf_center.setWrap(false); // 文字是否换行
// 用于正文居左
WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐左
wcf_left.setWrap(false); // 文字是否换行
wcf_left.setIndentation(0);
// 用于正文列名
WritableCellFormat wcf_head= new WritableCellFormat(NormalFont);
wcf_head.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
wcf_head.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
wcf_head.setAlignment(Alignment.CENTRE); // 文字水平对齐 居中
wcf_head.setWrap(false); // 文字是否换行
wcf_head.setIndentation(0);
//excel页面标题 根据列名长度合并单元格
sheet.mergeCells(0, 0, listTitle.length-1 ,4);//合并单元格起始列、行,到末列行
//WritableImage image = new WritableImage(0, 0, 1.5, 5, logo);//设置logo图片
// sheet.addImage(image); // 加载图片
sheet.addCell(new Label(0, 0, contenttitle, wcf_center));//表格标题名
/** ***************以下是EXCEL列标题********************* */
CellView cellView = new CellView();
cellView.setAutosize(true); //设置自动大小
for (int i = 0; i < listTitle.length; i++) {
sheet.addCell(new Label(i, 5, listTitle[i], wcf_head));
}
/** ***************以下是EXCEL正文数据********************* */
for (int i = 0; i < datalist.size(); i++) {
Map dataMap = datalist.get(i);
for (int j = 0; j < cols.length; j++) {
if(j==0){
//序号 为了生成序号
sheet.addCell(new Label(j, i + 6, i+1+"", wcf_left));
}else{
if(dataMap.get(cols[j])==null){
//防止有空项导出是报空指针异常
sheet.addCell(new Label(j, i + 6, "~", wcf_left));
}else{
sheet.addCell(new Label(j, i + 6, dataMap.get(cols[j]).toString(), wcf_left));
sheet.setColumnView(j, dataMap.get(cols[j]).toString().length()+10);
}
}
}
}
/** **********将以上缓存中的内容写到EXCEL文件中******** */
workbook.write();
/** *********关闭文件************* */
workbook.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
中间有插入图片,后来取消了;
下面是下载前必须要做的,防止乱码
public static void setFileDownloadHeader(HttpServletRequest request,HttpServletResponse response, String fileName) {
try {
//中文文件名支持
String encodedfileName = null;
String agent = request.getHeader("USER-AGENT");
if(null != agent && -1 != agent.indexOf("MSIE")){//IE
encodedfileName = java.net.URLEncoder.encode(fileName,"UTF-8");
}else if(null != agent && -1 != agent.indexOf("Mozilla")){
encodedfileName = new String (fileName.getBytes("UTF-8"),"iso-8859-1");
}else{
encodedfileName = java.net.URLEncoder.encode(fileName,"UTF-8");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + "\"");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
以上只需要在controler中调用就行;
最后需要注意的是请求应该是url,不能通过ajax去请求,虽然都用了get请求,但ajax会报错,而url却不会,这一点需要在注意,这也和很多网上的下载链接需要跳转页的原因是相同的;也许ajax需要其他的写法才能完成,以后用的时候回来补充的。链接:http://www.oschina.net/code/snippet_1444646_47221#67538