mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	Excel注解支持自定义数据处理器
This commit is contained in:
		@@ -5,6 +5,7 @@ import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义导出Excel数据注解
 | 
			
		||||
@@ -108,7 +109,17 @@ public @interface Excel
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右)
 | 
			
		||||
     */
 | 
			
		||||
    Align align() default Align.AUTO;
 | 
			
		||||
    public Align align() default Align.AUTO;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 自定义数据处理器
 | 
			
		||||
     */
 | 
			
		||||
    public Class<?> handler() default ExcelHandlerAdapter.class;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 自定义数据处理器参数
 | 
			
		||||
     */
 | 
			
		||||
    public String[] args() default {};
 | 
			
		||||
 | 
			
		||||
    public enum Align
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
package com.ruoyi.common.utils.poi;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Excel数据格式处理适配器
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public interface ExcelHandlerAdapter
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 格式化
 | 
			
		||||
     * 
 | 
			
		||||
     * @param value 单元格数据值
 | 
			
		||||
     * @param args excel注解args参数组
 | 
			
		||||
     *
 | 
			
		||||
     * @return 处理后的值
 | 
			
		||||
     */
 | 
			
		||||
    Object format(Object value, String[] args);
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,7 @@ import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.text.DecimalFormat;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -333,6 +334,10 @@ public class ExcelUtil<T>
 | 
			
		||||
                        {
 | 
			
		||||
                            val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (!attr.handler().equals(ExcelHandlerAdapter.class))
 | 
			
		||||
                        {
 | 
			
		||||
                            val = dataFormatHandlerAdapter(val, attr);
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures))
 | 
			
		||||
                        {
 | 
			
		||||
                            PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey());
 | 
			
		||||
@@ -729,6 +734,10 @@ public class ExcelUtil<T>
 | 
			
		||||
                {
 | 
			
		||||
                    cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString());
 | 
			
		||||
                }
 | 
			
		||||
                else if (!attr.handler().equals(ExcelHandlerAdapter.class))
 | 
			
		||||
                {
 | 
			
		||||
                    cell.setCellValue(dataFormatHandlerAdapter(value, attr));
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    // 设置列类型
 | 
			
		||||
@@ -901,6 +910,28 @@ public class ExcelUtil<T>
 | 
			
		||||
        return DictUtils.getDictValue(dictType, dictLabel, separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 数据处理器
 | 
			
		||||
     * 
 | 
			
		||||
     * @param value 数据值
 | 
			
		||||
     * @param excel 数据注解
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    public String dataFormatHandlerAdapter(Object value, Excel excel)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            Object instance = excel.handler().newInstance();
 | 
			
		||||
            Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class });
 | 
			
		||||
            value = formatMethod.invoke(instance, value, excel.args());
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("不能格式化数据 " + excel.handler(), e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        return Convert.toStr(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 合计统计信息
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user