浏览代码

Excel支持设置导出类型&更换样式

RuoYi 5 年之前
父节点
当前提交
174ed02058

+ 21 - 0
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java

@@ -29,6 +29,11 @@ public @interface Excel
      */
     public String readConverterExp() default "";
 
+    /**
+     * 导出类型(0数字 1字符串)
+     */
+    public ColumnType cellType() default ColumnType.STRING;
+
     /**
      * 导出时在excel中每个列的高度 单位为字符
      */
@@ -89,4 +94,20 @@ public @interface Excel
             return this.value;
         }
     }
+
+    public enum ColumnType
+    {
+        NUMERIC(0), STRING(1);
+        private final int value;
+
+        ColumnType(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
 }

+ 83 - 34
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java

@@ -17,8 +17,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
-import org.apache.poi.hssf.usermodel.HSSFFont;
-import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined;
+import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.CellType;
@@ -29,6 +28,7 @@ import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.ss.usermodel.FillPatternType;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.VerticalAlignment;
@@ -40,6 +40,7 @@ import org.apache.poi.xssf.usermodel.XSSFDataValidation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.annotation.Excel.Type;
 import com.ruoyi.common.annotation.Excels;
 import com.ruoyi.common.config.Global;
@@ -84,6 +85,11 @@ public class ExcelUtil<T>
      */
     private Sheet sheet;
 
+    /**
+     * 样式列表
+     */
+    private Map<String, CellStyle> styles;
+
     /**
      * 导入导出数据列表
      */
@@ -376,10 +382,6 @@ public class ExcelUtil<T>
     {
         int startNo = index * sheetSize;
         int endNo = Math.min(startNo + sheetSize, list.size());
-        // 写入各条记录,每条记录对应excel表中的一行
-        CellStyle cs = wb.createCellStyle();
-        cs.setAlignment(HorizontalAlignment.CENTER);
-        cs.setVerticalAlignment(VerticalAlignment.CENTER);
         for (int i = startNo; i < endNo; i++)
         {
             row = sheet.createRow(i + 1 - startNo);
@@ -392,11 +394,55 @@ public class ExcelUtil<T>
                 Excel excel = (Excel) os[1];
                 // 设置实体类私有属性可访问
                 field.setAccessible(true);
-                this.addCell(excel, row, vo, field, column++, cs);
+                this.addCell(excel, row, vo, field, column++);
             }
         }
     }
 
+    /**
+     * 创建表格样式
+     * 
+     * @param wb 工作薄对象
+     * @return 样式列表
+     */
+    private Map<String, CellStyle> createStyles(Workbook wb)
+    {
+        // 写入各条记录,每条记录对应excel表中的一行
+        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
+        CellStyle style = wb.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        style.setBorderRight(BorderStyle.THIN);
+        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderLeft(BorderStyle.THIN);
+        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderTop(BorderStyle.THIN);
+        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderBottom(BorderStyle.THIN);
+        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        Font dataFont = wb.createFont();
+        dataFont.setFontName("Arial");
+        dataFont.setFontHeightInPoints((short) 10);
+        style.setFont(dataFont);
+        styles.put("data", style);
+
+        style = wb.createCellStyle();
+        style.cloneStyleFrom(styles.get("data"));
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        Font headerFont = wb.createFont();
+        headerFont.setFontName("Arial");
+        headerFont.setFontHeightInPoints((short) 10);
+        headerFont.setBold(true);
+        headerFont.setColor(IndexedColors.WHITE.getIndex());
+        style.setFont(headerFont);
+        styles.put("header", style);
+
+        return styles;
+    }
+
     /**
      * 创建单元格
      */
@@ -404,45 +450,49 @@ public class ExcelUtil<T>
     {
         // 创建列
         Cell cell = row.createCell(column);
-        // 设置列中写入内容为String类型
-        cell.setCellType(CellType.STRING);
-        // 写入列名
+        // 写入列信息
         cell.setCellValue(attr.name());
-        CellStyle cellStyle = createStyle(attr, row, column);
-        cell.setCellStyle(cellStyle);
+        setDataValidation(attr, row, column);
+        cell.setCellStyle(styles.get("header"));
         return cell;
     }
 
