package com.zbooksoft.gdmis.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruili.wcp.data.entity.config.ImportColumn; import com.ruili.wcp.data.entity.config.ImportTemplate; import com.ruili.wcp.engine.form.IFormData; import com.ruili.wcp.service.config.ImportColumnService; import com.ruili.wcp.service.config.ImportTemplateService; import com.ruili.wcp.web.common.LicenseException; import com.ruili.wcp.web.model.AjaxResponse; import com.ruili.wcp.web.model.ErrorInfo; import com.zbooksoft.gdmis.common.BoxEnum; import com.zbooksoft.gdmis.service.CatSwajxxService; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.authz.annotation.RequiresUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import javax.crypto.spec.PSource; import java.io.IOException; import java.io.InputStream; import java.util.*; import static com.ruili.wcp.web.controller.general.DataImportController.getExcelValue; /** * @Description:导入Excel文件 * @Author: zhai * @Date: 2024/9/11 **/ @Controller @RequestMapping("/importExcel") public class ImportExcelController { @Autowired ImportTemplateService importTemplateService; @Autowired ImportColumnService importColumnService; @Autowired CatSwajxxService catSwajxxService; // @Autowired // CatSwzkxxService catSwzkxxService; // @Autowired // CatSwyxxxService catSwyxxxService; @Autowired IFormData iform; @Autowired JdbcTemplate jdbcTemplate; private static final Logger logger = LoggerFactory.getLogger(ImportExcelController.class); /** * 导入页面 * * @param type 0:从转孔基本信息进入 1:从钻孔图幅进入 * @return */ @RequestMapping({"/importIndex"}) @RequiresUser public ModelAndView importIndex(Integer type) { ModelAndView mv = new ModelAndView("gh/excel/importExcel"); return mv; } /** * @param file 0 导入转孔信息 1 导入图幅信息 2 导入实物案卷信息 * @return * @throws LicenseException */ @RequestMapping({"/importExcel"}) @ResponseBody @RequiresUser public Object importExcel(@RequestParam(value = "file", required = false) MultipartFile file) throws LicenseException { try { readExcelBySwyp(file); return new AjaxResponse(true); } catch (Exception e) { logger.error(e.getMessage(), e); return new AjaxResponse(new ErrorInfo("导入失败"), false); } } private void readExcelBySwyp(MultipartFile file) throws IOException { List importTemplateIds = Arrays.asList(1954734982477950977L, 1954736942581067778L); String originalFilename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); if (originalFilename.matches("^.+\\.(?i)(xls)$")) { //创建工作簿对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream); HashMap map = readProject2003(hssfWorkbook); readExcel2003(hssfWorkbook, map); } if (originalFilename.matches("^.+\\.(?i)(xlsx)$")) { //创建工作簿对象 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); for (int i = 0; i < 2; i++) { HashMap map = null; readExcel2007(xssfWorkbook, i, importTemplateIds.get(i), map, 0); } } } //Excel2003 xls格式 private HashMap readProject2003(HSSFWorkbook hssfWorkbook) { HashMap map = new HashMap<>(); //读取第i个工作表 HSSFSheet sheet = hssfWorkbook.getSheetAt(0); //项目名称:1:25万南沙幅海域区域地质调查 String xmmc = getValue(sheet, 6, 3); map.put("XMMC", xmmc); String xmbh = getValue(sheet, 7, 3); map.put("XMBH", xmbh); String selectProject = "SELECT ID FROM CAT_FILE_AJJXX WHERE XMKYQMC = '" + xmmc + "' AND XMKYQBH = '" + xmbh + "'"; List> mapList = jdbcTemplate.queryForList(selectProject); if (mapList.size() > 0) { String ajId = mapList.get(0).get("ID").toString(); map.put("AJ_ID", ajId); } String dcchc = getValue(sheet, 8, 3); map.put("DCCHC", dcchc); String dchy = getValue(sheet, 9, 3); map.put("DCHY", dchy); String dcqu = getValue(sheet, 10, 3); map.put("DCQU", dcqu); String dcsj = getValue(sheet, 11, 3); map.put("DCSJ", dcsj); String jyr = getValue(sheet, 12, 3); map.put("JYR", jyr); String syr = getValue(sheet, 13, 3); map.put("SYR", syr); String syrq = getValue(sheet, 14, 3); map.put("SYRQ", syrq); return map; } private String getValue(HSSFSheet sheet, int rowIndex, int cellIndex) { Row row = sheet.getRow(rowIndex); if (row != null) { Cell cell = row.getCell(cellIndex); if (cell != null) { String excelValue = getExcelValue(cell) == null ? "" : getExcelValue(cell).toString(); return subString(excelValue); } } return null; } private String subString(String cellValue) { if (cellValue != null && cellValue.contains(":")) { int index = cellValue.indexOf(":"); return cellValue.substring(index + 1).trim(); } return cellValue; } //Excel2003 xls格式 private void readExcel2003(HSSFWorkbook hssfWorkbook, Map mapData) { ImportTemplate importTemplate = importTemplateService.getByIdImportTemplate(1966070853328244738L); QueryWrapper query = new QueryWrapper(); query.eq("import_template_id", importTemplate.getImportTemplateId()); List columnList = importColumnService.list(query); List excelColumns = new ArrayList(); //读取第i个工作表 HSSFSheet sheet = hssfWorkbook.getSheetAt(1); //获取最后一行的num,即总行数。此处从6行开始 int maxRow = sheet.getLastRowNum(); Row row = sheet.getRow(3); // Row row = sheet.getRow(4); int totalCells = row.getPhysicalNumberOfCells(); for (int j = 0; j < totalCells; ++j) { Cell cell = row.getCell(j); String cellValue = getExcelValue(cell) == null ? "" : getExcelValue(cell).toString(); if (StringUtils.isNotEmpty(cellValue) && "站位位置".equals(cellValue)) { Row rowJd = sheet.getRow(4); Cell cellJd = rowJd.getCell(j); String excelValueJd = getExcelValue(cellJd); excelColumns.add(excelValueJd); Cell cellWd = rowJd.getCell(j + 1); String excelValueWd = getExcelValue(cellWd); excelColumns.add(excelValueWd); } else if (StringUtils.isNotEmpty(cellValue)) { excelColumns.add(cellValue.toString()); } } for (int j = 6; j <= maxRow; j++) { Row rowValue = sheet.getRow(j); Map map = new HashMap(); map.putAll(mapData); for (int z = 0; z < columnList.size(); z++) { ImportColumn column = columnList.get(z); int columnIndex = excelColumns.indexOf(column.getExcelColunm()); if (columnIndex >= 0) { Cell cell = rowValue.getCell(columnIndex); Object cellValue = getExcelValue(cell); map.put(column.getColumnName(), cellValue); } } iform.insert(importTemplate.getTableId(), map); } } // Excel2007 xlsx private void readExcel2007(XSSFWorkbook xssfWorkbook, int sheetAt, Long importTemplateId, Map mapData, int rowNum) { ImportTemplate importTemplate = importTemplateService.getByIdImportTemplate(importTemplateId); QueryWrapper query = new QueryWrapper(); query.eq("import_template_id", importTemplate.getImportTemplateId()); List columnList = importColumnService.list(query); List excelColumns = new ArrayList(); int dhIndex = 0; //读取第i个工作表 XSSFSheet sheet = xssfWorkbook.getSheetAt(sheetAt); //获取最后一行的num,即总行数。此处从0开始 int maxRow = sheet.getLastRowNum(); Row row = sheet.getRow(0); int totalCells = row.getPhysicalNumberOfCells(); for (int j = 0; j < totalCells; ++j) { Cell cell = row.getCell(j); Object cellValue = getExcelValue(cell); if (sheetAt == 1 && "案卷档号".equals(cellValue.toString())) { dhIndex = j; } excelColumns.add(cellValue.toString()); } for (int j = 1; j <= maxRow; j++) { try { Row rowValue = sheet.getRow(j); Map map = new HashMap(); if (sheetAt == 1) { Cell cell = rowValue.getCell(dhIndex); Object cellValue = getExcelValue(cell); String sql = "select id from cat_file_ajjxx where dh='" + cellValue + "'"; Long id = jdbcTemplate.queryForObject(sql, Long.class); map.put("AJ_ID", id); } for (int z = 0; z < columnList.size(); z++) { ImportColumn column = columnList.get(z); if ("2".equals(column.getLinkedData())) { String linkedType = column.getLinkedType(); String excelColunm = column.getExcelColunm(); int columnIndex = excelColumns.indexOf(excelColunm); if (columnIndex >= 0) { Cell cell = rowValue.getCell(columnIndex); Object cellValue = getExcelValue(cell); String[] split = linkedType.split("\\|"); String tableName = split[0]; String columnName = split[1]; String valueName = split[2]; String sql = "select " + valueName + " from " + tableName + " where " + columnName + "='" + cellValue + "'"; String columnValue = jdbcTemplate.queryForObject(sql, String.class); map.put(column.getColumnName(), columnValue); } } else { int columnIndex = excelColumns.indexOf(column.getExcelColunm()); if (columnIndex >= 0) { Cell cell = rowValue.getCell(columnIndex); Object cellValue = getExcelValue(cell); if ("工作时间".equals(column.getColumnName().toString())) { String string = cellValue.toString(); boolean contains = string.contains("-"); if (contains) { String[] split = string.split("-"); map.put("QSSJ", split[0]); map.put("ZZSJ", split[1]); } else { map.put("QSSJ", string); } } else { map.put(column.getColumnName(), cellValue); } } } } iform.insert(importTemplate.getTableId(), map); } catch (Exception e) { logger.info(e.getMessage(), e); } } } /** * 关联盒号关联 * * @param * @return */ @RequestMapping({"/packingIndex"}) @RequiresUser public ModelAndView packingIndex() { ModelAndView mv = new ModelAndView("gh/excel/packingExcel"); return mv; } /** * @param file 0 导入转孔信息 1 导入图幅信息 2 导入实物案卷信息 * @return * @throws LicenseException */ @RequestMapping({"/packingExcel"}) @ResponseBody @RequiresUser public Object packingExcel(@RequestParam(value = "file", required = false) MultipartFile file) throws LicenseException { try { relationPacking(file); return new AjaxResponse(true); } catch (Exception e) { logger.error(e.getMessage(), e); return new AjaxResponse(new ErrorInfo("导入失败"), false); } } private void relationPacking(MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); if (originalFilename.matches("^.+\\.(?i)(xls)$")) { //创建工作簿对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream); //读取第i个工作表 HSSFSheet sheet = hssfWorkbook.getSheetAt(0); int maxRow = sheet.getLastRowNum(); for (int j = 1; j <= maxRow; j++) { Row rowValue = sheet.getRow(j); Cell boxNumberCell = rowValue.getCell(0); Object boxNumber = getExcelValue(boxNumberCell); Cell storageLocationCell = rowValue.getCell(1); Object storageLocation = getExcelValue(storageLocationCell); //04 1 10 1 02 06 //ZO1 A10左 02列 06层 String update = "update BUS_PACKING_MANAGE set STORAGE_LOCATION ='" + storageLocation + "' where BOX_NUMBER = '" + boxNumber + "'"; jdbcTemplate.update(update); } } if (originalFilename.matches("^.+\\.(?i)(xlsx)$")) { //创建工作簿对象 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); XSSFSheet sheet = xssfWorkbook.getSheetAt(0); //获取最后一行的num,即总行数。此处从0开始 int maxRow = sheet.getLastRowNum(); Row row = sheet.getRow(0); for (int j = 1; j <= maxRow; j++) { Row rowValue = sheet.getRow(j); Cell boxNumberCell = rowValue.getCell(0); Object boxNumber = getExcelValue(boxNumberCell); Cell storageLocationCell = rowValue.getCell(1); Object storageLocationCode = getExcelValue(storageLocationCell); String storageLocation = parseStorageLocationWithEnum(storageLocationCode == null ? "" : storageLocationCode.toString()); String update = "update BUS_PACKING_MANAGE set STORAGE_LOCATION_CODE = '" + storageLocationCode + "', STORAGE_LOCATION ='" + storageLocation + "' where BOX_NUMBER = '" + boxNumber + "'"; jdbcTemplate.update(update); } } } public static String parseStorageLocationWithEnum(String code) { if (code == null || code.length() != 10) { throw new IllegalArgumentException("Invalid code format, expected 10 characters"); } // 提取各部分 String zoneCode = code.substring(0, 2); String zoneName = code.substring(2, 3); String rackCode = code.substring(3, 5); String sideCode = code.substring(5, 6); String column = code.substring(6, 8); String layer = code.substring(8, 10); // 使用枚举获取区域名称 String zoneStr = BoxEnum.getNameByCode(zoneCode); // 处理方向映射 String sideStr = "1".equals(sideCode) ? "左" : "右"; // 根据数字获取对应字母 String letter = BoxEnum.RackLetter.getLetterByNumber(zoneName); // 返回 "A" // 构造架号 String rackStr = letter + rackCode; // 组合最终结果 return String.format("%s-%s%s-%s列-%s层", zoneStr, rackStr, sideStr, column, layer); } public static String generateStorageLocationCode(String location) { // 示例输入: Z01-A01左-08列-02层 String[] parts = location.split("-"); String zoneStr = parts[0]; // Z01 String rackAndSide = parts[1]; // A01左 // 区域代码 (例如 Z01 -> 04) String zoneCode = BoxEnum.getCodeByName(zoneStr); // 架号中的字母与数字 (例如 A01 -> A=1, 01) String rackLetter = rackAndSide.substring(0, 1); // A String rackNumber = rackAndSide.substring(1, 3); // 01 String sideStr = rackAndSide.substring(3); // 左 or 右 // 获取字母对应的数字 (例如 A -> 1) // 根据数字获取对应字母 String rackLetterNum = BoxEnum.RackLetter.getNumberByLetter(rackLetter); // 返回 "A" // 方向代码 (左 -> 1, 右 -> 2) String sideCode = "左".equals(sideStr) ? "1" : "0"; // 拼接最终结果 return zoneCode + rackLetterNum + rackNumber + sideCode; } public static void main(String[] args) { // String s = parseStorageLocationWithEnum("0411010206"); String locationNumber = "Z01-A01左-08列-02层"; //0410110802 String s = generateStorageLocationCode(locationNumber); System.out.println(s); } }