java一键生成Excel和easyExcel快速使用

本文介绍了使用Apache POI库的传统Excel操作方法,并对比了EasyExcel的高效API,展示了如何通过EasyExcel简化Excel导出和下载过程。着重讨论了EasyExcel在处理日期、图片和实体类注解上的优势。
摘要由CSDN通过智能技术生成

这是传统版本

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用EasyExcel生成Excel时,可以通过自定义Converter来限制日期格式。具体步骤如下: 1. 自定义日期转换器 ```java public class DateConverter implements Converter<Date> { private final SimpleDateFormat simpleDateFormat; public DateConverter(String format) { this.simpleDateFormat = new SimpleDateFormat(format); } @Override public Class supportJavaTypeKey() { return Date.class; } @Override public CellData convertToExcelData(Date value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData(simpleDateFormat.format(value)); } @Override public Date convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return simpleDateFormat.parse(cellData.getStringValue()); } } ``` 2. 在写入Excel时指定日期格式 ```java // 创建ExcelWriter对象 ExcelWriter excelWriter = EasyExcel.write(outputStream).build(); // 定义Sheet对象 Sheet sheet = new Sheet(1, 0); sheet.setSheetName("sheet1"); // 定义表头 List<List<String>> head = new ArrayList<>(); List<String> header = new ArrayList<>(); header.add("日期"); head.add(header); // 定义数据 List<Date> data = new ArrayList<>(); data.add(new Date()); // 设置日期格式 GlobalConfiguration configuration = new GlobalConfiguration(); configuration.getConverterMap().put(Date.class, new DateConverter("yyyy-MM-dd")); // 写入Excel excelWriter.write(data, sheet, new TableData(head, data), configuration); // 关闭ExcelWriter excelWriter.finish(); ``` 在上述代码中,我们通过自定义DateConverter来限制日期格式为"yyyy-MM-dd",并在写入Excel时通过GlobalConfiguration设置该转换器。这样就可以确保生成Excel中日期格式符合我们的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值