Fork me on GitHub

Java 导出数据库数据到Excel表格中


1、需求

  • 将用户id、姓名及其各类型假期剩余天数导出到数据库中;
  • 将Excel文件命名为用户假期信息表-2019-06-10样式的,日期是当天日期;

1.1、设计导出文件外观

在这里插入图片描述

1.2、设计导出内容样式

在这里插入图片描述

前端的基本上不用写了,涉及到的关键点不算多从后台controller开始写;


2、控制层 Controller

2.1、exportHolidy方法

详细注解在代码中

@FbootApiButton(note = "导出")
	@RequiresPermissions("oa:userholidy:exportHolidy")
	@FbootLog(value = "导出员工假期数", module = "OaUserHolidy")
	@GetMapping("/exportHolidy")
	@ResponseBody
	public void exportHolidy(
		 	//从前台传递来的有用户姓名、性别、状态,这是为了方便查询导出对应人员的假期信息的
			@RequestParam("userName") String userName,
			@RequestParam("gender") Integer gender, 
			@RequestParam("status") Integer status,
			HttpServletResponse response
			) {
		OutputStream outputStream = null;
		try {
			@SuppressWarnings("resource")
			// 在此处创建wk,是excel的文档对象,用于接收service层处理后的数据;
			HSSFWorkbook wk = new HSSFWorkbook();
			// 创建一个查询参数对象,此对象代码如下UserHolidyParam 代码所示;
			UserHolidyParam param = new UserHolidyParam();
			// 将查询用户的查询条件参数放入到查询参数对象中
			param.setName(userName);
			param.setGender(gender);
			param.setStatus(status);
			// 调用service层的进一步处理方法,将查询参数对象以及response返回对象传递过去
			wk = this.service.exportAllHolidyInfo(response, param);
			// 给生成的Excel表格命名
			String str = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
			String name = "用户假期信息表-"+ str + ".xls";
			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/octet-stream;charset=utf-8");
			response.setHeader("Content-disposition", "attachment;filename=" + new String(name.getBytes(),"iso-8859-1"));// 默认Excel名称
			// 将返回对象中的需要输出的数据取出
			outputStream = response.getOutputStream();			
			// 使用write方法写入到Excel对象中去
			wk.write(outputStream);
			// 关闭Excel对象
			wk.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				outputStream.flush();
				outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


2.2、UserHolidyParam查询参数对象

此对象在controller层中用到过,主要是存放前台的查询条件参数的,主要就是几个属性,不需要过多的解释;

package cn.com.oa.leave.controller.vo;

/**
 * @Author : QTL
 * @Version: 2019年5月31日 上午9:26:22
 * @Descript: 用户假期 --- 查询VO
 * 
 */
public class UserHolidyParam implements java.io.Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 状态
	 */
	private Integer status;
	/**
	 * 性别
	 */
	private Integer gender;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public Integer getGender() {
		return gender;
	}
	public void setGender(Integer gender) {
		this.gender = gender;
	}
}


3、业务逻辑层Service

3.1、exportAllHolidyInfo方法

/**
	 * 用户假期 --- 导出
	 */
	@Override
	public HSSFWorkbook exportAllHolidyInfo(HttpServletResponse response, UserHolidyParam param) {
		// 调用Dao层,查询得到的相应人员的数据存到list集合对象中,由于查到的数据部是同
		// 一张表中的,比如用户姓名、id在用户表中,用户id与每种假期剩余天数在假期表中,
		// 因此需要一个接收对象(ExportHolidyVo)来更方便的接收这一堆数据,接收对象具
		// 体代码请看下面的ExportHolidyVo对象代码
		List<ExportHolidyVo> exportDate = this.holidyDao.exportAllHolidyInfo(param);
		// 创建excel对象
		HSSFWorkbook wk = new HSSFWorkbook();
		// 创建一张用户假期信息表
		HSSFSheet sheet = wk.createSheet("用户假期信息表");
		// 创建第一行
		HSSFRow largeTitle = sheet.createRow(0);
		// 创建第一行的第一个单元格
		HSSFCell cell = largeTitle.createCell(0);
		// 合并单元格CellRangeAddress构造参数依次表示起始行,截止行,起始列,截至列。
		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 9));
		// 向处理好的单元格中写入大标题
		cell.setCellValue("用户假期信息");
		
		// 创建第二行:第二行是写各个列的小标题的;
		HSSFRow smallTitle = sheet.createRow(1);
		// 设置表格填充(默认列宽为15个字节)
		smallTitle.createCell(0).setCellValue("用户ID");
		smallTitle.createCell(1).setCellValue("用户名称");
		smallTitle.createCell(2).setCellValue("年假");
		smallTitle.createCell(3).setCellValue("事假");
		smallTitle.createCell(4).setCellValue("病假");
		smallTitle.createCell(5).setCellValue("婚假");
		smallTitle.createCell(6).setCellValue("产假");
		smallTitle.createCell(7).setCellValue("陪产假");
		smallTitle.createCell(8).setCellValue("丧假");
		smallTitle.createCell(9).setCellValue("弹性假期");
		// 判断查询到的数据集合是否为控
		if (!exportDate.isEmpty()) {
			// 不为空的话则开始循环集合中的每个元素,并将元素中的每一个子元素定位到相应的单元格中
			for (int i = 0; i < exportDate.size(); i++) {
				// i+2的原因在在于大标题和小标题均占用了一行,自能从第三行开始,另,Excel对象的行、列索引均是从0开始,计算时小心
				HSSFRow row = sheet.createRow(i + 2);
				// row.createCell(x)以为将row对象的这一行的第x列上使用setCellValue()方法放入对象的数据
				// 下面一行中.setCellValue()方法中我拼接的有"'",是因此行放入的是用户的id,20位长的数
				// 字串,但是Excel表格中对于过长的数字串会进行处理,展示为一种计算式类型的,若想保
				// 持原数据不变,在原数据前加上英文的单引号即可
				row.createCell(0).setCellValue("'" + exportDate.get(i).getId().toString());
				row.createCell(1).setCellValue(exportDate.get(i).getName());
				row.createCell(2).setCellValue(exportDate.get(i).getAnnualLeave());
				row.createCell(3).setCellValue(exportDate.get(i).getLeaveForReasons());
				row.createCell(4).setCellValue(exportDate.get(i).getSickLeave());
				row.createCell(5).setCellValue(exportDate.get(i).getMarriageHoliday());
				row.createCell(6).setCellValue(exportDate.get(i).getMaternityLeave());
				row.createCell(7).setCellValue(exportDate.get(i).getPaternityLeave());
				row.createCell(8).setCellValue(exportDate.get(i).getFuneralLeave());
				row.createCell(9).setCellValue(exportDate.get(i).getFlexibleVacation());
			}
		}
		// 无论是否进行装载,均要返回一个Excel对象(下载Excel模板的时候使用起来很方便)
		return wk;
	}


