Java 导出数据库数据到Excel表格中
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:肯定还有更为便捷高效的方法,希望大家多加指正!

浙公网安备 33010602011771号