这是传统版本
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* @author : Edward_wei
* @data: 2021/6/19 12:33
* @classNam: DoExcel
* @description:
* @kit:jdk-1.8
*/
public class DoExcel {
public static<T> ByteArrayOutputStream makeExcel(Class<T> clazz, List<T> list, String sheetName) throws IllegalAccessException, IOException {
XSSFWorkbook sheets = new XSSFWorkbook();//创建一块工作空间,也就是一个表
XSSFSheet workerSheet = sheets.createSheet(sheetName);//创建一页
Field[] declaredFields = clazz.getDeclaredFields();//获得属性数组
int Fieldslength = declaredFields.length;//属性个数
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//设置行标题
XSSFRow titleRow = workerSheet.createRow(0);//第1行为标题
for (int i = 0; i < Fieldslength; i++) {
XSSFCell cell = titleRow.createCell(i);
cell.setCellValue(declaredFields[i].getName());
}
//设置表格内容
for (int i = 1; i <= list.size(); i++) {
XSSFRow row = workerSheet.createRow(i);//创建内容行
T obj = list.get(i - 1);//拿出改行的内容
for (int i1 = 0; i1 < Fieldslength; i1++) {
XSSFCell cell = row.createCell(i1);//创建该行的第x列
Field declaredField = declaredFields[i1];//拿到该列的属性
declaredField.setAccessible(true);//开放该列私有化权限
Object o = declaredField.get(obj);//反射拿到该对象对象属性的值
if (o instanceof Date) {
String format = simpleDateFormat.format(o);
cell.setCellValue(format);
}else {
cell.setCellValue(o != null?o.toString():"");//设置给该单元格
}
}
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
sheets.write(byteArrayOutputStream);
return byteArrayOutputStream;
}
}
利用easy Excel去操作更快更方便,详细还是得看官网,这是导出表格下载的controller模块
/**
* 文件下载(失败了会返回一个有部分数据的Excel)
* <p>
* 1. 创建excel对应的实体对象 参照{@link }
* <p>
* 2. 设置返回的 参数
* <p>
* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException, InstantiationException, IllegalAccessException {
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("员工信息表", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
//这里以上直接复制,改一下表名字
//查出信息
List<HolyAdmin> holyAdmins = adminService.queryAll();
List<AdminDTO> adminDTOS = EntityChangeUtil.toDTO(AdminDTO.class, holyAdmins);
adminDTOS.forEach(ad->{
try {
//设置图片
ad.setUrl(new URL(ad.getAdminAvater()));
String s = ad.getGender() == 1 ? "男" : ad.getGender() == 2 ? "不男不女" : "女人";
ad.setSexName(s);
} catch (MalformedURLException e) {
e.printStackTrace();
}
});
//上面的信息整成一个集合,放在dowrite中,怎么显示信息需要在实体类中设置并把class对象放进去
EasyExcel.write(response.getOutputStream(),AdminDTO.class).sheet("工农信息").doWrite(adminDTOS);
}
与之对应的实体类
package com.holy.cn.entity.DTO.system;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.holy.cn.entity.DTO.base.BaseDTO;
import lombok.Data;
import java.net.URL;
import java.util.List;
/**
* @author : Edward_wei
* @data: 2021/6/25 19:47
* @classNam: AdminDTO
* @description:
* @kit:jdk-1.8
*/
@Data
//这3就是设置宽高的
@ContentRowHeight(100)
@HeadRowHeight(40)
@ColumnWidth(25)
//这个是设置字体的
@ContentFontStyle(fontHeightInPoints = 20,fontName = "华文行楷")
public class AdminDTO extends BaseDTO {
@ExcelProperty("员工账户")
private String adminAccount;
@ExcelProperty("员工姓名")
private String adminName;
@ExcelIgnore
private Integer gender;
@ExcelProperty("手机号")
private String adminPhone;
@ExcelIgnore
private String adminAvater;
@ExcelProperty("邮箱")
private String adminEmail;
@ExcelProperty("是否激活")
private Boolean isActive;
@ExcelProperty("是否超管")
private Boolean isAdmin;
@ExcelProperty("员工身份证号")
private String adminIdNumber;
@ExcelProperty("员工地址")
private String adminAddress;
@ExcelProperty("员工薪资")
private Double adminSalary;
@ExcelIgnore
private List<Long> roleIds;
//图像和性别这种信息不能直接显示,所以要把上面的ignore掉,循环设置这里
//图片的话,base64就直接设置字符串convert,官网有,如果只是地址连接,需要URL对象
@ExcelProperty("性别")
private String sexName;
@ExcelProperty("头像")
private URL url;
}