add 解析上传表格中的数据

master
yinq 2 months ago
parent f1d181592f
commit 56bce25f96

Binary file not shown.

@ -35,6 +35,7 @@
<logback.version>1.2.13</logback.version>
<spring-security.version>5.7.12</spring-security.version>
<spring-framework.version>5.3.39</spring-framework.version>
<httpclient.version>4.5.14</httpclient.version>
</properties>
<!-- 依赖声明 -->
@ -225,6 +226,13 @@
<version>${tagApi.version}</version>
</dependency>
<!-- Apache HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>shardingjdbcspringbootstarter</artifactId>-->

@ -61,6 +61,11 @@
<artifactId>tagApi-generator</artifactId>
</dependency>
<dependency>
<groupId>hw.tagApi</groupId>
<artifactId>tagApi-service</artifactId>
</dependency>
</dependencies>
<build>

@ -43,7 +43,7 @@ user:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间默认10分钟
lockTime: 10
lockTime: 720
# Spring配置
spring:

@ -119,6 +119,12 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- Apache HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,178 @@
package hw.tagApi.common.utils.poi;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Excel
*
* @author Yinq
*/
public class TagExcelUtil {
private static final Logger log = LoggerFactory.getLogger(TagExcelUtil.class);
/**
* Excel
*
* @param is Excel
* @return
*/
public static Map<String, Object> parseTagExcel(InputStream is) {
Map<String, Object> result = new HashMap<>();
try (Workbook workbook = WorkbookFactory.create(is)) {
Sheet sheet = workbook.getSheetAt(0);
// 解析订单信息
Map<String, String> orderInfo = parseOrderInfo(sheet);
result.put("orderInfo", orderInfo);
// 解析标签数据
List<Map<String, String>> tagList = parseTagList(sheet);
result.put("tagList", tagList);
return result;
} catch (Exception e) {
log.error("解析Excel文件失败", e);
throw new RuntimeException("解析Excel文件失败: " + e.getMessage());
}
}
/**
* 5
*/
private static Map<String, String> parseOrderInfo(Sheet sheet) {
Map<String, String> orderInfo = new HashMap<>();
try {
// 订单号 - 格式: 订单号Lot20250109
Row orderRow = sheet.getRow(0);
String orderNoCell = getCellStringValue(orderRow.getCell(0));
orderInfo.put("orderNo", orderNoCell.substring(orderNoCell.indexOf("") + 1).trim());
// 批次号 - 格式: 批次号002
Row batchRow = sheet.getRow(1);
String batchNoCell = getCellStringValue(batchRow.getCell(0));
orderInfo.put("batchNo", batchNoCell.substring(batchNoCell.indexOf("") + 1).trim());
// 操作人员号 - 格式: 操作人员号WJL
Row operatorRow = sheet.getRow(2);
String operatorIdCell = getCellStringValue(operatorRow.getCell(0));
orderInfo.put("operatorId", operatorIdCell.substring(operatorIdCell.indexOf("") + 1).trim());
// 加工时间 - 格式: 加工时间2025/1/9 14:00:19
Row timeRow = sheet.getRow(3);
String processTimeCell = getCellStringValue(timeRow.getCell(0));
String processTime = processTimeCell.substring(processTimeCell.indexOf("") + 1).trim();
if (processTime.contains("/")) {
// 转换日期格式为标准格式
String[] parts = processTime.split(" ");
if (parts.length == 2) {
String datePart = parts[0].replace("/", "-");
processTime = datePart + " " + parts[1];
}
}
orderInfo.put("processTime", processTime);
// 数量信息 - 格式: 合格数量2500不合格数量0总数量2500
Row quantityRow = sheet.getRow(4);
String quantityCell = getCellStringValue(quantityRow.getCell(0));
String[] quantities = quantityCell.split("");
for (String quantity : quantities) {
String[] parts = quantity.split("");
if (parts.length == 2) {
String value = parts[1].trim();
if (quantity.contains("合格数量") && !quantity.contains("不合格数量")) {
orderInfo.put("qualifiedCount", value);
} else if (quantity.contains("不合格数量")) {
orderInfo.put("unqualifiedCount", value);
} else if (quantity.contains("总数量")) {
orderInfo.put("totalCount", value);
}
}
}
log.info("解析到的订单信息: {}", orderInfo);
} catch (Exception e) {
log.error("解析订单信息失败", e);
throw new RuntimeException("解析订单信息失败: " + e.getMessage());
}
return orderInfo;
}
/**
* 8
*/
private static List<Map<String, String>> parseTagList(Sheet sheet) {
List<Map<String, String>> tagList = new ArrayList<>();
try {
// 获取表头
Row headerRow = sheet.getRow(6);
List<String> headers = new ArrayList<>();
for (Cell cell : headerRow) {
headers.add(getCellStringValue(cell));
}
// 解析数据行
int startRow = 7;
Row row;
while ((row = sheet.getRow(startRow)) != null) {
Map<String, String> tagData = new HashMap<>();
boolean hasData = false;
for (int i = 0; i < headers.size(); i++) {
String value = getCellStringValue(row.getCell(i));
if (StringUtils.hasText(value)) {
hasData = true;
tagData.put(headers.get(i), value);
}
}
if (hasData) {
tagList.add(tagData);
} else {
break;
}
startRow++;
}
} catch (Exception e) {
log.error("解析标签数据失败", e);
throw new RuntimeException("解析标签数据失败: " + e.getMessage());
}
return tagList;
}
/**
*
*/
private static String getCellStringValue(Cell cell) {
if (cell == null) {
return "";
}
String value = "";
switch (cell.getCellType()) {
case STRING:
value = cell.getStringCellValue();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
value = sdf.format(cell.getDateCellValue());
} else {
value = String.valueOf((long) cell.getNumericCellValue());
}
break;
case BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
break;
default:
break;
}
return value.trim();
}
}

