批量上传下载-Mybatis

批量上传下载

依赖

 <!-- 下载 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
 <!-- 上传 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.9</version>
</dependency>

上传下载工具类ExcelUtil

pojo类需要改成自己要上传下载的pojo类

package com.haogu.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.haogu.config.ExcelDataListener;



import com.haogu.pojo.Test;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelUtil {
    public static void writeObjectsToExcel(List<Test> objects, String filePath, Class<?> clazz) {
        // 创建 Excel 写入器
        ExcelWriterBuilder writerBuilder = EasyExcel.write(filePath, clazz);

        // 写入数据到 Sheet1
        WriteSheet sheet = EasyExcel.writerSheet("Sheet1").build();
        writerBuilder.sheet().doWrite(objects);

        // 完成写入操作
//        writerBuilder.finish();
    }
    public static List<Test> readExcel(InputStream file) {
        List<Test> dataList = new ArrayList<>();
        // 读取Excel文件
        EasyExcel.read(file, Test.class, new ExcelDataListener(dataList)).sheet().doRead();
        return dataList;
    }
}

上传需要config加一个ExcelDataListener

pojo类需要改成自己要上传下载的pojo类

package com.haogu.config;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.haogu.pojo.Test;

import java.util.List;

public class ExcelDataListener extends AnalysisEventListener<Test> {

    private final List<Test> dataList;

    public ExcelDataListener(List<Test> dataList) {
        this.dataList = dataList;
    }

    @Override
    public void invoke(Test excelData, AnalysisContext analysisContext) {
        // 将解析的数据添加到列表中
        dataList.add(excelData);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 解析完成后执行的操作
    }
}

定义格式转换类TimestampStringConverter

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.DateUtils;

import java.sql.Timestamp;
import java.time.Instant;
import java.util.Date;

public class TimestampStringConverter implements Converter<Timestamp> {

    @Override
    public Class<?> supportJavaTypeKey() {
        return Timestamp.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    // 将excel文件中的对应数据(String)转换为Timestamp
    @Override
    public Timestamp convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return Timestamp.valueOf(cellData.getStringValue());
    }

    // 将Timestamp转换为excel文件中的对应数据(String)
    @Override
    public CellData convertToExcelData(Timestamp timestamp, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        CellData cellData = new CellData();
        String cellValue = DateUtils.format(new Date(timestamp.getTime()), "yyyy-MM-dd HH:mm:ss");
        cellData.setType(CellDataTypeEnum.STRING);
        cellData.setStringValue(cellValue);
        cellData.setData(cellValue);
        return cellData;
    }
}

实体类开启注解

使用 @ExcelProperty(converter = TimestampStringConverter.class) 代表该字段在读写excel文件时使用自定义转换器进行类型转换

@Data
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    
    
    /**
     * 创建时间
     */
    @ExcelProperty(converter = TimestampStringConverter.class)
    private Timestamp createTime;

    /**
     * 修改时间
     */
    @ExcelProperty(converter = TimestampStringConverter.class)
    private Timestamp updateTime;

}

以上内容上传下载共用,啥也不用说直接粘,以下开始分上传下载

下载(贼少,先写你)

直接写在下载的controller层

文件你得现在你写的位置上弄一个xls文件,如果你没有写的话会报错,这里是个需要优化的地方,但是我不会。

 @GetMapping
    public void saveObjectsToExcel(@RequestBody List<Test> objects, String filePath) {
        filePath = "D:/Se/workSpace7/1.xls";
        ExcelUtil.writeObjectsToExcel(objects, filePath, Test.class);
    }

然后你就写完下载接口了。牛逼不牛逼。

上传(这个得看你用的Mybatis是普通版还是plus版)

普通版

你得从mapper写一个批量添加方法,然后到service然后才能在controller层了

 @PostMapping("/upload")
    public String uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            // 保存上传的文件到临时目录
//            String tempPath = "temp/" + file.getOriginalFilename();
//            file.transferTo(new File(tempPath));

            // 解析Excel数据
            System.out.println(file.getOriginalFilename());
            List<User> dataList = ExcelUtil.readExcel(file.getInputStream());

            // 存储解析的数据到数据库
            userService.addAll(dataList);//这个你写成你自己的Service

            return "success";
        } else {
            return "error";
        }
    }
}

你可能到时候不会写xml,所以我给你粘贴了我的,你到时候改造改造


    <insert id="addAll">
        insert into `user` values
        <foreach collection="users"  separator="," item="user">
            (null, #{user.account}, default, #{user.uname}, #{user.idcode}, #{user.tel}, #{user.sex}, #{user.department},
            #{user.major}, #{user.year}, #{user.clazz}, default, #{user.work}, #{user.fieldwork}, now(), now())
        </foreach>
    </insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值