3.2、ExportHolidyVo 查询结果接收对象

package cn.com.oa.leave.controller.vo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

/**
 * @Author : QTL
 * @Version: 2019年6月3日 下午5:06:18
 * @Descript: 用户假期信息导出
 * 
 */
public class ExportHolidyVo implements java.io.Serializable{

	private static final long serialVersionUID = 1L;
	
	@TableId(type = IdType.ID_WORKER)
	private Long id;
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 年假
	 */
	private Float annualLeave;
	/**
	 * 事假
	 */
	private Float leaveForReasons;
	/**
	 * 病假
	 */
	private Float sickLeave;
	/**
	 * 婚假
	 */
	private Float marriageHoliday;
	/**
	 * 产假
	 */
	private Float maternityLeave;
	/**
	 * 陪产假
	 */
	private Float paternityLeave;
	/**
	 * 丧假
	 */
	private Float funeralLeave;
	/**
	 * 弹性假期
	 */
	private Float flexibleVacation;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Float getAnnualLeave() {
		return annualLeave;
	}
	public void setAnnualLeave(Float annualLeave) {
		this.annualLeave = annualLeave;
	}
	public Float getLeaveForReasons() {
		return leaveForReasons;
	}
	public void setLeaveForReasons(Float leaveForReasons) {
		this.leaveForReasons = leaveForReasons;
	}
	public Float getSickLeave() {
		return sickLeave;
	}
	public void setSickLeave(Float sickLeave) {
		this.sickLeave = sickLeave;
	}
	public Float getMarriageHoliday() {
		return marriageHoliday;
	}
	public void setMarriageHoliday(Float marriageHoliday) {
		this.marriageHoliday = marriageHoliday;
	}
	public Float getMaternityLeave() {
		return maternityLeave;
	}
	public void setMaternityLeave(Float maternityLeave) {
		this.maternityLeave = maternityLeave;
	}
	public Float getPaternityLeave() {
		return paternityLeave;
	}
	public void setPaternityLeave(Float paternityLeave) {
		this.paternityLeave = paternityLeave;
	}
	public Float getFuneralLeave() {
		return funeralLeave;
	}
	public void setFuneralLeave(Float funeralLeave) {
		this.funeralLeave = funeralLeave;
	}
	public Float getFlexibleVacation() {
		return flexibleVacation;
	}
	public void setFlexibleVacation(Float flexibleVacation) {
		this.flexibleVacation = flexibleVacation;
	}
}

再往后的Dao层数据库查询什么的就不再写了,写这个主要是为了记录如何就查出数据与Excel对象像结合的一个过程;


pass:肯定还有更为便捷高效的方法,希望大家多加指正!


《END》

posted @ 2019-06-18 13:06  90后程序猿  阅读(451)  评论(0)    收藏  举报
/* 看板娘 */