依赖导入
我使用的是2.2.7版本
springboot+vue(element-ui)
最底下贴一个poi3.17的导出
<!-- excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
实体类
包含许多注解:
@Data
@EqualsAndHashCode
@Accessors(chain = false)
@TableName("register")
public class Register implements Serializable {
private static final long serialVersionUID = 1L;
自动生成器生成,和导出无关
@TableField注解也是
@ExcelColumn注解:使用poi导出使用的自定义注解
@ColumnWidth(20)
设置导出单元格列宽(默认列宽8.43)
@Data
@EqualsAndHashCode
@Accessors(chain = false)
@TableName("register")
public class Register implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@ExcelIgnore
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 维修申请单id
*/
@ExcelProperty("维修申请单id")
@ExcelColumn("维修申请单id")
@TableField("note_id")
private Long noteId;
/**
* 故障表现
*/
@ColumnWidth(20)
@ExcelProperty("故障表现")
@ExcelColumn("故障表现")
@TableField("fault_behavior")
private String faultBehavior;
/**
* 维修方案
*/
@ColumnWidth(20)
@ExcelProperty("维修方案")
@ExcelColumn("维修方案")
@TableField("rep_plan")
private String repPlan;
/**
* 维修开始时间
*/
@ColumnWidth(20)
@ExcelProperty("维修开始时间")
@ExcelColumn("维修开始时间")
@TableField("rep_start_time")
private Date repStartTime;
/**
* 维修结束时间红灯结束时间
*/
@ColumnWidth(20)
@ExcelProperty("维修结束时间红灯结束时间")
@ExcelColumn("维修结束时间红灯结束时间")
@TableField("end_time")
private Date endTime;
/**
* 维修时间
*/
@ExcelIgnore
@TableField("rep_time")
private Long repTime;
/**
* 红灯开始时间
*/
@ColumnWidth(20)
@ExcelProperty("红灯开始时间")
@ExcelColumn("红灯开始时间")
@TableField("red_start_time")
private Date redStartTime;
/**
* 红灯时长
*/
@ExcelIgnore
@TableField("red_time")
private Long redTime;
/**
* 联系方式
*/
@ColumnWidth(20)
@ExcelProperty("联系方式")
@ExcelColumn("联系方式")
@TableField("phone")
private String phone;
/**
* 设备故障码
*/
@ExcelProperty("设备故障码")
@ExcelColumn("设备故障码")
@TableField("fault_code")
private String faultCode;
/**
* 用户id(技术工id)
*/
@ExcelProperty("用户id")
@ExcelColumn("用户id")
@TableField("sys_user_id")
private Long sysUserId;
/**
* 技术工姓名
*/
@ExcelProperty("技术工姓名")
@ExcelColumn("技术工姓名")
@TableField("sys_username")
private String sysUsername;
/**
* 逻辑删除
*/
@ExcelIgnore
@TableLogic
@TableField("`delete`")
private Integer delete;
/**
* 创建时间
*/
@ColumnWidth(20)
@ExcelProperty("创建时间")
@ExcelColumn("创建时间")
@TableField("create_time")
private Date createTime;
/**
* 修改时间
*/
@ExcelIgnore
@TableField("update_time")
private Date updateTime;
/**
* 创建者id
*/
@ExcelIgnore
@TableField("create_by")
private Long createBy;
/**
* 修改者id
*/
@ExcelIgnore
@TableField("update_by")
private Long updateBy;
/**
* mybatis的忽略这个字段
*/
@ColumnWidth(20)
@ExcelProperty("维修时间")
@ExcelColumn("维修时间")
@TableField(exist = false)
private String repTimeChar;
@ColumnWidth(20)
@ExcelProperty("红灯时长")
@ExcelColumn("红灯时长")
@TableField(exist = false)
private String redTimeChar;
}
后端代码control
纯导出不传值则@RequestParam Map<String, Object> params可不写
/**
* 根据时间导出,easyExcel
* @param response
* @param params 操作工,时间区间前后
* @throws Exception
*/
@RequestMapping("/outPutEasyExcel")
public void outPutEasyExcel(HttpServletResponse response,@RequestParam Map<String, Object> params) throws Exception {
// 这个是业务数据,根据你想查的数据传值查询
List<Register> registerList = registerService.listByUserId(params);
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("测试", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), Register.class).sheet("模板").doWrite(registerList);
}
前端代码
printHandle 是放在method里的方法(异步请求)
this.$http是封装的方法,可以使用axis,方法大差不差
<el-form
:inline="true"
:model="dataForm"
@keyup.enter.native="printHandle()"
>
<el-form-item>
<el-select
size="small"
v-model="userId"
placeholder="请选择维修工"
clearable=""
filterable
>
<el-option
v-for="d in users"
:key="d.userId"
:label="d.username"
:value="d.userId"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label=""
prop="start"
>
<el-date-picker
size="small"
v-model="start"
type="datetime"
placeholder="筛选开始时间"
value-format="yyyy-MM-dd HH:mm:ss"
>
</el-date-picker>
</el-form-item>
<el-form-item
label=""
prop="end"
>
<el-date-picker
size="small"
v-model="end"
type="datetime"
placeholder="筛选结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type="success"
round
@click="printHandle()"
>打印
</el-button>
</el-form-item>
</el-form>
放在method里的方法(异步请求)
this.$http是封装的方法,可以使用axis,方法大差不差
// 导出数据
printHandle () {
if (!this.start || !this.end) {
this.$message.error('请选择开始时间和结束时间')
} else if (this.start > this.end) {
this.$message.error('开始时间要小于结束时间')
} else {
this.$http({
url: this.$http.adornUrl('/register/outPutEasyExcel'),
method: 'get',
responseType: 'blob', // 指定响应类型为 blob,以便处理二进制数据
params: this.$http.adornParams({
'userId': !this.userId ? 0 : this.userId,
'start': this.start,
'end': this.end
})
}).then(({ data }) => {
// 创建一个新的 Blob 对象
const blob = new Blob([data], { type: 'application/vnd.ms-excel' })
// 创建一个 <a> 标签
const link = document.createElement('a')
// 设置下载的文件名
const fileName = '故障库.xlsx'
link.href = window.URL.createObjectURL(blob)
link.setAttribute('download', fileName)
link.download = fileName
document.body.appendChild(link)
// 模拟点击下载链接
link.click()
// 释放 URL 对象
window.URL.revokeObjectURL(link.href)
document.body.removeChild(link)
this.$message({
message: '操作成功',
type: 'success',
duration: 1500
})
})
}
},
poi3.17导出后端
前端用的同一个
/**
* 根据时间导出,poi3.17导出
* @param response
* @param params 操作工,时间区间前后
* @throws Exception
*/
@RequestMapping("/outPutExcel")
public void outPutExcel(HttpServletResponse response,@RequestParam Map<String, Object> params) throws Exception {
// 这个是业务数据
List<Register> tmps = registerService.listByUserId(params);
// 每次写100行数据,就刷新数据出缓存
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
Sheet sh = wb.createSheet("sheet1");
String[] titles = { "主键id", "维修申请单id" , "故障表现", "维修方案", "维修开始时间", "维修结束时间红灯结束时间", "维修时间", "红灯开始时间", "红灯时长", "设备故障码", "技术工姓名", "联系方式", "创建时间"};
Row row = sh.createRow(0);
// 第一行设置标题
for (int i = 0; i < titles.length; i++) {
String title = titles[i];
Cell cell1 = row.createCell(i);
cell1.setCellValue(title);
}
// 导出数据
for (int rowNum = 0; rowNum < tmps.size(); rowNum++) {
Row rowData = sh.createRow(rowNum + 1);
// 根据业务来进行填写数据
Register tmp = tmps.get(rowNum);
// 第一列
Cell cellDataA = rowData.createCell(0);
cellDataA.setCellValue(tmp.getId());
// 第二列
Cell cellDataB = rowData.createCell(1);
cellDataB.setCellValue(tmp.getNoteId());
Cell cellDataC = rowData.createCell(2);
cellDataC.setCellValue(tmp.getFaultBehavior());
Cell cellDataD = rowData.createCell(3);
cellDataD.setCellValue(tmp.getRepPlan());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Cell cellDataE = rowData.createCell(4);
if (null != tmp.getRepStartTime())
cellDataE.setCellValue(df.format(tmp.getRepStartTime()));
Cell cellDataF = rowData.createCell(5);
if (null != tmp.getEndTime())
cellDataF.setCellValue(df.format(tmp.getEndTime()));
Cell cellDataG = rowData.createCell(6);
cellDataG.setCellValue(tmp.getRepTimeChar());
Cell cellDataH = rowData.createCell(7);
if (null != tmp.getRedStartTime())
cellDataH.setCellValue(df.format(tmp.getRedStartTime()));
Cell cellDataI = rowData.createCell(8);
cellDataI.setCellValue(tmp.getRedTimeChar());
Cell cellDataJ = rowData.createCell(9);
cellDataJ.setCellValue(tmp.getFaultCode());
Cell cellDataK = rowData.createCell(10);
cellDataK.setCellValue(tmp.getSysUsername());
Cell cellDataL = rowData.createCell(11);
cellDataL.setCellValue(tmp.getPhone());
Cell cellDataM = rowData.createCell(12);
cellDataM.setCellValue(tmp.getCreateTime());
if (null != tmp.getCreateTime())
cellDataM.setCellValue(df.format(tmp.getCreateTime()));
}
String fileName = "文件名称.xlsx";
//这是导出xls格式
// response.setContentType("application/vnd.ms-excel");
//这是导出xlsx格式
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
wb.write(response.getOutputStream());
wb.close();
}