@ -2,7 +2,15 @@ package hw.tagApi.service.service.impl;
import hw.tagApi.service.service.IKDocsService;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -10,8 +18,15 @@ import java.util.Map;
import hw.tagApi.service.constant.ApiConstants;
import hw.tagApi.service.mapper.HwTagRecordMapper;
import hw.tagApi.service.domain.HwTagRecord;
import hw.tagApi.common.utils.poi.TagExcelUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
/**
*
@ -24,7 +39,108 @@ public class KDocsServiceImpl implements IKDocsService
{
private static final Logger log = LoggerFactory.getLogger(KDocsServiceImpl.class);
private HwTagRecordMapper hwTagRecordMapper;
@Autowired
private HwTagRecordMapper hwTagRecordMapper;
@Autowired
private CloseableHttpClient httpClient;
private static final int BATCH_SIZE = 10;
private List<HwTagRecord> batchList = new ArrayList<>();
@Override
public String importData(String url) {
try {
log.info("开始从金山文档下载Excel文件: {}", url);
// 创建HttpGet请求
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
httpGet.setHeader("Accept", "*/*");
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
httpGet.setHeader("Connection", "keep-alive");
// 执行请求
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
log.error("从金山文档获取文件失败,响应码: {}", statusCode);
return ApiConstants.SYSTEM_ERROR;
}
// 获取响应实体
HttpEntity entity = response.getEntity();
if (entity == null) {
log.error("无法从金山文档获取文件或文件为空");
return ApiConstants.SYSTEM_ERROR;
}
// 将响应实体转换为字节数组
byte[] fileData = EntityUtils.toByteArray(entity);
if (fileData.length == 0) {
log.error("无法从金山文档获取文件或文件为空");
return ApiConstants.SYSTEM_ERROR;
}
// 直接使用字节流处理Excel数据
Map<String, Object> excelResult;
try (ByteArrayInputStream bis = new ByteArrayInputStream(fileData)) {
excelResult = TagExcelUtil.parseTagExcel(bis);
}
// 获取订单信息
Map<String, String> orderInfo = (Map<String, String>) excelResult.get("orderInfo");
String orderNo = orderInfo.get("orderNo");
String batchNo = orderInfo.get("batchNo");
String operatorId = orderInfo.get("operatorId");
String processTime = orderInfo.get("processTime");
log.info("解析订单信息 - 订单号: {}, 批次号: {}, 操作员: {}", orderNo, batchNo, operatorId);
// 获取标签数据列表
List<Map<String, String>> tagList = (List<Map<String, String>>) excelResult.get("tagList");
// 批量处理标签数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (Map<String, String> tagData : tagList) {
HwTagRecord record = new HwTagRecord();
record.setOrderCode(orderNo);
record.setBatchNumber(batchNo);
record.setOperatorId(operatorId);
record.setProcessingTime(sdf.parse(processTime));
// 设置标签数据
record.setEpc(tagData.get("EPC"));
record.settId(tagData.get("TID"));
record.setTagSequence(tagData.get("序号"));
// 添加到批处理列表
batchList.add(record);
// 达到批量大小时执行插入
if (batchList.size() >= BATCH_SIZE) {
hwTagRecordMapper.batchInsertHwTagRecord(batchList);
log.info("批量插入{}条数据成功", batchList.size());
batchList.clear();
}
}
// 处理剩余的数据
if (!batchList.isEmpty()) {
hwTagRecordMapper.batchInsertHwTagRecord(batchList);
log.info("批量插入剩余{}条数据成功", batchList.size());
batchList.clear();
}
return getSystemStatus();
}
} catch (Exception e) {
log.error("导入数据失败: {}", e.getMessage(), e);
return ApiConstants.SYSTEM_ERROR;
}
}
@Override
public String getSystemStatus() {
@ -52,12 +168,6 @@ public class KDocsServiceImpl implements IKDocsService
return null;
}
@Override
public String importData(String data) {
// TODO: 实现数据导入逻辑
return getSystemStatus();
}
@Override
public String deleteData(String id) {
// TODO: 实现数据删除逻辑
@ -75,7 +185,4 @@ public class KDocsServiceImpl implements IKDocsService
// TODO: 实现数据导出逻辑
return getSystemStatus();
}
}

Loading…
Cancel
Save