二、 EasyExcel 文件模板 - 数据的导入/导出

二、 EasyExcel 文件模板 - 数据的导入/导出

为了满足业务需要,我们大多都自行封装对应的工具类,废话不多说,直接进入正篇。

1. 定义Excel的默认列宽

package com.rocia.entity.export;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;

import java.util.List;

public class CellStyle extends AbstractColumnWidthStyleStrategy {
   
   

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head,
                                  Integer relativeRowIndex, Boolean isHead) {
   
   
        // 简单设置
        Sheet sheet = writeSheetHolder.getSheet();
        sheet.setColumnWidth(cell.getColumnIndex(), 5000);
    }

}

2. 定义动态表头实体

package com.rocia.entity.export;

import java.util.List;

public class DynamicHeader {
   
   

    private String fieldName;

    private String headName;

    private List<DynamicHeader> children;

    public DynamicHeader() {
   
   
    }

    public DynamicHeader(String fieldName, String headName) {
   
   
        this.fieldName = fieldName;
        this.headName = headName;
    }



    public String getFieldName() {
   
   
        return fieldName;
    }

    public void setFieldName(String fieldName) {
   
   
        this.fieldName = fieldName;
    }

    public String getHeadName() {
   
   
        return headName;
    }

    public void setHeadName(String headName) {
   
   
        this.headName = headName;
    }

    public List<DynamicHeader> getChildren() {
   
   
        return children;
    }

    public void setChildren(List<DynamicHeader> children) {
   
   
        this.children = children;
    }
}

3. 自定义表头中内容的样式等设置项

package com.rocia.handler;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

public class CustomTitleWriteHandler implements SheetWriteHandler {
   
   
    /**
     * 标题
     */
    private final String fileName;

    /**
     * 字段个数
     */
    private final Integer count;

    public CustomTitleWriteHandler(Integer count, String fileName) {
   
   
        this.fileName = fileName;
        this.count = count;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
   
   

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
   
   
        // 获取clazz所有的属性
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);
        Row row1 = sheet.createRow(0);
        row1.setHeight((short) 800);
        Cell cell = row1.createCell(0);
        //设置标题
        cell.setCellValue(fileName);
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeight((short) 400);
        font.setFontName("宋体");
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
        CellRangeAddress region = new CellRangeAddress(0, 0, 0, count - 1);
        setRegionStyle(sheet, region, cellStyle);
        sheet.addMergedRegion(region);
    }

    /**
     * 为合并的单元格设置样式(可根据需要自行调整)
     */
    public 
### 使用 EasyExcel 实现 Spring Boot 中的数据导入导出 #### 准备工作 为了在 Spring Boot 应用程序中使用 EasyExcel 进行 Excel 文件导入导出操作,首先需要引入依赖项。可以在 `pom.xml` 文件中添加如下 Maven 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> ``` #### 创建实体类 定义用于映射 Excel 表格列到 Java 对象属性的实体类。假设有一个简单的用户表单,包含姓名、年龄两个字段。 ```java import com.alibaba.excel.annotation.ExcelProperty; public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // Getters and Setters... } ``` #### 编写控制器方法处理文件上传下载请求 编写 RESTful API 来接收客户端发送过来待解析或生成的目标文件流并返回相应结果给前端页面展示。 ##### 导入功能实现 创建一个接口来接受 HTTP POST 请求携带 multipart/form-data 类型参数即要读取解析成对象列表形式存储于数据库中的 excel 文档实例化监听器完成批量保存逻辑[^1] ```java @PostMapping("/upload") public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file){ try{ EasyExcel.read(file.getInputStream(),User.class,new PageDataListener<User>()) .sheet() .doRead(); return new ResponseEntity<>("success", HttpStatus.OK); }catch(Exception e){ log.error(e.getMessage()); return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR); } } // 自定义监听器继承 AnalysisEventListener 接口重载 invoke 方法内调用 service 层业务逻辑存入 DB class PageDataListener<T> extends AnalysisEventListener<T>{ ... } ``` ##### 导出功能实现 同样构建一个新的 GET 路径映射函数响应浏览器端发起获取资源命令时触发服务端组装好目标格式文档并通过 HttpServletResponse 输出流向外部提供下载链接的方式分发出去 ```java @GetMapping("/download") public void download(HttpServletResponse response)throws IOException{ // 设置响应头信息指定附件名称以及 MIME 类型以便正确识别打开方式 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("users","UTF-8").replaceAll("\\+"," "); response.setHeader("Content-disposition","attachment;filename*=utf-8''"+fileName+".xlsx"); List<User> list = userService.getAllUsers(); EasyExcel.write(response.getOutputStream(),User.class).sheet("模板") .doWrite(list); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值