`
<!-- Hutool引入maven依賴-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
`
`
package com.yoyo.excel.vo;
import cn.hutool.core.annotation.Alias;
import java.io.Serializable;
public class StudentVo implements Serializable {
/**
* @Alias("")
* 此注解為hutool用注解,效果是生成表頭
* 但是請注意!
* 此注解於ExcelWriter.addHeaderAlias("sex", "性別 ");沖突只能選用其一
*/
private String name;
/**
* @Alias("年齡")
*/
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
/**
* 為了測試效果,線上可以不加
*/
public String toString() {
return "StudentVo{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
/**
* 下面全部為建造者模式代碼
* @param builder
*/
public StudentVo(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.sex = builder.sex;
}
public static Builder newBuilder () {
return new Builder();
}
public static final class Builder {
private String name;
private Integer age;
private String sex;
private Builder() {
}
public Builder name(String val) {
this.name = val;
return this;
}
public Builder age(Integer val) {
this.age = val;
return this;
}
public Builder sex(String val) {
this.sex = val;
return this;
}
public StudentVo builder() {
return new StudentVo(this);
}
}
}
package com.yoyo.excel.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import com.yoyo.excel.vo.StudentVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping(value = "/hutool")
public class HutoolController {
@Autowired
private static final Logger log = LoggerFactory.getLogger(HutoolController.class);
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void hutoolExcel(HttpServletResponse response) {
ExcelWriter ExcelWriter = ExcelUtil.getWriter("test.xls");
//設置表頭
ExcelWriter.addHeaderAlias("name", "名字");
ExcelWriter.addHeaderAlias("age", "年齡");
ExcelWriter.addHeaderAlias("sex", "性別 ");
//測試數據,使用建造者模式構造
StudentVo studentVo1 = StudentVo.newBuilder()
.name("張三")
.age(18)
.sex("男")
.builder();
StudentVo studentVo2 = StudentVo.newBuilder()
.name("李四")
.age(19)
.sex("男")
.builder();
StudentVo studentVo3 = StudentVo.newBuilder()
.name("王五")
.age(20)
.sex("女")
.builder();
StudentVo studentVo4 = StudentVo.newBuilder()
.name("趙六")
.age(21)
.sex("女")
.builder();
List<StudentVo> rows = CollUtil.newArrayList(studentVo1, studentVo2, studentVo3, studentVo4);
rows.forEach(x->{
log.info("對象 {}", x.toString());
});
log.info("准備生成Excel {}",ExcelWriter.getRowCount());
ExcelWriter.write(rows, true);
log.info("生成完畢 准備輸出");
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + "test" + ".xls");
try {
ServletOutputStream out = response.getOutputStream();
ExcelWriter.flush(out, true);
ExcelWriter.close();
IoUtil.close(out);
} catch (IOException e) {
log.error("發生異常 異常原因:{} {}", e.getMessage(), e);
} catch (Exception j) {
log.error("發生異常 異常原因:{} {}", j.getMessage(), j);
}
}
}
`
例如:
@GetMapping(value = "/getCapitalOrderListDtoDownload")
public void getCapitalOrderListDtoDownload(HttpServletResponse response,
@RequestParam(value = "supplierId") Long supplierId,
@ApiParam(name = "orderType", value = "訂單類型(-1全部 0自營,1分銷,2,免單,3直播訂單)")
@RequestParam(value = "orderType", required = false) Integer orderType,
@RequestParam(required = false, value = "startTime") String startDate,
@RequestParam(required = false, value = "endTime") String endDate,
@RequestParam(value = "name") String name) {
List<CapitalOrderResponse> employees0 = orderDetailService.getCapitalOrderListDtoDownLoad(supplierId, orderType, startDate, endDate, name,1,10000);
List<CapitalOrderResponseV2> employees=new ArrayList<>();
if(CollUtil.isNotEmpty(employees0)){
for (CapitalOrderResponse item :employees0){
CapitalOrderResponseV2 model=new CapitalOrderResponseV2();
model.setAgentName(item.getAgentName());
model.setOrderNo(item.getOrderNo());
model.setAmount(item.getAmount());
model.setAcceptedAmount(item.getAcceptedAmount());
model.setDueInAmount(item.getDueInAmount());
model.setCreateDate(DateUtil.formatDateTime(item.getCreateDate()));
model.setFinishTime(DateUtil.formatDateTime(item.getFinishTime()));
employees.add(model);
}
}
ExcelWriter writer = ExcelUtil.getWriter();
writer.addHeaderAlias("agentName", "店鋪名稱");
writer.addHeaderAlias("orderNo", "訂單號");
writer.addHeaderAlias("amount", "實付金額");
writer.addHeaderAlias("acceptedAmount", "已收金額");
writer.addHeaderAlias("dueInAmount", "待收金額");
writer.addHeaderAlias("createDate", "下單時間");
writer.addHeaderAlias("finishTime", "完成時間");
writer.write(employees, true);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
String namettt = "zijintongji";
response.setHeader("Content-Disposition", "attachment;filename=" + namettt + ".xls");
ServletOutputStream out = null;
try {
out = response.getOutputStream();
writer.flush(out, true);
} catch (IOException e) {
e.printStackTrace();
} finally {
writer.close();
}
IoUtil.close(out);
}
//二次優化后的接口,使代碼看起來更簡潔
@GetMapping("/getMembershipLevelListDownload")
@ApiOperation(value = "多條件查詢會員列表", response = MemberInfoDto.class)
public void getMembershipLevelListDownload(HttpServletResponse response,
@RequestParam(required = false) @ApiParam(name = "beginTime", value = "注冊開始時間") String beginTime,
@RequestParam(required = false) @ApiParam(name = "endTime", value = "注冊結束時間") String endTime,
@RequestParam(required = false) @ApiParam(name = "certificationStatus", value = "實名認證狀態(0:未認證,1:已認證)") Integer certificationStatus,
@RequestParam(required = false) @ApiParam(name = "status", value = "會員狀態:0:正常,1:凍結,2:拉黑") Integer status,
@RequestParam(required = false) @ApiParam(name = "grade", value = "等級名稱") String grade,
@RequestParam(required = false) @ApiParam(name = "address", value = "地區") String address,
@RequestParam(required = false) @ApiParam(name = "userType", value = "會員類型") String userType,
@RequestParam(required = false) @ApiParam(name = "keyWords", value = "搜索關鍵詞") String keyWords,
@RequestParam(required = false) @ApiParam(name = "page", value = "當前頁", defaultValue = "1") Integer page,
@RequestParam(required = false) @ApiParam(name = "pageSize", value = "每頁條數", defaultValue = "10") Integer pageSize
) {
try {
Page<MemberInfoDto> list = tbUserInfoService.getMembershipLevelList(beginTime, endTime, certificationStatus, status, grade, address, userType, keyWords, page, pageSize);
List<MemberInfoDto> memberInfoDtoList = list.getRecords();
//此處為需要下載字段的對象二次封裝,和原對象完全一致可以跳過這一步
List<MemberInfoDownload> dataList = new ArrayList();
for(MemberInfoDto m : memberInfoDtoList ){
MemberInfoDownload md = new MemberInfoDownload();
BeanUtils.copyProperties(m,md);
dataList.add(md);
}
String fileName = "huiyuan" +new SimpleDateFormat("yyyy-MM-dd").format(new Date());
ServletOutputStream out = response.getOutputStream();
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
List<String> header = CollUtil.newArrayList("用戶名稱", "真實姓名", "手機號", "身份證號",
"推薦人名稱", "會員狀態", "余額", "提現金額",
"消費金額","充值金額", "自營產品數", "分銷產品數",
"注冊時間","登錄時間", "最后一次登錄地址");
//isXlsx 是否為xlsx格式
ExcelWriter excelWriter = ExcelUtil.getWriter(true);
excelWriter.writeHeadRow(header);
excelWriter.write(getListRow(dataList));
excelWriter.flush(response.getOutputStream());
excelWriter.close();
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
private List<MemberInfoDownload> getListRow(List<MemberInfoDownload> memberInfoDtoList) {
List<MemberInfoDownload> rows = new ArrayList<>();
memberInfoDtoList.stream().forEach(md -> {
MemberInfoDownload me = new MemberInfoDownload();
BeanUtils.copyProperties(md,me);
rows.add(me);
});
return rows;
}
`