+    /**
+     * 设置单元格信息
+     * 
+     * @param value 单元格值
+     * @param attr 注解相关
+     * @param cell 单元格信息
+     */
+    public void setCellVo(Object value, Excel attr, Cell cell)
+    {
+        if (ColumnType.STRING == attr.cellType())
+        {
+            cell.setCellType(CellType.NUMERIC);
+            cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
+        }
+        else if (ColumnType.NUMERIC == attr.cellType())
+        {
+            cell.setCellType(CellType.NUMERIC);
+            cell.setCellValue(Integer.parseInt(value + ""));
+        }
+    }
+
     /**
      * 创建表格样式
      */
-    public CellStyle createStyle(Excel attr, Row row, int column)
+    public void setDataValidation(Excel attr, Row row, int column)
     {
-        CellStyle cellStyle = wb.createCellStyle();
-        cellStyle.setAlignment(HorizontalAlignment.CENTER);
-        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
         if (attr.name().indexOf("注:") >= 0)
         {
-            Font font = wb.createFont();
-            font.setColor(HSSFFont.COLOR_RED);
-            cellStyle.setFont(font);
-            cellStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());
             sheet.setColumnWidth(column, 6000);
         }
         else
         {
-            Font font = wb.createFont();
-            // 粗体显示
-            font.setBold(true);
-            // 选择需要用到的字体格式
-            cellStyle.setFont(font);
-            cellStyle.setFillForegroundColor(HSSFColorPredefined.LIGHT_YELLOW.getIndex());
             // 设置列宽
             sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
             row.setHeight((short) (attr.height() * 20));
         }
-        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
-        cellStyle.setWrapText(true);
         // 如果设置了提示信息则鼠标放上去提示.
         if (StringUtils.isNotEmpty(attr.prompt()))
         {
@@ -455,13 +505,12 @@ public class ExcelUtil<T>
             // 这里默认设了2-101列只能选择不能输入.
             setXSSFValidation(sheet, attr.combo(), 1, 100, column, column);
         }
-        return cellStyle;
     }
 
     /**
      * 添加单元格
      */
-    public Cell addCell(Excel attr, Row row, T vo, Field field, int column, CellStyle cs)
+    public Cell addCell(Excel attr, Row row, T vo, Field field, int column)
     {
         Cell cell = null;
         try
@@ -473,7 +522,7 @@ public class ExcelUtil<T>
             {
                 // 创建cell
                 cell = row.createCell(column);
-                cell.setCellStyle(cs);
+                cell.setCellStyle(styles.get("data"));
 
                 // 用于读取对象中的属性
                 Object value = getTargetValue(vo, field, attr);
@@ -489,9 +538,8 @@ public class ExcelUtil<T>
                 }
                 else
                 {
-                    cell.setCellType(CellType.STRING);
-                    // 如果数据存在就填入,不存在填入空格.
-                    cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
+                    // 设置列类型
+                    setCellVo(value, attr, cell);
                 }
             }
         }
