java查询结果后并下载输出到excel(OutputStream)

后台方法 专栏收录该内容
30 篇文章 0 订阅

1、首先查询出所有的数据,使用spring data jpa查询

public Page<Employee> pageQuery(PageRequest pageRequest) {
		return employeeDao.findAll(pageRequest);
	}
2、查询出来后导出,设置文件名、文件类型、输出流及文件格式

@Action(value="employeeAction_download")
	public String download(){
		try {
			Page<Employee> list =  facadeService.getEmployeeService().pageQuery(getPageRequest());
			//使用poi下载文件
			HSSFWorkbook workbook = new HSSFWorkbook();
			//创建sheet
			HSSFSheet sheet1 = workbook.createSheet("分区信息一");
			//创建row信息
			HSSFRow row = sheet1.createRow(0);
			//创建单元格头标
			row.createCell(0).setCellValue("编号");
			row.createCell(1).setCellValue("姓名");
			row.createCell(2).setCellValue("性别");
			row.createCell(3).setCellValue("入职日期");
			row.createCell(4).setCellValue("出生年月");
			row.createCell(5).setCellValue("户籍所在地");
			row.createCell(6).setCellValue("毕业院校");
			row.createCell(7).setCellValue("职务");
			row.createCell(8).setCellValue("社保账号");
			row.createCell(9).setCellValue("公积金账号");
			row.createCell(10).setCellValue("电话号码");
			row.createCell(11).setCellValue("是否离职");
			//获取数据
			if (list != null && list.getSize() != 0) {
				for (Employee e : list) {
					int lastRowNum = sheet1.getLastRowNum();
					HSSFRow lastRow = sheet1.createRow(lastRowNum + 1);
					lastRow.createCell(0).setCellValue(e.getId());
					lastRow.createCell(1).setCellValue(e.getName());
					lastRow.createCell(2).setCellValue(e.getSex());
					lastRow.createCell(3).setCellValue(e.getEntryday());
					lastRow.createCell(4).setCellValue(e.getBirthday());
					lastRow.createCell(5).setCellValue(e.getRegister());
					lastRow.createCell(6).setCellValue(e.getPosition());
					lastRow.createCell(7).setCellValue(e.getSchool());
					lastRow.createCell(8).setCellValue(e.getSocialsecurity());
					lastRow.createCell(9).setCellValue(e.getPublicfund());
					lastRow.createCell(10).setCellValue(e.getTelephone());
					lastRow.createCell(11).setCellValue(e.getDeltag());
				}
			}
			//response文件流
			HttpServletResponse response = ServletActionContext.getResponse();
			//设置文件名
			String filename = "中喜员工信息.xls";
			//设置文件输出头
			response.setHeader("Content-Disposition", "attachment;filename="+MyFileUtils.encodeDownloadFilename(filename, getRequest().getHeader("user-agent")));
			//设置文件类型servletAction.getMine
			ServletContext servletContext = ServletActionContext.getServletContext();
			response.setContentType(servletContext.getMimeType(filename));
			//下载输出流
			workbook.write(response.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		//下载不需要页面跳转
		return NONE;
	}
3、在这里出现的一个问题是我设置的每页显示10行数据,导出来的数据也只有10行

//获取分页对象  接受页面的页码和每页显示记录
	protected int pageNum;//页码
	protected int pageSize = 10;//每页显示数量
	public void getPageNum(int pageNum){
		this.pageNum = pageNum;
	}
	public void getPageSize(int pageSize){
		this.pageSize = pageSize;
	}

4、为解决这个问题我采用的是输出文件前重新定义一个查询数据的页面设定,代码冗余了,但是问题可以解决,欢迎留言提出新的解决方案~~~

5、对于各个不同浏览器的文字编码不同,创建工具类

public class MyFileUtils {
	/**
	 * 下载文件时,针对不同浏览器,进行附件名的编码
	 * @param filename下载文件名
	 * @param agent客户端浏览器
	 * @return 编码后的下载附件名
	 * @throws IOException
	 */
	public static String encodeDownloadFilename(String filename, String agent) throws IOException {
		if (agent.contains("Firefox")) { // 火狐浏览器
			filename = "=?UTF-8?B?" + new BASE64Encoder().encode(filename.getBytes("utf-8")) + "?=";
			filename = filename.replaceAll("\r\n", "");
		} else { // IE及其他浏览器
			filename = URLEncoder.encode(filename, "utf-8");
			filename = filename.replace("+", " ");
		}
		return filename;
	}
}


  • 4
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值