后端接口:
1.下载模版,模版包括三级联动选择
@PostMapping("/downloadClanMemberTemplate")
public void downloadClanMemberTemplate(HttpServletResponse response,String kinId) throws Exception {
if(StringUtils.isBlank(kinId)){
throw new ServiceException("参数 kinId 不能为空");
}
R<List<MingmenKin>> kinByKinIds = remoteAppUserService.getKinByKinIds(String.valueOf(kinId), SecurityConstants.INNER);
if(kinByKinIds.getCode() != R.SUCCESS){
throw new ServiceException("获取家族失败");
}
if(kinByKinIds.getData() == null || kinByKinIds.getData().isEmpty()){
throw new ServiceException("家族不存在");
}
// 准备数据
Map<String, List<String>> areaList = new LinkedHashMap<>();
//areaList.put("中国", Arrays.asList("北京", "上海", "广州"));
//areaList.put("美国", Arrays.asList("纽约", "洛杉矶"));
//areaList.put("日本", Arrays.asList("东京", "大阪"));
// 准备数据
Map<String, List<String>> areaList1 = new LinkedHashMap<>();
//areaList1.put("北京", Arrays.asList("北京1", "北京2"));
//areaList1.put("上海", Arrays.asList("上海1", "上海2", "上海3"));
//查询几世
List<Map<String,String>> list=new ArrayList<>();
//查询有无始祖
MmwzClanMember one = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).eq(MmwzClanMember::getEraNumber, 1).one();
if(one == null){
Map<String,String> map=new HashedMap<>();
map.put("eraNumber","1");
map.put("eraNumberName","始祖");
list.add(map);
}
MmwzClanMember eraNumberMax = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).isNotNull(MmwzClanMember::getEraNumber).orderByDesc(MmwzClanMember::getEraNumber)
.last("limit 0,1")
.one();
if(eraNumberMax != null){
NumberToChinese converter = new NumberToChinese();
//当前最大世数
Integer eraNumber = eraNumberMax.getEraNumber();
for(int i=2;i<=eraNumber+1;i++){
Map<String,String> map=new HashedMap<>();
map.put("eraNumber",i+"");
map.put("eraNumberName","第"+converter.convert(i)+"世");
list.add(map);
}
}
List<Map<String,String>> list2=new ArrayList<>();
for(Map<String,String> era : list){
String eraNumber = era.get("eraNumber");
String eraNumberName = era.get("eraNumberName");
List<MmwzClanMember> list1 = mmwzClanMemberService.lambdaQuery()
.select(MmwzClanMember::getName,MmwzClanMember::getId)
.eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getSex,0)
.eq(MmwzClanMember::getEraNumber, Integer.valueOf(eraNumber) - 1).list();
List<String> collect = list1.stream().map(m -> m.getName()).collect(Collectors.toList());
areaList.put(eraNumberName,collect);
for(MmwzClanMember mmwzClanMember:list1){
Map<String,String> map=new HashedMap<>();
map.put("id",String.valueOf(mmwzClanMember.getId()));
map.put("name",mmwzClanMember.getName());
list2.add(map);
}
}
for(Map<String,String> spouse:list2){
String id = spouse.get("id");
String name = spouse.get("name");
List<MmwzClanMember> list3 = mmwzClanMemberService.lambdaQuery()
.select(MmwzClanMember::getName,MmwzClanMember::getId)
.eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getPid,id)
.eq(MmwzClanMember::getPidRelationType, 0).list();
List<String> collect = list3.stream().map(m -> m.getName()).collect(Collectors.toList());
areaList1.put(name,collect);
}
//导出
ClassPathResource resource = new ClassPathResource("excelTemplate/clanMemberTemplate.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(resource.getStream());
// 获取所有名称
List<XSSFName> allNames = workbook.getAllNames();
for (int i = allNames.size() - 1; i >= 0; i--) {
Name name = allNames.get(i);
workbook.removeName(name); // 从后向前删除名称
}
XSSFSheet mainSheet = workbook.getSheet("Main");
// 创建隐藏 Sheet 用于存储数据
//XSSFSheet hiddenSheet = workbook.createSheet("HiddenData");
XSSFSheet hiddenSheet = workbook.getSheet("HiddenData");
// 保护工作表
hiddenSheet.protectSheet("jcd743001734"); // 设置保护密码
int rowIndex = 0;
for (Map.Entry<String, List<String>> entry : areaList.entrySet()) {
XSSFRow row = hiddenSheet.createRow(rowIndex++);
XSSFCell cell = row.createCell(0);
cell.setCellValue(entry.getKey());
for (int i = 0; i < entry.getValue().size(); i++) {
cell = row.createCell(i + 1);
cell.setCellValue(entry.getValue().get(i));
}
// 创建名称管理器
Name name = workbook.createName();
name.setNameName(entry.getKey());
name.setRefersToFormula("HiddenData!$" + (char) ('A' + 1) + "$" + rowIndex + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex);
}
// 创建隐藏 Sheet 用于存储数据
//XSSFSheet hiddenSheet2 = workbook.createSheet("HiddenData2");
XSSFSheet hiddenSheet2 = workbook.getSheet("HiddenData2");
// 保护工作表
hiddenSheet2.protectSheet("jcd743001734"); // 设置保护密码
int rowIndex2 = 0;
for (Map.Entry<String, List<String>> entry : areaList1.entrySet()) {
XSSFRow row = hiddenSheet2.createRow(rowIndex2++);
XSSFCell cell = row.createCell(0);
cell.setCellValue(entry.getKey());
for (int i = 0; i < entry.getValue().size(); i++) {
cell = row.createCell(i + 1);
cell.setCellValue(entry.getValue().get(i));
}
// 创建名称管理器
Name name = workbook.createName();
name.setNameName(entry.getKey());
name.setRefersToFormula("HiddenData2!$" + (char) ('A' + 1) + "$" + rowIndex2 + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex2);
}
// 设置一级下拉菜单
DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();
DataValidationConstraint constraint = dvHelper.createFormulaListConstraint("HiddenData!$A$1:$A$" + rowIndex);
CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0, 0); // A1:A101
DataValidation validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
// 设置二级下拉菜单
for (int i = 1; i <= 100; i++) {
constraint = dvHelper.createFormulaListConstraint("INDIRECT($A$" + i + ")");
addressList = new CellRangeAddressList(i , i, 1, 1); // B1:B101
validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
}
// 设置三级下拉菜单
for (int i = 1; i <= 100; i++) {
constraint = dvHelper.createFormulaListConstraint("INDIRECT($B$" + i + ")");
addressList = new CellRangeAddressList(i, i, 2, 2); // B1:B101
validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
}
// 一次性写出内容,使用默认样式,强制输出标题
//bigExcelWriter.write(list2);
//response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;filename=clanMemberTemplate.xlsx");
ServletOutputStream out=response.getOutputStream();
// 终止后删除临时文件
//file.deleteOnExit();
workbook.write(out);
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
2.导入接口,包含导入失败的数据在下载下来,修改后重新导入
@PostMapping("/importClanMember")
public void importOwnerAndHouse(MultipartFile file, HttpServletResponse response,@RequestPart(value = "kinId") String kinId) throws Exception {
//String kinId = (String)formData.get("kinId");
if(StringUtils.isBlank(kinId)){
throw new ServiceException("参数 kinId 不能为空");
}
R<List<MingmenKin>> kinByKinIds = remoteAppUserService.getKinByKinIds(String.valueOf(kinId), SecurityConstants.INNER);
if(kinByKinIds.getCode() != R.SUCCESS){
throw new ServiceException("获取家族失败");
}
if(kinByKinIds.getData() == null || kinByKinIds.getData().isEmpty()){
throw new ServiceException("家族不存在");
}
ExcelReader reader = cn.hutool.poi.excel.ExcelUtil.getReader(file.getInputStream());
List<Sheet> sheets = reader.getSheets();
Sheet rows = sheets.get(0);
List<Map<String, String>> sheetData = ImportExcelUtil.getSheetData(rows);
List<ImportClanMemberDto> list1=new ArrayList<>();
for(Map<String, String> map:sheetData){
ImportClanMemberDto dto=new ImportClanMemberDto();
dto.setEraNumberName(map.get("第几世"));
dto.setPName(map.get("父亲"));
dto.setMotherName(map.get("母亲"));
dto.setSexName(map.get("性别"));
dto.setName(map.get("姓名"));
dto.setRanking(Integer.valueOf(map.get("排行")));
dto.setIntroduction(map.get("简介"));
dto.setIsMarriedName(map.get("婚否"));
dto.setSpouseNames(map.get("配偶姓名"));
list1.add(dto);
}
List<ImportClanMemberDto> failList=new ArrayList<>();
List<ImportClanMemberDto> okList=new ArrayList<>();
for (ImportClanMemberDto dto:list1){
if(StringUtils.isBlank(dto.getEraNumberName())){
dto.setImportFailReason("第几世 不能为空");
failList.add(dto);
continue;
}else{
String replace = dto.getEraNumberName().replace("第", "").replace("世", "");
int i = NumberToChinese.chineseToNumber(replace);
dto.setEraNumber(i);
}
if(StringUtils.isBlank(dto.getPName())){
dto.setImportFailReason("父亲 不能为空");
failList.add(dto);
continue;
}else {
List<MmwzClanMember> list = mmwzClanMemberService.lambdaQuery()
.eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getEraNumber, dto.getEraNumber()-1)
.eq(MmwzClanMember::getName, dto.getPName()).list();
if(list.size() != 1){
dto.setImportFailReason("查询父亲结果数不为1");
failList.add(dto);
continue;
}
dto.setPid(list.get(0).getId());
}
if(StringUtils.isBlank(dto.getMotherName())){
dto.setImportFailReason("母亲 不能为空");
failList.add(dto);
continue;
}else{
List<MmwzClanMember> list2 = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getPid, dto.getPid())
.eq(MmwzClanMember::getPidRelationType, 0)
.eq(MmwzClanMember::getName, dto.getMotherName())
.list();
if(list2.size() != 1){
dto.setImportFailReason("查询母亲结果数不为1");
failList.add(dto);
continue;
}
dto.setMotherId(list2.get(0).getId());
}
if(StringUtils.isBlank(dto.getSexName())){
dto.setImportFailReason("性别 不能为空");
failList.add(dto);
continue;
}else {
if(StringUtils.equals(dto.getSexName(),"男")){
dto.setSex(0);
dto.setPidRelationType(1);//儿子
}else if(StringUtils.equals(dto.getSexName(),"女")){
dto.setSex(1);
dto.setPidRelationType(2);//女儿
}
}
if(StringUtils.isBlank(dto.getIsMarriedName())){
dto.setImportFailReason("婚否 不能为空");
failList.add(dto);
continue;
}else {
if(StringUtils.equals(dto.getIsMarriedName(),"未婚")){
dto.setIsMarried(0);
}else if(StringUtils.equals(dto.getIsMarriedName(),"已婚")){
dto.setIsMarried(1);
}
}
if(dto.getIsMarried() ==1 && StringUtils.isBlank(dto.getSpouseNames())){
dto.setImportFailReason("婚否 不能为空");
failList.add(dto);
continue;
}else if(dto.getIsMarried() ==1 && StringUtils.isNotBlank(dto.getSpouseNames())){
String[] split = StringUtils.split(dto.getSpouseNames(), ",");
List<MmwzClanMember> list2=new ArrayList<>();
for(String name:split){
MmwzClanMember clanMember1=new MmwzClanMember();
//拷贝姓名和简介字段
clanMember1.setName(name);
clanMember1.setIntroduction(null);
clanMember1.setPid(null);
clanMember1.setPidRelationType(0);
clanMember1.setKinId(Long.valueOf(kinId));
list2.add(clanMember1);
}
dto.setSpouseList(list2);
}
okList.add(dto);
}
for (ImportClanMemberDto dto:okList){
MmwzClanMember mmwzClanMember=new MmwzClanMember();
BeanUtils.copyBeanProp(mmwzClanMember,dto);
mmwzClanMember.setKinId(Long.valueOf(kinId));
mmwzClanMemberService.save(mmwzClanMember);
//保存配偶
if(dto.getSpouseList() != null){
for(MmwzClanMember s : dto.getSpouseList()){
s.setPid(mmwzClanMember.getId());
mmwzClanMemberService.save(s);
}
}
}
List<List<Object>> list2 =new ArrayList<>();
for (ImportClanMemberDto dto:failList){
List<Object> list3=new ArrayList<>();
list3.add(dto.getEraNumberName());
list3.add(dto.getPName());
list3.add(dto.getMotherName());
list3.add(dto.getSexName());
list3.add(dto.getName());
list3.add(dto.getRanking());
list3.add(dto.getIntroduction());
list3.add(dto.getIsMarriedName());
list3.add(dto.getSpouseNames());//
list3.add(dto.getImportFailReason());//
list2.add(list3);
}
if (!list2.isEmpty()){
// 准备数据
Map<String, List<String>> areaList = new LinkedHashMap<>();
//areaList.put("中国", Arrays.asList("北京", "上海", "广州"));
//areaList.put("美国", Arrays.asList("纽约", "洛杉矶"));
//areaList.put("日本", Arrays.asList("东京", "大阪"));
// 准备数据
Map<String, List<String>> areaList1 = new LinkedHashMap<>();
//areaList1.put("北京", Arrays.asList("北京1", "北京2"));
//areaList1.put("上海", Arrays.asList("上海1", "上海2", "上海3"));
//查询几世
List<Map<String,String>> list=new ArrayList<>();
//查询有无始祖
MmwzClanMember one = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).eq(MmwzClanMember::getEraNumber, 1).one();
if(one == null){
Map<String,String> map=new HashedMap<>();
map.put("eraNumber","1");
map.put("eraNumberName","始祖");
list.add(map);
}
MmwzClanMember eraNumberMax = mmwzClanMemberService.lambdaQuery().eq(MmwzClanMember::getKinId, kinId).isNotNull(MmwzClanMember::getEraNumber).orderByDesc(MmwzClanMember::getEraNumber)
.last("limit 0,1")
.one();
if(eraNumberMax != null){
NumberToChinese converter = new NumberToChinese();
//当前最大世数
Integer eraNumber = eraNumberMax.getEraNumber();
for(int i=2;i<=eraNumber+1;i++){
Map<String,String> map=new HashedMap<>();
map.put("eraNumber",i+"");
map.put("eraNumberName","第"+converter.convert(i)+"世");
list.add(map);
}
}
List<Map<String,String>> list4=new ArrayList<>();
for(Map<String,String> era : list){
String eraNumber = era.get("eraNumber");
String eraNumberName = era.get("eraNumberName");
List<MmwzClanMember> list5 = mmwzClanMemberService.lambdaQuery()
.select(MmwzClanMember::getName,MmwzClanMember::getId)
.eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getSex,0)
.eq(MmwzClanMember::getEraNumber, Integer.valueOf(eraNumber) - 1).list();
List<String> collect = list5.stream().map(m -> m.getName()).collect(Collectors.toList());
areaList.put(eraNumberName,collect);
for(MmwzClanMember mmwzClanMember:list5){
Map<String,String> map=new HashedMap<>();
map.put("id",String.valueOf(mmwzClanMember.getId()));
map.put("name",mmwzClanMember.getName());
list4.add(map);
}
}
for(Map<String,String> spouse:list4){
String id = spouse.get("id");
String name = spouse.get("name");
List<MmwzClanMember> list3 = mmwzClanMemberService.lambdaQuery()
.select(MmwzClanMember::getName,MmwzClanMember::getId)
.eq(MmwzClanMember::getKinId, kinId)
.eq(MmwzClanMember::getPid,id)
.eq(MmwzClanMember::getPidRelationType, 0).list();
List<String> collect = list3.stream().map(m -> m.getName()).collect(Collectors.toList());
areaList1.put(name,collect);
}
//导出
ClassPathResource resource = new ClassPathResource("excelTemplate/clanMemberTemplate.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(resource.getStream());
// 获取所有名称
List<XSSFName> allNames = workbook.getAllNames();
for (int i = allNames.size() - 1; i >= 0; i--) {
Name name = allNames.get(i);
workbook.removeName(name); // 从后向前删除名称
}
//回显数据
int rowIndex3 = 1;
XSSFSheet mainSheet = workbook.getSheet("Main");
for (List<Object> row:list2) {
XSSFRow erow = mainSheet.createRow(rowIndex3++);
for (int i = 0; i < row.size(); i++) {
XSSFCell cell = erow.createCell(i);
cell.setCellValue(String.valueOf(row.get(i)));
System.out.println(row.get(i));
}
}
// 创建隐藏 Sheet 用于存储数据
//XSSFSheet hiddenSheet = workbook.createSheet("HiddenData");
XSSFSheet hiddenSheet = workbook.getSheet("HiddenData");
// 保护工作表
hiddenSheet.protectSheet("jcd743001734"); // 设置保护密码
int rowIndex = 0;
for (Map.Entry<String, List<String>> entry : areaList.entrySet()) {
XSSFRow row = hiddenSheet.createRow(rowIndex++);
XSSFCell cell = row.createCell(0);
cell.setCellValue(entry.getKey());
for (int i = 0; i < entry.getValue().size(); i++) {
cell = row.createCell(i + 1);
cell.setCellValue(entry.getValue().get(i));
}
// 创建名称管理器
Name name = workbook.createName();
name.setNameName(entry.getKey());
name.setRefersToFormula("HiddenData!$" + (char) ('A' + 1) + "$" + rowIndex + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex);
}
// 创建隐藏 Sheet 用于存储数据
//XSSFSheet hiddenSheet2 = workbook.createSheet("HiddenData2");
XSSFSheet hiddenSheet2 = workbook.getSheet("HiddenData2");
// 保护工作表
hiddenSheet2.protectSheet("jcd743001734"); // 设置保护密码
int rowIndex2 = 0;
for (Map.Entry<String, List<String>> entry : areaList1.entrySet()) {
XSSFRow row = hiddenSheet2.createRow(rowIndex2++);
XSSFCell cell = row.createCell(0);
cell.setCellValue(entry.getKey());
for (int i = 0; i < entry.getValue().size(); i++) {
cell = row.createCell(i + 1);
cell.setCellValue(entry.getValue().get(i));
}
// 创建名称管理器
Name name = workbook.createName();
name.setNameName(entry.getKey());
name.setRefersToFormula("HiddenData2!$" + (char) ('A' + 1) + "$" + rowIndex2 + ":$" + (char) ('A' + entry.getValue().size()) + "$" + rowIndex2);
}
// 设置一级下拉菜单
DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();
DataValidationConstraint constraint = dvHelper.createFormulaListConstraint("HiddenData!$A$1:$A$" + rowIndex);
CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0, 0); // A1:A101
DataValidation validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
// 设置二级下拉菜单
for (int i = 1; i <= 100; i++) {
constraint = dvHelper.createFormulaListConstraint("INDIRECT($A$" + i + ")");
addressList = new CellRangeAddressList(i , i, 1, 1); // B1:B101
validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
}
// 设置三级下拉菜单
for (int i = 1; i <= 100; i++) {
constraint = dvHelper.createFormulaListConstraint("INDIRECT($B$" + i + ")");
addressList = new CellRangeAddressList(i, i, 2, 2); // B1:B101
validation = dvHelper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
mainSheet.addValidationData(validation);
}
// 一次性写出内容,使用默认样式,强制输出标题
//bigExcelWriter.write(list2);
//response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;filename=clanMemberTemplate.xlsx");
ServletOutputStream out=response.getOutputStream();
// 终止后删除临时文件
//file.deleteOnExit();
workbook.write(out);
//此处记得关闭输出Servlet流
IoUtil.close(out);
}else {
JSONObject json=new JSONObject();
json.put("code",200);
json.put("msg","导入成功");
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out= null;
out=response.getWriter();
out.write(json.toString());
}
}
3.依赖的类库
package com.ruoyi.inherit.utils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import java.math.BigDecimal;
import java.util.*;
//读取excel工具类
public class ImportExcelUtil {
/**
* 读取Sheet 的所有数据
* @param rows
* @return
*/
public static List<Map<String, String>> getSheetData(Sheet rows){
Map<Integer, String> tableHeader=new HashMap<Integer, String>();
List<Map<String, String>> list=new ArrayList<Map<String, String>>();
int rowNum=0;
Iterator<Row> rowIterator = rows.rowIterator();
while (rowIterator.hasNext()){
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
int column=0;
Map<String, String> tdata=new HashMap<>();
while(cellIterator.hasNext()){
Cell next = cellIterator.next();
int columnIndex = next.getColumnIndex();
String cellValue = getCellValue(next);
if(rowNum == 0){
//第0行,表头
tableHeader.put(column,cellValue);
}else {
tdata.put(tableHeader.get(columnIndex),cellValue);
}
column++;
}
if(rowNum != 0){
list.add(tdata);
}
rowNum ++;
}
return list;
}
private static String getCellValue(Cell cell) {
CellType cellType = cell.getCellType();
if (cellType == CellType.STRING){
String stringCellValue = cell.getStringCellValue();
return stringCellValue;
}else if (cellType == CellType.NUMERIC){
Double value = cell.getNumericCellValue();
BigDecimal bd1 = new BigDecimal(Double.toString(value));
// 去掉后面无用的零 如小数点后面全是零则去掉小数点
String s = "";
if (bd1.toPlainString().contains(".")){
s = bd1.toPlainString().replaceAll("0+?$", "").replaceAll("[.]$", "");
}else{
s = bd1.toPlainString();
}
return s;
}
return "";
}
}
<!--Hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
前端调用
<el-dialog
title="族谱成员导入"
:visible.sync="importClanMember.show"
width="600px"
append-to-body
>
<el-form
ref="form"
:model="importClanMember.data"
:rules="importClanMember.rules"
label-width="150px"
>
<el-row>
<el-col :span="24">
<el-link
type="primary"
@click="downloadClanMemberTemplate()"
style="margin-bottom: 20px"
>下载导入模板</el-link
>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-upload
action="#"
:before-upload="handleBeforeUpload"
:show-file-list="false"
:headers="uploadData.headers"
class="upload-file-uploader"
:http-request="upAndDowndoad"
>
<el-button size="mini" type="primary">选取文件</el-button>
<div class="el-upload__tip" slot="tip">
请上传
<template v-if="uploadData.fileType">
格式为 <b style="color: #f56c6c">{{ uploadData.fileType.join("/") }}</b>
</template>
的文件
</div>
</el-upload>
</el-col>
</el-row>
</el-form>
</el-dialog>
import { listMmwzClanMember, getMmwzClanMember, delMmwzClanMember, addMmwzClanMember, updateMmwzClanMember ,importClanMember} from "@/api/inherit/mmwzClanMember";
import { blobValidate } from "@/utils/ruoyi";
import { saveAs } from "file-saver";
// 验证是否为blob格式
export function blobValidate(data) {
return data.type !== 'application/json'
}

// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.uploadData.fileType) {
const fileName = file.name.split(".");
const fileExt = fileName[fileName.length - 1];
const isTypeOk = this.uploadData.fileType.indexOf(fileExt) >= 0;
if (!isTypeOk) {
this.$modal.msgError(
`文件格式不正确, 请上传${this.uploadData.fileType.join("/")}格式文件!`
);
return false;
}
}
return true;
},
upAndDowndoad(params) {
var that = this;
let form = new FormData();
form.append("file", params.file);
form.append("kinId", this.importClanMember.kinId);
importClanMember(form).then((response) => {
console.log(response);
const isBlob = blobValidate(response);
if (isBlob) {
const blob = new Blob([response]);
saveAs(blob, "族谱成员导入模板-需修改重新上传.xlsx");
} else {
response
.text()
.then((data) => {
var resp = JSON.parse(data);
if (resp.code == 500) {
this.$modal.msgError(resp.msg);
} else {
that.$modal.msgSuccess(resp.msg);
}
})
.catch((err) => {});
this.getList();
}
});
},
handleImport(){
if(this.ids.length != 1){
this.$modal.msgError('请选择一个成员,导入成员到他的家族');
return ;
}
var arr = this.mmwzClanMemberList.filter(item => item.id == this.ids[0]);
if(arr.length != 1){
this.$modal.msgError('未找到家族ID');
return ;
}
this.importClanMember.kinId = arr[0]['kinId'];
this.importClanMember.show=true;
},
downloadClanMemberTemplate() {
this.download(
"/inherit/mmwzClanMember/downloadClanMemberTemplate",
{kinId:this.importClanMember.kinId},
"族谱成员导入模板.xlsx",
{}
);
},
//导入族谱成员
export function importClanMember(data) {
/*return request({
url: '/inherit/mmwzClanMember/importClanMember',
method: 'post',
responseType: 'blob',
data:data
});*/
return request.post("/inherit/mmwzClanMember/importClanMember", data, {
headers: {
"Content-Type": "multipart/form-data",
},
responseType: "blob",
});
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时
timeout: 10000
})
Excel模版参考文件下载
通过网盘分享的文件:若依 el-upload 上传execl 导入后 返回错误数据excel(二)
链接: https://pan.baidu.com/s/1u4ZAxLSahk-1j93bAq2oew?pwd=fbx8 提取码: fbx8