@@ -752,6 +800,7 @@ public class ExcelUtil<T>
     public void createSheet(double sheetNo, int index)
     {
         this.sheet = wb.createSheet();
+        this.styles = createStyles(wb);
         // 设置工作表的名称.
         if (sheetNo == 0)
         {

+ 2 - 1
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java

@@ -6,6 +6,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.constant.ScheduleConstants;
 import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.utils.StringUtils;
@@ -21,7 +22,7 @@ public class SysJob extends BaseEntity implements Serializable
     private static final long serialVersionUID = 1L;
 
     /** 任务ID */
-    @Excel(name = "任务序号")
+    @Excel(name = "任务序号", cellType = ColumnType.NUMERIC)
     private Long jobId;
 
     /** 任务名称 */

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java

@@ -4,6 +4,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -16,7 +17,7 @@ public class SysConfig extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 参数主键 */
-    @Excel(name = "参数主键")
+    @Excel(name = "参数主键", cellType = ColumnType.NUMERIC)
     private Long configId;
 
     /** 参数名称 */

+ 3 - 2
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictData.java

@@ -4,6 +4,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.BaseEntity;
 
@@ -17,11 +18,11 @@ public class SysDictData extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 字典编码 */
-    @Excel(name = "字典编码")
+    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
     private Long dictCode;
 
     /** 字典排序 */
-    @Excel(name = "字典排序")
+    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
     private Long dictSort;
 
     /** 字典标签 */

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictType.java

@@ -4,6 +4,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -16,7 +17,7 @@ public class SysDictType extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 字典主键 */
-    @Excel(name = "字典主键")
+    @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
     private Long dictId;
 
     /** 字典名称 */

+ 11 - 10
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java

@@ -4,6 +4,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import java.util.Date;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -14,39 +15,39 @@ import com.ruoyi.common.core.domain.BaseEntity;
 public class SysLogininfor extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
-    
+
     /** ID */
-    @Excel(name = "序号")
+    @Excel(name = "序号", cellType = ColumnType.NUMERIC)
     private Long infoId;
-    
+
     /** 用户账号 */
     @Excel(name = "用户账号")
     private String loginName;
-    
+
     /** 登录状态 0成功 1失败 */
     @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败")
     private String status;
-    
+
     /** 登录IP地址 */
     @Excel(name = "登录地址")
     private String ipaddr;
-    
+
     /** 登录地点 */
     @Excel(name = "登录地点")
     private String loginLocation;
-    
+
     /** 浏览器类型 */
     @Excel(name = "浏览器")
     private String browser;
-    
+
     /** 操作系统 */
     @Excel(name = "操作系统 ")
     private String os;
-    
+
     /** 提示消息 */
     @Excel(name = "提示消息")
     private String msg;
-    
+
     /** 访问时间 */
     @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date loginTime;

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java

@@ -4,6 +4,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import java.util.Date;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -16,7 +17,7 @@ public class SysOperLog extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 日志主键 */
-    @Excel(name = "操作序号")
+    @Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
     private Long operId;
 
     /** 操作模块 */

+ 3 - 2
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java

@@ -4,6 +4,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -16,7 +17,7 @@ public class SysPost extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 岗位序号 */
-    @Excel(name = "岗位序号")
+    @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC)
     private Long postId;
 
     /** 岗位编码 */
@@ -28,7 +29,7 @@ public class SysPost extends BaseEntity
     private String postName;
 
     /** 岗位排序 */
-    @Excel(name = "岗位排序")
+    @Excel(name = "岗位排序", cellType = ColumnType.NUMERIC)
     private String postSort;
 
     /** 状态(0正常 1停用) */

+ 3 - 3
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRole.java

@@ -4,6 +4,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
@@ -16,7 +17,7 @@ public class SysRole extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 角色ID */
-    @Excel(name = "角色序号")
+    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
     private Long roleId;
 
     /** 角色名称 */
@@ -28,7 +29,7 @@ public class SysRole extends BaseEntity
     private String roleKey;
 
     /** 角色排序 */
-    @Excel(name = "角色排序")
+    @Excel(name = "角色排序", cellType = ColumnType.NUMERIC)
     private String roleSort;
 
     /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限) */
@@ -156,7 +157,6 @@ public class SysRole extends BaseEntity
         this.deptIds = deptIds;
     }
 
-    @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
             .append("roleId", getRoleId())

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java

@@ -6,6 +6,7 @@ import javax.validation.constraints.*;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.annotation.Excel.ColumnType;
 import com.ruoyi.common.annotation.Excel.Type;
 import com.ruoyi.common.annotation.Excels;
 import com.ruoyi.common.core.domain.BaseEntity;
@@ -20,7 +21,7 @@ public class SysUser extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 用户ID */
-    @Excel(name = "用户序号", prompt = "用户编号")
+    @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
     private Long userId;
 
     /** 部门ID */