package com.zy.asrs.wms.utils; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.wms.asrs.entity.MatField; import com.zy.asrs.wms.asrs.entity.template.OrderTemplate; import io.swagger.annotations.ApiModelProperty; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by vincent on 2/17/2024 */ public class ExcelUtil { public static void build(Workbook workbook, HttpServletResponse response) { response.reset(); Utils.cors(response); response.setContentType("application/octet-stream; charset=utf-8"); try { response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("export", "UTF-8")); workbook.write(response.getOutputStream()); } catch (IOException ignore) {} } public static Workbook create(List list, Class clz) { return create(list, clz, null); } public static Workbook create(List list, Class clz, List dynamicFields) { HSSFWorkbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet(clz.getSimpleName()); Row header = sheet.createRow(0); Field[] fields = Cools.getAllFields(clz); int headerIdx = 0; for (Field field : fields) { if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())) { continue; } String memo = "未知"; if (field.isAnnotationPresent(ApiModelProperty.class)) { memo = field.getAnnotation(ApiModelProperty.class).value() + "[" + field.getName() + "]"; } header.createCell(headerIdx).setCellValue(memo); headerIdx++; } //动态字段 if(dynamicFields != null){ for (MatField field : dynamicFields) { header.createCell(headerIdx).setCellValue(field.getDescribe() + "[" + field.getName() + "]"); headerIdx++; } } int rowIndex = 1; for (T t : list) { Row row = sheet.createRow(rowIndex++); int cellIndex = 0; for (Field field : fields) { if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers())) { continue; } field.setAccessible(true); // 此行很重要,特别是字段为private时 Object value = null; try { value = field.get(t); } catch (IllegalAccessException e) { e.printStackTrace(); } if (value != null) { if (value instanceof Date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); row.createCell(cellIndex).setCellValue(sdf.format((Date) value)); } else { row.createCell(cellIndex).setCellValue(value.toString()); } } cellIndex++; } //动态字段 if(dynamicFields != null){ for (Field field : fields) { if (field.getName().equals("dynamicFields")) { try { Map map = (Map) field.get(t); for (MatField matField : dynamicFields) { Object value = map.get(matField.getName()); if(value != null){ row.createCell(cellIndex).setCellValue(value.toString()); cellIndex++; } } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } for (int i = 0; i <= fields.length; i++) { sheet.autoSizeColumn(i); } return workbook; } public static List parseExcelFile(MultipartFile file, Class clz) { List dataList = new ArrayList<>(); try (Workbook workbook = new HSSFWorkbook(file.getInputStream())) { ArrayList> list = new ArrayList<>(); ArrayList fields = new ArrayList<>(); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { HashMap map = new HashMap<>(); if (!fields.isEmpty()) { for (String field : fields) { map.put(field, null); } list.add(map); } for (Cell cell : row) { if (cell.getRowIndex() == 0) { Pattern pattern = Pattern.compile("\\[(.*?)\\]"); Matcher matcher = pattern.matcher(cell.getStringCellValue()); while (matcher.find()) { fields.add(matcher.group(1)); } }else { String value = ""; if(cell.getCellType() == CellType.NUMERIC.getCode()) { // 先将数字转换为字符串 value = String.valueOf(cell.getNumericCellValue()); // 处理字符串value } else if(cell.getCellType() == CellType.STRING.getCode()) { // 直接获取字符串值 value = cell.getStringCellValue(); // 处理字符串value } map.put(fields.get(cell.getColumnIndex()), value); } } } for (HashMap map : list) { T t = ExcelUtil.parseData(clz, map); dataList.add(t); } } catch (IOException e) { e.printStackTrace(); } return dataList; } public static T parseData(Class clz, Map map) { try { T newInstance = clz.newInstance(); Field[] fields = Cools.getAllFields(clz); for (Field field : fields) { field.setAccessible(true); if (!map.containsKey(field.getName())) { if (Modifier.isTransient(field.getModifiers()) && field.getName().equals("dynamicFields")) { Method method = clz.getMethod("syncFieldMap", Map.class); method.invoke(newInstance, map); } continue; } if (map.get(field.getName()) == null) { continue; } // 判断字段类型并赋值 if (field.getType() == String.class) { field.set(newInstance, String.valueOf(map.get(field.getName()))); } else if (field.getType() == Integer.class) { field.set(newInstance, Integer.parseInt(map.get(field.getName()).toString())); } else if (field.getType() == Float.class) { field.set(newInstance, Float.parseFloat(map.get(field.getName()).toString())); } else if (field.getType() == Double.class) { field.set(newInstance, Double.parseDouble(map.get(field.getName()).toString())); } else if (field.getType() == Boolean.class) { field.set(newInstance, Boolean.parseBoolean(map.get(field.getName()).toString())); } } return newInstance; } catch (Exception e) { e.printStackTrace(); } return null; } }