批量上传下载
依赖
<!-- 下载 -->
<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>