java导出excel并在当前页面下载

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();
	   }
	}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值