js方法:
//导出excel数据
$("#do_export").click(function () {
var listTitle=["序号","统计月份","姓名","手机号","用户","用户Id","名称","是否开通","开通时间","开通方式"];
var parames = JSON.stringify(allData);//allData是一个保存数据的list集合
var url="/account/export";
//设置为Post格式,否则传递的值参数太多,通过隐藏域传值
var html = '<form action="'+url+'" name="form1" method="post" target="_self" id="postData_form">'+
'<input id="listData" name="listData" type="hidden" value=\''+parames+'\'/>'+
'<input id="listTitle" name="listTitle" type="hidden" value=\''+listTitle+'\'/>'+
'</form>';
$('body', document).append(html);//页面不会跳转,就在本页面下载
document.form1.submit();
document.form1.remove();//移除掉,这样可以多次导出
});
java后台代码:
/**
* 导出账户信息的excel(数据量太大,必须用POST)
* @param jsonObject
* @return
*/
@RequestMapping(value = "/account/export",method = RequestMethod.POST)
public void accountExport(String listData,String listTitle,HttpServletResponse response){
String[] listT=listTitle.split(",");
List<Account> listD=JSONObject.parseArray(listData, Account.class);//import com.alibaba.fastjson.JSONObject;
try {
export(response,listT,listD);
} catch (Exception e) {
e.printStackTrace();
}
}
如果请求的数据量太大,使用的是jetty plugin,可以在pom文件中,添加以下设置
<!-- jetty-plugin -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<systemProperties>
<systemProperty>
<name>org.mortbay.jetty.Request.maxFormContentSize</name>
<!-- -1代表不作限制 -->
<value>-1</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>
不同版本的jetty plugin略有不同,根据版本进行设置即可
导出的方法:
static void export(HttpServletResponse response,String[] listTitle,List<Account> listData) throws Exception{
//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet("sheet0");
sheet.addMergedRegion(new CellRangeAddress(0,0,0,13));//合并单元格
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
cellStyle.setFillBackgroundColor(HSSFColor.LIME.index);
HSSFFont fontStyle = wb.createFont();
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
fontStyle.setBold(true); //加粗
fontStyle.setFontHeightInPoints((short)16); //设置标题字体大小
cellStyle.setFont(fontStyle);
//创建HSSFRow对象
HSSFRow row = sheet.createRow(0);
//创建HSSFCell对象
HSSFCell cell=row.createCell(0);
//设置单元格的值
cell.setCellValue("Account详情");//设置标题
cell.setCellStyle(cellStyle);
HSSFRow rowTitle = sheet.createRow(1);
HSSFCellStyle cellTitleStyle = wb.createCellStyle();
cellTitleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellTitleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
HSSFCell cellTile=null;
//添加列头
for (int i = 0; i < listTitle.length; i++) {
sheet.setColumnWidth(i,listTitle[i].getBytes().length*256);//宽度自适应
cellTile=rowTitle.createCell(i);
cellTile.setCellStyle(cellTitleStyle);
cellTile.setCellValue(listTitle[i]);
}
int rowNum=2;//行数(出去标题和列头)
int num=0;//序号
Calendar calendar= Calendar.getInstance();
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;
String date=String.valueOf(year) +(month<10?"0"+String.valueOf(month):String.valueOf(month));//月份变成两位
String name="";//记录名字
if(!CollectionUtils.isEmpty(listData)){
name=listData.get(0).getUserName();
}
//添加数据
for (int i = 0; i < listData.size(); i++) {
HSSFRow rowData = sheet.createRow(rowNum+i);//创建行存放数据
HSSFCell cellData=null;
num+=1;//序号+1
for (int j = 0; j < listTitle.length; j++) {
Account detail=listData.get(i);
cellData=rowData.createCell(j);
cellData.setCellStyle(cellTitleStyle);
if(j==0){
cellData.setCellValue(num);
}else if(j==1){
cellData.setCellValue(date);
}else if(j==2){
cellData.setCellValue(detail.getUserName());
}else if(j==3){
cellData.setCellValue(detail.getCellphone());
}else if(j==4){
cellData.setCellValue(detail.getCreatorName());
}else if(j==5){
cellData.setCellValue(detail.getId());
}else if(j==6){
cellData.setCellValue(detail.getName());
}else if(j==7){
if(("0").equals(detail.getIsOpen())){
cellData.setCellValue("否");
}else{
cellData.setCellValue("是");
}
}else if(j==8){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
if(detail.getInvitationTime()!=null){
cellData.setCellValue(format.format(detail.getTime()));
}
}else if(j==9){
if(("1").equals(detail.getFlag())){
cellData.setCellValue("直接邀请");
}else{
cellData.setCellValue("间接邀请");
}
}
}
}
response.addHeader("Content-Disposition", "attachment;filename=" +new String(name.getBytes("GB2312"), "8859_1") +date+ ".xls");
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("pragma","no-cache");
try {
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
ByteArrayOutputStream os = new ByteArrayOutputStream();
wb.write(os);
toClient.write(os.toByteArray());
toClient.flush();
toClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}