提交 bb635a88 authored 作者: xc's avatar xc

[excel导入]添加备注模板

上级 696cd8b3
......@@ -30,7 +30,7 @@ public class ExcelController {
@PostMapping("/import")
public ResponseEntity importExcel(){
//@RequestParam int id
int id = 14;
int id = 15;
return excelData.getExcelData(id);
}
......
......@@ -10,7 +10,10 @@ import java.util.List;
@NoArgsConstructor
@Data
public class ExcelErrorVo {
private String fileName;
List<String> result;
private String fileName;//文件名字
private String uintName;//本单位名字
private String tel;//本单位联系方式
private String buildTel;//承建单位联系方式
List<String> result;//预览有问题的文件结果
}
......@@ -12,6 +12,7 @@ public class ExcelVo {
private Integer total;
private Integer successNum;
private Integer errorNum;
private Integer importNum;
private List<ExcelErrorVo> list;
}
......@@ -81,93 +81,125 @@ public class ExcelData {
return ResultUtil.failed("文件路径不是文件夹!");
}
File[] dataFiles = file.listFiles();
if (dataFiles == null || dataFiles.length == 0){
excelLogService.save(new ExcelLog("导入失败", "文件路径下没有文件", ""));
return ResultUtil.failed("文件路径下没有文件!");
return ResultUtil.failed("没有待导入文件!");
}
//找到需要判断唯一值的规则
List<Rule> ruleList = ruleService.findAll().stream().filter(rule1 -> rule1.getCompare() == 2).collect(Collectors.toList());
Rule rule = new Rule();
if (ruleList.size() > 0){
rule = ruleList.get(0);
}
List<String> ruleKeyList = ruleList.stream().map(Rule::getRuleKey).collect(Collectors.toList());
String successFileNameList = "";
String errorFileNameList = "";
String errorReason = "";
int total = dataFiles.length;
int total = 0;
percent =0;
for (File dataFile : dataFiles){
List<Map<String, Object>> mapList = new ArrayList<>();
//取模板,如果有模板文件传过来就解析模板文件并保存,否则就读本地模板
Map<String, int[]> indexMap = getIndenxMap(null);
if (indexMap.isEmpty()){
excelLogService.save(new ExcelLog("导入失败", "没有模板文件", ""));
return ResultUtil.failed("没有模板文件导入失败!");
}
//取数据
FileInputStream dataFis = new FileInputStream(dataFile);
Workbook dataWb = null;
String fileName = dataFile.getName();
if(fileName.endsWith("xls")) {
dataWb = new HSSFWorkbook(dataFis);
} else if(fileName.endsWith("xlsx")) {
dataWb = new XSSFWorkbook(dataFis);
}else {
errorFileNameList = errorFileNameList + "[" + fileName + "]";
errorReason = "不是excel文件或保存失败";
dataFile.renameTo(new File(errorPath + fileName));
continue;
}
for (int i = 0; i < dataWb.getNumberOfSheets(); i++){
Sheet sheet1 = dataWb.getSheetAt(i);
if ("引用表(请勿改动)".equals(sheet1.getSheetName())){
try {
//取模板,如果有模板文件传过来就解析模板文件并保存,否则就读本地模板
Template template = new Template();
String tem = template.getTemplate("template.txt");
Map<String, int[]> indexMap = JSON.parseObject(tem, new TypeReference<Map<String, int[]>>(){});
if (indexMap.isEmpty()){
excelLogService.save(new ExcelLog("导入失败", "没有模板文件", ""));
return ResultUtil.failed("没有模板文件导入失败!");
}
String remarkTemplateString = template.getTemplate("remarksTemplate.txt");
List<ExcelRemarks> remarksTemplateList = JSON.parseObject(remarkTemplateString, new TypeReference<List<ExcelRemarks>>(){});
//取数据
FileInputStream dataFis = new FileInputStream(dataFile);
Workbook dataWb = null;
if(fileName.endsWith("xls")) {
dataWb = new HSSFWorkbook(dataFis);
} else if(fileName.endsWith("xlsx")) {
dataWb = new XSSFWorkbook(dataFis);
}else {
errorFileNameList = errorFileNameList + "[" + fileName + "]";
errorReason = "不是excel文件或保存失败";
dataFile.renameTo(new File(errorPath + fileName));
continue;
}
Map<String, Object> objectMap = new HashMap<>();
String className = null;
for (String key : indexMap.keySet()){
int[] value = indexMap.get(key);
int dataRow = value[0];
int dataCell = value[1];
String[] classArray = key.split("[.]");
className = classArray[0];
if (dataMap.get(className) != null && dataMap.get(className).keySet().contains(classArray[1])){
objectMap.put(classArray[1], sheet1.getRow(dataRow).getCell(dataCell).getStringCellValue());
for (int i = 0; i < dataWb.getNumberOfSheets(); i++){
Sheet sheet1 = dataWb.getSheetAt(i);
if ("引用表(请勿改动)".equals(sheet1.getSheetName())){
continue;
}
if (Objects.equals(key, rule.getRuleKey())){
//查询数据库是否有相同网络名称,有就更新
List<QueryCondition> queryConditions = new ArrayList<>();
QueryCondition queryCondition = new QueryCondition();
queryCondition.setName(classArray[1]);
queryCondition.setType("=");
queryCondition.setValue(sheet1.getRow(dataRow).getCell(dataCell).getStringCellValue());
queryConditions.add(queryCondition);
List<Map<String, Object>> list = modelService.complexQuery(className, null, queryConditions);
if (list != null && list.size() > 0){
Object object = list.get(0).get("id");
objectMap.put("id", object);
Map<String, Object> objectMap = new HashMap<>();
String className = null;
//取模板位置数据
for (String key : indexMap.keySet()){
int[] value = indexMap.get(key);
int dataRow = value[0];
int dataCell = value[1];
String[] classArray = key.split("[.]");
className = classArray[0];
Row row = sheet1.getRow(dataRow);
row.getCell(dataCell).setCellType(CellType.STRING);
if (dataMap.get(className) != null && dataMap.get(className).keySet().contains(classArray[1])){
objectMap.put(classArray[1], row.getCell(dataCell).getStringCellValue());
}
if (ruleKeyList.contains(key)){
//查询数据库是否有相同网络名称,有就更新
List<QueryCondition> queryConditions = new ArrayList<>();
QueryCondition queryCondition = new QueryCondition();
queryCondition.setName(classArray[1]);
queryCondition.setType("=");
queryCondition.setValue(row.getCell(dataCell).getStringCellValue());
queryConditions.add(queryCondition);
List<Map<String, Object>> list = modelService.complexQuery(className, null, queryConditions);
if (list != null && list.size() > 0){
Object object = list.get(0).get("id");
objectMap.put("id", object);
}
}
}
//取备注模板数据,并判断是否需要替换原数据
for (ExcelRemarks remark : remarksTemplateList){
int[] value = remark.getLocation();
int dataRow = value[0];
int dataCell = value[1];
Row row = sheet1.getRow(dataRow);
row.getCell(dataCell).setCellType(CellType.STRING);
String[] classArray = remark.getClassName().split("[.]");
Object templateData = objectMap.get(classArray[1]);
if (String.valueOf(templateData).contains(remark.getRemark())){
String remarkData = row.getCell(dataCell).getStringCellValue();
if ("append".equals(remark.getType())){
Object temData = objectMap.get(classArray[1]) == null ? "" : objectMap.get(classArray[1]);
remarkData = temData + remark.getJointMark() + remarkData;
objectMap.put(classArray[1], temData);
}
objectMap.put(classArray[1], remarkData);
}
}
if (!objectMap.isEmpty()){
Map<String, Object> result = new HashMap<>();
result.put(className, objectMap);
System.out.println(result);
mapList.add(result);
}
}
if (!objectMap.isEmpty()){
Map<String, Object> result = new HashMap<>();
result.put(className, objectMap);
System.out.println(result);
mapList.add(result);
}
}
int re = modelService.putValueByEntityNameList(mapList);
if (re == 0){
successFileNameList = successFileNameList + "[" + fileName + "]";
dataFile.renameTo(new File(successPath + fileName));
}else {
int re = modelService.putValueByEntityNameList(mapList);
if (re == 0){
successFileNameList = successFileNameList + "[" + fileName + "]";
dataFile.renameTo(new File(successPath + fileName));
}else {
errorFileNameList = errorFileNameList + "[" + fileName + "]";
errorReason = "不是excel文件或保存失败";
dataFile.renameTo(new File(errorPath + fileName));
}
total = total + 1;
}catch (Exception e){
e.printStackTrace();
errorFileNameList = errorFileNameList + "[" + fileName + "]";
errorReason = "不是excel文件或保存失败";
dataFile.renameTo(new File(errorPath + fileName));
continue;
}
total = total -1;
}
percent = total/dataFiles.length * 1.0;
if (!"".equals(errorFileNameList)){
......@@ -205,12 +237,18 @@ public class ExcelData {
int total = 0;
boolean isSuccess = true;
try {
Map<String, int[]>indexMap = getIndenxMap(null);
Template template = new Template();
String tem = template.getTemplate("template.txt");
Map<String, int[]> indexMap = JSON.parseObject(tem, new TypeReference<Map<String, int[]>>(){});
if (indexMap.isEmpty()){
return ResultUtil.failed("没有excle模板!");
}
File file = new File(path);
File[] dataFiles = file.listFiles();
if (dataFiles == null){
return ResultUtil.failed("文件夹为空!");
}
total = dataFiles.length;
//用于判断excel内容是否符合选项
......@@ -222,135 +260,171 @@ public class ExcelData {
//取所有字段的引用map<字段名,引用列表>
Map<String, List<Quote>> he = modelHelper.getQuoteList(className);
for (File dataFile : dataFiles){
FileInputStream dataFis = new FileInputStream(dataFile);
Workbook wb = null;
String fileName = dataFile.getName();
if(fileName.endsWith("xls")) {
wb = new HSSFWorkbook(dataFis);
} else if(fileName.endsWith("xlsx")) {
wb = new XSSFWorkbook(dataFis);
}
Map<String, List<String>> map = new HashMap<>();
Map<String, String> content = new HashMap<>();
isSuccess = true;
String tel = null;//联系方式
String unitName = null;//联系方式
String buildTel = null;//承建单位
List<String> result = new ArrayList<>();
Map<String, String> networkName = new HashMap<>();
for (int i = 0; i < wb.getNumberOfSheets(); i++){
Sheet sheet1 = wb.getSheetAt(i);
if ("引用表(请勿改动)".equals(sheet1.getSheetName())){
continue;
}
if (sheet1 == null){
continue;
}
String sameNet = null;
for (String key : indexMap.keySet()){
//key=className.property
int[] value = indexMap.get(key);
int dataRow = value[0];
int dataCell = value[1];
String data = sheet1.getRow(dataRow).getCell(dataCell).getStringCellValue();
try {
FileInputStream dataFis = new FileInputStream(dataFile);
Workbook wb = null;
//判断是否是两个相同的sheet
if (content.get(sheet1.getSheetName()) == null || content.get(sheet1.getSheetName()).isEmpty()) {
content.put(sheet1.getSheetName(), data);
} else {
String con = content.get(sheet1.getSheetName());
content.put(sheet1.getSheetName(), con + data);
if(fileName.endsWith("xls")) {
wb = new HSSFWorkbook(dataFis);
} else if(fileName.endsWith("xlsx")) {
wb = new XSSFWorkbook(dataFis);
}
Map<String, List<String>> map = new HashMap<>();
Map<String, List<String>> sheetNameMap = new HashMap<>();
Map<String, String> content = new HashMap<>();
Map<String, String> networkName = new HashMap<>();
for (int i = 0; i < wb.getNumberOfSheets(); i++){
Sheet sheet1 = wb.getSheetAt(i);
if ("引用表(请勿改动)".equals(sheet1.getSheetName())){
continue;
}
if (sheet1 == null){
continue;
}
//判断引用
String propertyName = key.split("[.]")[1];
List<Quote> quotes = he.get(propertyName);
String sameNet = null;
String sanmeNetName = "";
Row row = null;
for (String key : indexMap.keySet()){
//key=className.property
int[] value = indexMap.get(key);
int dataRow = value[0];
int dataCell = value[1];
row = sheet1.getRow(dataRow);
row.getCell(dataCell).setCellType(CellType.STRING);
String data = row.getCell(dataCell).getStringCellValue();
// TODO: 21-5-21
if ("diaoyan.unit_contact".equals(key) && tel == null){
tel = data;
}
if ("diaoyan.contractor_contact_information".equals(key) && buildTel == null){
buildTel = data;
}
if ("diaoyan.name_of_user".equals(key) && unitName == null){
unitName = data;
}
//判断是否是两个相同的sheet
if (content.get(sheet1.getSheetName()) == null || content.get(sheet1.getSheetName()).isEmpty()) {
content.put(sheet1.getSheetName(), data);
} else {
String con = content.get(sheet1.getSheetName());
content.put(sheet1.getSheetName(), con + data);
}
//判断引用
String propertyName = key.split("[.]")[1];
List<Quote> quotes = he.get(propertyName);
// System.out.println("引用");
// System.out.println(JSON.toJSONString(quotes));
if (quotes != null && quotes.size() > 0){
boolean isQuote = true;
for (Quote quote : quotes){
if(Objects.equals(data, quote.getValue())){
isQuote = false;
break;
if (quotes != null && quotes.size() > 0){
boolean isQuote = true;
for (Quote quote : quotes){
if(Objects.equals(data, quote.getValue())){
isQuote = false;
break;
}
}
if (isQuote){
int k = result.size() + 1;
result.add(k + ".\"" + sheet1.getSheetName() + "\"第" + (dataRow + 1) + "行第" + (dataCell + 1) + "列不符合规则");
isSuccess = false;
}
}
if (isQuote){
int k = result.size() + 1;
System.out.println();
System.out.println(JSON.toJSONString(quotes));
result.add(k + "." + sheet1.getSheetName() + data + "不符合引用规则");
isSuccess = false;
}
}
//正则规则判断
List<Rule> ruleList = rules.stream().filter(rule1 -> rule1.getRuleKey().equals(key)).collect(Collectors.toList());
if (!ruleList.isEmpty()) {
Rule rule = ruleList.get(0);
//判断同一个文件里所有sheet中该字段是否相同
if (rule.getCompare() == 1) {
if (map.get(rule.getName())== null || map.get(rule.getName()).isEmpty()) {
List<String> list = new ArrayList<>();
list.add(data);
map.put(rule.getName(), list);
} else {
map.get(rule.getName()).add(data);
//正则规则判断
List<Rule> ruleList = rules.stream().filter(rule1 -> rule1.getRuleKey().equals(key)).collect(Collectors.toList());
if (!ruleList.isEmpty()) {
Rule rule = ruleList.get(0);
//判断同一个文件里所有sheet中该字段是否相同
if (rule.getCompare() == 1) {
if (map.get(rule.getName())== null || map.get(rule.getName()).isEmpty()) {
List<String> list = new ArrayList<>();
list.add(data);
List<String> list1 = new ArrayList<>();
list1.add(sheet1.getSheetName());
map.put(rule.getName(), list);
sheetNameMap.put(rule.getName(), list1);
} else {
if (!map.get(rule.getName()).contains(data)){
map.get(rule.getName()).add(data);
}
}
}else if (rule.getCompare() == 2){
//判断统一文件中该字段是否唯一
if (networkName.keySet().contains(data)) {
sameNet = networkName.get(data);
}
sanmeNetName = rule.getName();
networkName.put(data, sheet1.getSheetName());
}
}else if (rule.getCompare() == 2){
//判断统一文件中该字段是否唯一
if (networkName.keySet().contains(data)) {
sameNet = networkName.get(data);
Pattern p = Pattern.compile(rule.getRule());
Matcher m = p.matcher(data);
if (!m.matches()) {
//不符合
int k = result.size() + 1;
result.add(k + ".\"" + sheet1.getSheetName() + "\"第" + (dataRow + 1) + "行第" + (dataCell + 1) + "列不符合规则");
isSuccess = false;
}
networkName.put(data, sheet1.getSheetName());
}
Pattern p = Pattern.compile(rule.getRule());
Matcher m = p.matcher(data);
if (!m.matches()) {
//不符合
int k = result.size() + 1;
result.add(k + "." + sheet1.getSheetName() + rule.getName() + "不符合正则规则");
isSuccess = false;
}
}
}
if (sameNet != null){
String now = content.get(sheet1.getSheetName());
String last = content.get(sameNet);
int k = result.size() + 1;
if (Objects.equals(now, last)){
result.add(k + "." + sameNet + "与" + sheet1.getSheetName() + "存在相同表");
}else {
result.add(k + "." + sameNet + "与" + sheet1.getSheetName() + "不同网络之间,网络名重名");
if (sameNet != null){
String now = content.get(sheet1.getSheetName());
String last = content.get(sameNet);
int k = result.size() + 1;
if (Objects.equals(now, last)){
result.add(k + ".\"" + sameNet + "\"与\"" + sheet1.getSheetName() + "\"存在内容相同表");
}else {
result.add(k + ".\"" + sameNet + "\"与\"" + sheet1.getSheetName() + "\"的\"" + sanmeNetName + "\"重名");
}
isSuccess = false;
}
isSuccess = false;
}
}
if (!map.isEmpty()){
for (String key : map.keySet()){
List<String> list = map.get(key);
if (1 < new HashSet<Object>(list).size()){
if (!map.isEmpty() && map.size() > 1){
for (String key : map.keySet()){
List<String> list = sheetNameMap.get(key);
String sheetName = "";
for (String s : list){
sheetName = "\"" + s + "\"";
}
//不是全部相同
int k = result.size() + 1;
result.add(k + "." + key + "在同一文件里数据不同");
result.add(k + "." + sheetName + "中\"" + key + "\"的数据不同");
isSuccess = false;
}
}
}
if (isSuccess){
dataFile.renameTo(new File(tmpPath + fileName));
successNum = successNum + 1;
if (isSuccess){
dataFile.renameTo(new File(tmpPath + fileName));
successNum = successNum + 1;
}else {
}else {
// dataFile.renameTo(new File(errorPath + fileName));
errorNum = errorNum + 1;
excelVos.add(new ExcelErrorVo(fileName, unitName, tel, buildTel, result));
}
}catch (Exception e){
e.printStackTrace();
errorNum = errorNum + 1;
excelVos.add(new ExcelErrorVo(fileName, result));
int k = result.size() + 1;
result.add(k + "." + "不是模板文件或读文件失败");
excelVos.add(new ExcelErrorVo(fileName, unitName, tel, buildTel, result));
}
}
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
return ResultUtil.failed("预览失败!");
}
ExcelVo excelVo = new ExcelVo(total,successNum, errorNum, excelVos);
File[] successFile = new File(tmpPath).listFiles();
int importNum = successFile == null ? 0 : successFile.length;
ExcelVo excelVo = new ExcelVo(total,successNum, errorNum, importNum, excelVos);
return ResultUtil.success(excelVo, "预览成功");
}
......@@ -361,6 +435,7 @@ public class ExcelData {
*/
public Map<String, int[]> getIndenxMap(MultipartFile file) throws IOException {
Map<String, int[]> indexMap = new HashMap<>();
List<ExcelRemarks> remarksList = new ArrayList<>();
if (file != null){
String fileName = file.getResource().getFilename();
InputStream fis = null;
......@@ -378,27 +453,43 @@ public class ExcelData {
row = sheet.getRow(index);
for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); ++i) {
row.getCell(i).setCellType(CellType.STRING);
String data = row.getCell(i).getStringCellValue();
if (row.getCell(i) != null && data.contains("$")) {
if (row.getCell(i) != null && row.getCell(i).getStringCellValue().contains("$")) {
//{className.propertyName=[1,2]}
String type = row.getCell(i).getStringCellValue().substring(1);
int[] idenx = new int[2];
idenx[0] = row.getRowNum();
idenx[1] = i;
indexMap.put(type, idenx);
String type = null;
if (data.contains("*")){
//备注内容,data=$A.name*备注*insert*其他
String[] re = data.split("[*]");
if (re.length > 3){
type = re[0].substring(1);
remarksList.add(new ExcelRemarks(type, re[1], re[2], re[3], idenx));
}
}else {
//{className.propertyName=[1,2]},data=$A.name
type = data.substring(1);
indexMap.put(type.trim(), idenx);
}
}
}
}
Template template = new Template();
template.saveTemplate(JSON.toJSONString(indexMap));
}else {
Template template = new Template();
String tem = template.getTemplate();
if (tem.isEmpty()){
return indexMap;
}
indexMap = JSON.parseObject(tem, new TypeReference<Map<String, int[]>>(){});
template.saveTemplate(JSON.toJSONString(indexMap), "template.txt");
template.saveTemplate(JSON.toJSONString(remarksList), "remarksTemplate.txt");
}
// else {
// Template template = new Template();
// String tem = template.getTemplate();
// if (tem.isEmpty()){
// return indexMap;
// }
// indexMap = JSON.parseObject(tem, new TypeReference<Map<String, int[]>>(){});
// }
return indexMap;
}
......@@ -436,7 +527,7 @@ public class ExcelData {
}
public ResponseEntity findPrecen(){
return ResultUtil.success(percent,"保存成功");
return ResultUtil.success(percent,"查询成功");
}
}
package com.tykj.model_layer.excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ExcelRemarks {
@ApiModelProperty("表名.字段名")
private String className;
@ApiModelProperty("备注标识")
private String remark;
@ApiModelProperty("连接方式")
private String type;
@ApiModelProperty("连接字符")
private String jointMark;
@ApiModelProperty("备注位置")
private int[] location;
}
......@@ -4,14 +4,13 @@ import java.io.*;
import java.util.Properties;
public class Template {
private String path = System.getProperty("user.dir") + "/template.txt";
/**
* 把模板数据保存在txt文件中
* @param data 模板json数据;{className.propertyName:[1,2]}
* key为类名.属性名,value为该属性在模板excel中的位置[行,列]
*/
public void saveTemplate(String data){
public void saveTemplate(String data, String fileName){
String path = System.getProperty("user.dir") + "/" + fileName;
Properties properties = new Properties();
try {
System.out.println(path);
......@@ -34,8 +33,8 @@ public class Template {
* 前端没有传模板的时候,读取本地模板
* @return
*/
public String getTemplate(){
String pathname = path;
public String getTemplate(String fileName){
String pathname = System.getProperty("user.dir") + "/" + fileName;
try{
String result = "";
FileReader fileReader = null;
......
......@@ -4,6 +4,16 @@ spring:
password: Huang123+
url: jdbc:mysql://47.106.142.73:3306/dataTest?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
read-only: false
connection-timeout: 60000
idle-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
maximum-pool-size: 60
minimum-idle: 10
jpa:
show-sql: true
hibernate:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论