@excel注解_基于注解封装POI实现Excel的导入导出

一.引入MAVEN依赖

这里主要使用poi-ooxml,lombok和commons-lang3

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

二.自定义注解

1.ExcelColumn注解

ExcelColumn主要用来标记Excel的数据字段的一些信息

@Documented
@Target({
    ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelColumn {
    

    /**
     * 标题
     *
     * @return
     */
    String title();

    /**
     * 下标
     *
     * @return
     */
    int index() default 0;

    /**
     * 标题行坐标
     *
     * @return
     */
    int rowIndex() default 0;

    /**
     * 类型
     *
     * @return
     */
    ExcelType type() default ExcelType.STRING;

    /**
     * 格式
     *
     * @return
     */
    String format() default "";
}

2.ExcelSheet 注解

ExcelSheet注解用来描述Excel中工作簿的一些信息

@Documented
@Target({
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelSheet {
    

    /**
     * Sheet 标题
     *
     * @return
     */
    String title() default "";

    /**
     * Sheet下标
     *
     * @return
     */
    int index() default 0;
}

3.ExcelTemplate注解

ExcelTemplate注解用来工作簿中的一些标题信息和表头信息,用来处理一些导出时需要用的双表头或者需要给工作表添加标题的场合.

@Documented
@Target({
    ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelTemplate {
    

    /**
     * 单元格内的值
     *
     * @return
     */
    String value() default "";

    /**
     * 合并行的数量
     *
     * @return
     */
    int rowspan() default 0;

    /**
     * 起始列
     *
     * @return
     */
    int colIndex();

    /**
     * 列合并的数量
     *
     * @return
     */
    int colspan() default 0;
}

三.自定义类型

这里定义一个枚举类型的类,用来标记导出时每个字段的类型,这里和ExcelColumn配合使用

public enum ExcelType {
    
    STRING,
    DOUBLE,
    INT,
    DECIMAL,
    DATE,
    LOCAL_DATE,
    LOCAL_DATE_TIME,
    LOCAL_TIME;
}

四.导入导出工具类

1.导出数据模型

ExcelData用于存放导出数据,fileName用来存放要导出Excel文件的文件名,data用来存放导出到Excel的数据

@Data
public class ExcelData<T> {
    
    private String fileName;
    private List<T> data;
}

2.工具类

@Slf4j
@UtilityClass
public class ExcelUtils {
    

    /**
     * xls 后缀
     */
    private final String XLS = ".xls";
    /**
     * xlsx 后缀
     */
    private final String XLS_X = ".xlsx";

    /**
     * sheet页的第一行
     */
    private final int FIRST_ROW = 0;

    /**
     * 第一个工作簿
     */
    private final int FIRST_SHEET = 0;

    /**
     * sheet页的第一列
     */
    private final int FIRST_COL = 0;

    /**
     * 科学计数
     */
    private final static String E = "e";

    private final String TIMEF_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private final String DATE_FORMAT = "yyyy-MM-dd";

    public <T> List<T> importExcel(MultipartFile file, Class<T> clazz) {
    
        checkFile(file);
        Workbook workbook = getWorkBook(file);
        List<T> list = new ArrayList<T>();
        Field[] fields = getFields(clazz);
        if (Objects.nonNull(workbook)) {
    
            Sheet sheet = getSheet(workbook, clazz);
            if (sheet == null || sheet.getLastRowNum() == 0) {
    
                return list;
            }
            // 获得当前sheet的开始行
            int firstRowNum = sheet.getFirstRowNum();
            // 获得当前sheet的结束行
            int lastRowNum = sheet.getLastRowNum();
            for (int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++) {
    
                // 获得当前行
                Row row = sheet.getRow(rowNum);
                if (row == null) {
    
                    continue;
                }
                Object obj;
                try {
    
                    obj = clazz.newInstance();
                } catch (IllegalAccessException e) {
    
                    log.error("【excel导入】clazz映射地址:{},{}", clazz.getCanonicalName(), "excel导入异常!");
                    throw new RuntimeException("excel导入异常", e);
                } catch (InstantiationException e) {
    
              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种方式来实现Excel导入导出,下面介绍两种常用的方式: 1. 使用Apache POI Apache POI是一个开源的Java API,可以处理Microsoft Office格式的文件,包括Excel。使用POI可以方便地读写Excel文件。 示例代码: //导入Excel文件 FileInputStream fis = new FileInputStream(new File("文件路径")); Workbook workbook = new XSSFWorkbook(fis); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { //读取单元格数据 } } //导出Excel文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("表格名称"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("单元格数据"); FileOutputStream fos = new FileOutputStream(new File("文件路径")); workbook.write(fos); 2. 使用EasyExcel EasyExcel是一个基于POI封装的Java库,可以简化Excel导入导出操作。它提供了一系列的注解来定义Excel文件的格式。 示例代码: //导入Excel文件 EasyExcel.read("文件路径", 数据类.class, new ReadListener<数据类>() { @Override public void onException(Exception e) { //读取异常处理 } @Override public void onRead(List<数据类> data) { //读取数据处理 } }).sheet().doRead(); //导出Excel文件 EasyExcel.write("文件路径", 数据类.class).sheet("表格名称").doWrite(数据列表); 其中,数据类是自定义的Java类,注解可以用来定义Excel文件的格式,数据列表是要导出的数据列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值