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

小编 2026-06-05 阅读:291 评论:0
导入jar包 在pom.xml中导入jar包 <!-- 导出成excel表格用的包 --> <dependency> <groupId>org.a...

导入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;
    }
}
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表