rk
2026-01-30 e42918bd767de2526b66760a0ef8ca410b5f699c
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -4,15 +4,14 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@@ -42,7 +41,7 @@
     * 标题行号
     */
    private CellType changeType;
    private Map<String, XSSFPictureData> pictureList;
    /**
     * 构造函数
     * @param--path 导入文件,读取第一个工作表
@@ -146,12 +145,13 @@
    }
    public ExcelImporter(String fileName, InputStream in, int headerNum, int sheetIndex,CellType cellType)
        throws InvalidFormatException, IOException {
        ByteArrayOutputStream buffer = toByteArray(in);
        if (StringUtils.isBlank(fileName)){
            throw new RuntimeException("导入文档为空!");
        }else if(fileName.toLowerCase().endsWith("xls")){
            this.wb = new HSSFWorkbook(in);
            this.wb = new HSSFWorkbook(new ByteArrayInputStream(buffer.toByteArray()));
        }else if(fileName.toLowerCase().endsWith("xlsx")){
            this.wb = new XSSFWorkbook(in);
            this.wb = new XSSFWorkbook(new ByteArrayInputStream(buffer.toByteArray()));
        }else{
            throw new RuntimeException("文档格式不正确!");
        }
@@ -161,9 +161,27 @@
        this.sheet = this.wb.getSheetAt(sheetIndex);
        this.headerNum = headerNum;
        this.changeType = cellType;
        this.pictureList = ExcelPictureUtil.getExcelPictures(new ByteArrayInputStream(buffer.toByteArray()));
        log.debug("Initialize success.");
    }
    public static ByteArrayOutputStream toByteArray(InputStream inputStream) {
        try {
            // 缓存文件流
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            byte[] data = new byte[1024];
            int nRead;
            while ((nRead = inputStream.read(data, 0, data.length))!= -1) {
                buffer.write(data, 0, nRead);
            }
            buffer.flush();
           return  buffer;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
@@ -227,6 +245,9 @@
            return val;
        }
        return val;
    }
    public Map<String,XSSFPictureData> getExcelPictures(){
        return this.pictureList;
    }
    /**
@@ -309,63 +330,102 @@
            }
            StringBuilder sb = new StringBuilder();
            for (Object[] os : annotationList){
                Object val = this.getCellValue(row, column++);
                if (val != null){
                    ExcelColumn ef = (ExcelColumn)os[0];
                    // Get param type and type cast
                    Class<?> valType = Class.class;
                    if (os[1] instanceof Field){
                        valType = ((Field)os[1]).getType();
                    }else if(os[1] instanceof Method){
                        Method method = ((Method)os[1]);
                        if ("get".equals(method.getName().substring(0, 3))){
                            valType = method.getReturnType();
                        }else if("set".equals(method.getName().substring(0, 3))){
                            valType = ((Method)os[1]).getParameterTypes()[0];
                        }
                int tcolumn = column++;
                Object val = this.getCellValue(row, tcolumn);;
                ExcelColumn ef = (ExcelColumn)os[0];
                // Get param type and type cast
                Class<?> valType = Class.class;
                if (os[1] instanceof Field){
                    valType = ((Field)os[1]).getType();
                }else if(os[1] instanceof Method){
                    Method method = ((Method)os[1]);
                    if ("get".equals(method.getName().substring(0, 3))){
                        valType = method.getReturnType();
                    }else if("set".equals(method.getName().substring(0, 3))){
                        valType = ((Method)os[1]).getParameterTypes()[0];
                    }
                    //log.debug("Import value type: ["+i+","+column+"] " + valType);
                    try {
                        if (valType == String.class){
                            String s = String.valueOf(val.toString());
                            if(StringUtils.endsWith(s, ".0")){
                                val = StringUtils.substringBefore(s, ".0");
                            }else{
                                val = String.valueOf(val.toString()).trim();
                }
                if(ef.fieldType()== XSSFPictureData.class){
                    XSSFPictureData qrData = null;
                    if(val !=null){
                        String tid = String.valueOf(val.toString()).trim();
                        int start = tid.indexOf("(\"")+2;
                        int end = tid.indexOf("\",");
                        if(start>=0&& end>=1 && end>start){
                            String picId = tid.substring(start,end);
                            XSSFPictureData data = this.pictureList.get(picId);
                            if(data!= null && data.getData() != null){
                                qrData =data;
                            }
                        }
                        else if (valType == Integer.class){
                            val = Double.valueOf(val.toString()).intValue();
                        }else if (valType == Long.class){
                            val = Double.valueOf(val.toString()).longValue();
                        }else if (valType == Double.class){
                            val = Double.valueOf(val.toString());
                        }else if (valType == Float.class){
                            val = Float.valueOf(val.toString());
                        }else if (valType == Date.class){
                            val = DateUtil.getJavaDate((Double)val);
                        }else{
                            if (ef.fieldType() != Class.class){
                                val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
                            }else{
                                val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
                                    "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());
                    }
                    val = null;
                    //悬浮图片
                    List<XSSFPictureData> xfData = ExcelPictureUtil.getPicturesFromCell(this.sheet,row.getCell(tcolumn));
                    List<XSSFPictureData> valList =new ArrayList<>();
                    if(qrData!=null){
                        valList.add(qrData);
                    }
                    if(xfData!=null){
                        valList.addAll(xfData);
                    }
                    if (valType==List.class){
                        val =valList;
                    } else if ( valType==XSSFPictureData.class){
                        val = (valList!=null && valList.size()>0)?valList.get(0):null;
                    }
                }else{
                    if (val != null){
                        try {
                            if (valType == String.class){
                                String s = String.valueOf(val.toString());
                                if(StringUtils.endsWith(s, ".0")){
                                    val = StringUtils.substringBefore(s, ".0");
                                }else{
                                    val = String.valueOf(val.toString()).trim();
                                }
                            }
                            else if (valType == Integer.class){
                                val = Double.valueOf(val.toString()).intValue();
                            }else if (valType == Long.class){
                                val = Double.valueOf(val.toString()).longValue();
                            }else if (valType == Double.class){
                                val = Double.valueOf(val.toString());
                            }else if (valType == Float.class){
                                val = Float.valueOf(val.toString());
                            }else if (valType == Date.class){
                                val = DateUtil.getJavaDate((Double)val);
                            }else if (valType == XSSFPictureData.class){
                            }else{
                                if (ef.fieldType() != Class.class){
                                    val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
                                }else{
                                    val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
                                            "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());
                                }
                            }
                        } catch (Exception ex) {
                            log.info("Get cell value ["+i+","+column+"] error: " + ex.toString());
                            val = null;
                        }
                    } catch (Exception ex) {
                        log.info("Get cell value ["+i+","+column+"] error: " + ex.toString());
                        val = null;
                    }
                    // set entity value
                    if (os[1] instanceof Field){
                        Reflections.invokeSetter(e, ((Field)os[1]).getName(), val);
                    }else if (os[1] instanceof Method){
                        String mthodName = ((Method)os[1]).getName();
                        if ("get".equals(mthodName.substring(0, 3))){
                            mthodName = "set"+StringUtils.substringAfter(mthodName, "get");
                        }
                        Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});
                    }
                }
                 if (val != null){
                     try {
                         // set entity value
                         if (os[1] instanceof Field){
                             Reflections.invokeSetter(e, ((Field)os[1]).getName(), val);
                         }else if (os[1] instanceof Method){
                             String mthodName = ((Method)os[1]).getName();
                             if ("get".equals(mthodName.substring(0, 3))){
                                 mthodName = "set"+StringUtils.substringAfter(mthodName, "get");
                             }
                             Reflections.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});
                         }
                     }catch (Exception e1){
                         val =null;
                     }
                }else{
                }
                sb.append(val+", ");
            }