java 导出excel表格 并且可弹出下载框下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aaajavac/article/details/85164098

导入jar包

在pom.xml中导入jar包

<!-- 导出成excel表格用的包 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.6</version>
		</dependency>

前端js中发送请求

只能使用form表单提交,不能用ajax提交,原因是使用ajax提交数据不能跳转到新页面进行下载excel

//导出成excel表格
<!-- 
	encodeURIComponent(head) head是表单每列的标题,encodeURIComponent用来编码,
	防止中文乱码,格式为aaa,bbb,ccc,ddd 表示这个表单有4列
	body  表单主体内容 格式 a1,b1,c1,d1;a2,b2,c2,d2;表示有24列的数据
	excelname 表示表单的名字	
-->
$("<form method='post' action='../report/export.do'>"+
			"<input type='hidden' name='head' value='"+encodeURIComponent("列标")+"'/>"+
			"<input type='hidden' name='body' value='"+"body"+"'/>"+
			"<input type='hidden' name='excelname' value='"
			+encodeURIComponent("excelname")+"'/></form>").appendTo('body').submit().remove();

controller层

package com.morlia.management.controller;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.morlia.management.service.reportservice.ReportService;
/**
 *导出数据到excel的控制器
 * @date: 2018年10月31日 下午4:47:45
 */
@Controller
@RequestMapping(value = "/report")
public class ReportController {
	@Autowired
	private ReportService reportservice;
	/**
	 *导出报表
	 *request head=xxxx,xxxx,xxxx(xxxx表示excel每列的标题)&body=yyy,yyy,yyy;yyy,yyy,yyy(用;号表示excel一行结束,yyy表示每个单元格的数据)
	 * @param: param
	 * @author : dcc
	 * @date: 2018年10月31日 下午4:49:26
	 */
	@RequestMapping(value = "/export.do", method = RequestMethod.POST)
    public void export(HttHttpServletRequest req,HttpServletResponse response) throws Exception {
		reportservice.getExcel(req, response);
	}
}

service层

package com.morlia.management.service.reportservice;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.stereotype.Service;
import com.morlia.management.common.utils.ExcelUtil;

/**
 * @注释 生成excel表格的接口service
 * @author dcc
 * @date 2018年12月6日 下午2:22:51
 */
@Service("reportservice")
public class ReportService {
	Logger log = Logger.getLogger(this.getClass());
	public void getExcel(HttHttpServletRequest req, HttpServletResponse rsp) throws IOException {
		String head = "";
		String excelname = "";
		try {
			head = req.getParameter("head");
		    excelname = req.getParameter("excelname");
			head = URLDecoder.decode(head,"utf-8");
			excelname = URLDecoder.decode(excelname,"utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} 
        //excel标题
		String[] title = head.substring(0, head.length()-1).split(",");
		//获取body字段
		String body = req.getParameter("body");
		String[] bodys = body.split(";");
		//获取tablename字段
		String tablename = excelname;
		String[][] content = new String[bodys.length][title.length];
		//excel文件名
		String fileName = tablename+System.currentTimeMillis()+".xls";
		//sheet名	
		String sheetName = "统计信息表";
		String con = "";
		for (int i = 0; i < bodys.length; i++) {
			log.debug("body["+i+"]:"+bodys[i].substring(0, bodys[i].length()-1));
		         content[i] = new String[title.length];
		         content[i]= bodys[i].substring(0, bodys[i].length()-1).split(",");
		  }
		//创建HSSFWorkbook 
		HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
		//响应到客户端
		try {
			this.setResponseHeader(rsp, fileName);
	    	OutputStream os = rsp.getOutputStream();
	    	wb.write(os);
	    	os.flush();
	    	os.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	 /**
	  * 发送响应流方法
	  * @param response
	  * @param fileName
	  */
	 public void setResponseHeader(HttpServletResponse response, String fileName) {
	     try {
	         try {
	             fileName = new String(fileName.getBytes(),"ISO8859-1");
	         } catch (UnsupportedEncodingException e) {
	             e.printStackTrace();
	         }
	         response.setContentType("application/octet-stream;charset=ISO8859-1");
	         response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
	         response.addHeader("Pargam", "no-cache");
	         response.addHeader("Cache-Control", "no-cache");
	     } catch (Exception ex) {
	         ex.printStackTrace();
	     }
	 }
}

工具类util

package com.morlia.management.common.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
/**
 * 导出Excel
 * @param sheetName sheet名称
 * @param title 标题
 * @param values 内容
 * @param wb HSSFWorkbook对象
 * @author dcc
 * @return
 */
public class ExcelUtil {
    public static HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if(wb == null){
            wb = new HSSFWorkbook();
        }

        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        
        // 创建一个居中格式
        style.setAlignment(HorizontalAlignment.CENTER); 

        //声明列对象
        HSSFCell cell = null;

        //创建标题
        for(int i=0;i<title.length;i++){
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        //创建内容
        for(int i=0;i<values.length;i++){
            row = sheet.createRow(i + 1);
            for(int j=0;j<values[i].length;j++){
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;
    }
}

猜你喜欢

转载自blog.csdn.net/aaajavac/article/details/85164098