controller层接收文件信息,其中dataset参数为我的关联信息,实际情况自行修改
@PostMapping("/importExcel/{dataset}")
public AjaxResult importExcel(MultipartFile file, @PathVariable("dataset") String dataset) {
return sysDataService.importExcel(file, dataset);
}
sevince层,业务代码
@Override
public AjaxResult importExcel(MultipartFile file,String dataset) {
try{
//属性项
InputStream fileInputStream = file.getInputStream();
byte[] stream = IoUtils.toByteArray(fileInputStream);
List<Map<String, String>> dataList = DynamicEasyExcelImportUtils.parseExcelToView(stream, 1,dataset);//获取提交的数据,并转成list
List<String> keys = new ArrayList<>();//数据库中对应的表字段,exel模板的表头必须与数据库表字段对应
for(int i=0;i<dataList.size();i++){
Map<String,String> map = dataList.get(i);
map.forEach((key,value)-> {
keys.add(key);
});
break;
}
//解析数据插入数据库,业务代码自行修改
int batchSize =1000;
if(dataList.size()>1000){
for(int i= 0;i < dataList.size() / batchSize;i++){
sysDataMapper.insertSysDataByExcel(dataList.subList(i*batchSize, (i+1)*batchSize),keys);
}
if(dataList.size() % batchSize != 0){
sysDataMapper.insertSysDataByExcel(dataList.subList((dataList.size() / batchSize) * batchSize, dataList.size()),keys);
}else{
System.out.println("正好整批处理成功");
}
}else {
sysDataMapper.insertSysDataByExcel(dataList,keys);
}
fileInputStream.close();
}catch (Exception e){
e.printStackTrace();
}
return AjaxResult.success();
}
DynamicEasyExcelImportUtils.java
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.util.IoUtils;
import com.google.common.collect.Lists;
import com.kiz.common.Listener.DynamicEasyExcelListener;
import com.kiz.common.utils.uuid.UUID;
import org.apache.commons.collections4.CollectionUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
public class DynamicEasyExcelImportUtils {
/**
* 动态获取全部列和数据体,默认从第一行开始解析数据
*
* @param stream
* @return
*/
/*public static List<Map<String, String>> parseExcelToView(byte[] stream) {
return parseExcelToView(stream, 1);
}*/
/**
* 动态获取全部列和数据体
*
* @param stream excel文件流
* @param parseRowNumber 指定读取行
* @return
*/
public static List<Map<String, String>> parseExcelToView(byte[] stream, Integer parseRowNumber,String dataset) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.read(new ByteArrayInputStream(stream)).registerReadListener(readListener).headRowNumber(parseRowNumber).sheet(0).doRead();
List<Map<Integer, String>> headList = readListener.getHeadList();
if (CollectionUtils.isEmpty(headList)) {
throw new RuntimeException("Excel未包含表头");
}
List<Map<Integer, String>> dataList = readListener.getDataList();
if (CollectionUtils.isEmpty(dataList)) {
throw new RuntimeException("Excel未包含数据");
}
//获取头部,取最后一次解析的列头数据
Map<Integer, String> excelHeadIdxNameMap = headList.get(headList.size() - 1);
//封装数据体
List<Map<String, String>> excelDataList = Lists.newArrayList();
for (Map<Integer, String> dataRow : dataList) {
Map<String, String> rowData = new LinkedHashMap<>();
excelHeadIdxNameMap.entrySet().forEach(columnHead -> {
if(columnHead.getValue().equals("species")){
rowData.put("\""+columnHead.getValue()+"\"", LatinNameUtils.getLatinShort(dataRow.get(columnHead.getKey())));
}else {
rowData.put("\""+columnHead.getValue()+"\"", dataRow.get(columnHead.getKey()));
}
});
rowData.put("\""+"id"+"\"", UUID.getUUID());
rowData.put("\""+"del_flag"+"\"", "0");
rowData.put("\""+"mate_data_id"+"\"", dataset);
rowData.put("\""+"create_time"+"\"", new SimpleDateFormat("YYYY-MM-dd").format(new Date()));
rowData.put("\""+"create_by"+"\"", SecurityUtils.getUsername());
excelDataList.add(rowData);
}
return excelDataList;
}
/**
* 文件导入测试
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//属性项
/*FileInputStream inputStream = new FileInputStream(new File("C:/Users/lenovo/Desktop/data_1690421686799.xlsx"));
byte[] stream = IoUtils.toByteArray(inputStream);
List<Map<String, String>> dataList = parseExcelToView(stream, 1);
List<String> objects = new ArrayList<>();
dataList.forEach(d -> {
objects.addAll(d.keySet());
});
System.out.println("属性项:" + objects);
System.out.println("值:" + dataList);
inputStream.close();*/
}
}
DynamicEasyExcelListener.java
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DynamicEasyExcelListener extends AnalysisEventListener<Map<Integer, String>> {
/**
* 表头数据(存储所有的表头数据)
*/
private List<Map<Integer, String>> headList = new ArrayList<>();
/**
* 数据体
*/
private List<Map<Integer, String>> dataList = new ArrayList<>();
/**
* 这里会一行行的返回头
*
* @param headMap
* @param context
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//存储全部表头数据
headList.add(headMap);
}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* @param context
*/
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
dataList.add(data);
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
}
public List<Map<Integer, String>> getHeadList() {
return headList;
}
public List<Map<Integer, String>> getDataList() {
return dataList;
}
}
mapper.xml
<insert id="insertSysDataByExcel" >
insert into sys_data
<foreach item="key" collection="keys" open="(" separator="," close=")">
${key}
</foreach>
values
<foreach item="item" index="index" collection="dataList" open="" separator="," close="">
<foreach collection="item" index="key" item="value" open="(" separator="," close=")">
#{value}
</foreach>
</foreach>
</insert>