浏览代码

!160 【轻量级pr】poi ExcelUtil 增加对java8 日期的支持
Merge pull request !160 from dazer007/excelUtil_add_java8_date

若依 4 年之前
父节点
当前提交
e059ed9c7f

+ 26 - 6
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java

@@ -3,12 +3,13 @@ package com.ruoyi.common.core.utils;
3 3
 import java.lang.management.ManagementFactory;
4 4
 import java.text.ParseException;
5 5
 import java.text.SimpleDateFormat;
6
+import java.time.*;
6 7
 import java.util.Date;
7 8
 import org.apache.commons.lang3.time.DateFormatUtils;
8 9
 
9 10
 /**
10 11
  * 时间工具类
11
- * 
12
+ *
12 13
  * @author ruoyi
13 14
  */
14 15
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
@@ -22,15 +23,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
22 23
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
23 24
 
24 25
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
25
-    
26
+
26 27
     private static String[] parsePatterns = {
27
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
28
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
28 29
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
29 30
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
30 31
 
31 32
     /**
32 33
      * 获取当前Date型日期
33
-     * 
34
+     *
34 35
      * @return Date() 当前日期
35 36
      */
36 37
     public static Date getNowDate()
@@ -40,7 +41,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
40 41
 
41 42
     /**
42 43
      * 获取当前日期, 默认格式为yyyy-MM-dd
43
-     * 
44
+     *
44 45
      * @return String
45 46
      */
46 47
     public static String getDate()
@@ -121,7 +122,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
121 122
             return null;
122 123
         }
123 124
     }
124
-    
125
+
125 126
     /**
126 127
      * 获取服务器启动时间
127 128
      */
@@ -152,4 +153,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
152 153
         // long sec = diff % nd % nh % nm / ns;
153 154
         return day + "天" + hour + "小时" + min + "分钟";
154 155
     }
156
+
157
+    /**
158
+     * 增加 LocalDateTime ==> Date
159
+     */
160
+    public static Date toDate(LocalDateTime temporalAccessor)
161
+    {
162
+        ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
163
+        return Date.from(zdt.toInstant());
164
+    }
165
+
166
+    /**
167
+     * 增加 LocalDate ==> Date
168
+     */
169
+    public static Date toDate(LocalDate temporalAccessor)
170
+    {
171
+        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
172
+        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
173
+        return Date.from(zdt.toInstant());
174
+    }
155 175
 }

+ 54 - 27
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java

@@ -6,6 +6,8 @@ import java.lang.reflect.Field;
6 6
 import java.lang.reflect.Method;
7 7
 import java.math.BigDecimal;
8 8
 import java.text.DecimalFormat;
9
+import java.time.LocalDate;
10
+import java.time.LocalDateTime;
9 11
 import java.util.ArrayList;
10 12
 import java.util.Arrays;
11 13
 import java.util.Comparator;
@@ -56,7 +58,7 @@ import com.ruoyi.common.core.utils.reflect.ReflectUtils;
56 58
 
57 59
 /**
58 60
  * Excel相关处理
59
- * 
61
+ *
60 62
  * @author ruoyi
61 63
  */
62 64
 public class ExcelUtil<T>
@@ -109,7 +111,7 @@ public class ExcelUtil<T>
109 111
      * 当前行号
110 112
      */
111 113
     private int rownum;
112
-    
114
+
113 115
     /**
114 116
      * 标题
115 117
      */
@@ -174,7 +176,7 @@ public class ExcelUtil<T>
174 176
 
175 177
     /**
176 178
      * 对excel表单默认第一个索引名转换成list
177
-     * 
179
+     *
178 180
      * @param is 输入流
179 181
      * @return 转换后集合
180 182
      */
@@ -185,7 +187,7 @@ public class ExcelUtil<T>
185 187
 
186 188
     /**
187 189
      * 对excel表单默认第一个索引名转换成list
188
-     * 
190
+     *
189 191
      * @param is 输入流
190 192
      * @param titleNum 标题占用行数
191 193
      * @return 转换后集合
@@ -197,7 +199,7 @@ public class ExcelUtil<T>
197 199
 
198 200
     /**
199 201
      * 对excel表单指定表格索引名转换成list
200
-     * 
202
+     *
201 203
      * @param sheetName 表格索引名
202 204
      * @param titleNum 标题占用行数
203 205
      * @param is 输入流
@@ -282,7 +284,7 @@ public class ExcelUtil<T>
282 284
                             String dateFormat = field.getAnnotation(Excel.class).dateFormat();
283 285
                             if (StringUtils.isNotEmpty(dateFormat))
284 286
                             {
285
-                                val = DateUtils.parseDateToStr(dateFormat, (Date) val);
287
+                                val = this.parseDateToStr(dateFormat, (Date) val);
286 288
                             }
287 289
                             else
288 290
                             {
@@ -351,7 +353,7 @@ public class ExcelUtil<T>
351 353
 
352 354
     /**
353 355
      * 对list数据源将其里面的数据导入到excel表单
354
-     * 
356
+     *
355 357
      * @param response 返回数据
356 358
      * @param list 导出数据集合
357 359
      * @param sheetName 工作表的名称
@@ -365,7 +367,7 @@ public class ExcelUtil<T>
365 367
 
366 368
     /**
367 369
      * 对list数据源将其里面的数据导入到excel表单
368
-     * 
370
+     *
369 371
      * @param response 返回数据
370 372
      * @param list 导出数据集合
371 373
      * @param sheetName 工作表的名称
@@ -383,13 +385,13 @@ public class ExcelUtil<T>
383 385
 
384 386
     /**
385 387
      * 对list数据源将其里面的数据导入到excel表单
386
-     * 
388
+     *
387 389
      * @param sheetName 工作表的名称
388 390
      * @return 结果
389 391
      */
390 392
     /**
391 393
      * 对list数据源将其里面的数据导入到excel表单
392
-     * 
394
+     *
393 395
      * @param sheetName 工作表的名称
394 396
      * @return 结果
395 397
      */
@@ -400,7 +402,7 @@ public class ExcelUtil<T>
400 402
 
401 403
     /**
402 404
      * 对list数据源将其里面的数据导入到excel表单
403
-     * 
405
+     *
404 406
      * @param sheetName 工作表的名称
405 407
      * @param title 标题
406 408
      * @return 结果
@@ -415,7 +417,7 @@ public class ExcelUtil<T>
415 417
 
416 418
     /**
417 419
      * 对list数据源将其里面的数据导入到excel表单
418
-     * 
420
+     *
419 421
      * @return 结果
420 422
      */
421 423
     public void exportExcel(HttpServletResponse response)
@@ -465,7 +467,7 @@ public class ExcelUtil<T>
465 467
 
466 468
     /**
467 469
      * 填充excel数据
468
-     * 
470
+     *
469 471
      * @param index 序号
470 472
      * @param row 单元格行
471 473
      */
@@ -490,7 +492,7 @@ public class ExcelUtil<T>
490 492
 
491 493
     /**
492 494
      * 创建表格样式
493
-     * 
495
+     *
494 496
      * @param wb 工作薄对象
495 497
      * @return 样式列表
496 498
      */
@@ -582,7 +584,7 @@ public class ExcelUtil<T>
582 584
 
583 585
     /**
584 586
      * 设置单元格信息
585
-     * 
587
+     *
586 588
      * @param value 单元格值
587 589
      * @param attr 注解相关
588 590
      * @param cell 单元格信息
@@ -701,7 +703,7 @@ public class ExcelUtil<T>
701 703
                 String separator = attr.separator();
702 704
                 if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
703 705
                 {
704
-                    cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
706
+                    cell.setCellValue(this.parseDateToStr(dateFormat, (Date) value));
705 707
                 }
706 708
                 else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
707 709
                 {
@@ -732,7 +734,7 @@ public class ExcelUtil<T>
732 734
 
733 735
     /**
734 736
      * 设置 POI XSSFSheet 单元格提示
735
-     * 
737
+     *
736 738
      * @param sheet 表单
737 739
      * @param promptTitle 提示标题
738 740
      * @param promptContent 提示内容
@@ -755,7 +757,7 @@ public class ExcelUtil<T>
755 757
 
756 758
     /**
757 759
      * 设置某些列的值只能输入预制的数据,显示下拉框.
758
-     * 
760
+     *
759 761
      * @param sheet 要设置的sheet.
760 762
      * @param textlist 下拉框显示的内容
761 763
      * @param firstRow 开始行
@@ -789,7 +791,7 @@ public class ExcelUtil<T>
789 791
 
790 792
     /**
791 793
      * 解析导出值 0=男,1=女,2=未知
792
-     * 
794
+     *
793 795
      * @param propertyValue 参数值
794 796
      * @param converterExp 翻译注解
795 797
      * @param separator 分隔符
@@ -826,7 +828,7 @@ public class ExcelUtil<T>
826 828
 
827 829
     /**
828 830
      * 反向解析值 男=0,女=1,未知=2
829
-     * 
831
+     *
830 832
      * @param propertyValue 参数值
831 833
      * @param converterExp 翻译注解
832 834
      * @param separator 分隔符
@@ -863,7 +865,7 @@ public class ExcelUtil<T>
863 865
 
864 866
     /**
865 867
      * 数据处理器
866
-     * 
868
+     *
867 869
      * @param value 数据值
868 870
      * @param excel 数据注解
869 871
      * @return
@@ -931,7 +933,7 @@ public class ExcelUtil<T>
931 933
 
932 934
     /**
933 935
      * 获取bean中的属性值
934
-     * 
936
+     *
935 937
      * @param vo 实体对象
936 938
      * @param field 字段
937 939
      * @param excel 注解
@@ -962,7 +964,7 @@ public class ExcelUtil<T>
962 964
 
963 965
     /**
964 966
      * 以类的属性的get方法方法形式获取值
965
-     * 
967
+     *
966 968
      * @param o
967 969
      * @param name
968 970
      * @return value
@@ -1057,7 +1059,7 @@ public class ExcelUtil<T>
1057 1059
 
1058 1060
     /**
1059 1061
      * 创建工作表
1060
-     * 
1062
+     *
1061 1063
      * @param sheetNo sheet数量
1062 1064
      * @param index 序号
1063 1065
      */
@@ -1074,7 +1076,7 @@ public class ExcelUtil<T>
1074 1076
 
1075 1077
     /**
1076 1078
      * 获取单元格值
1077
-     * 
1079
+     *
1078 1080
      * @param row 获取的行
1079 1081
      * @param column 获取单元格列号
1080 1082
      * @return 单元格值
@@ -1134,7 +1136,7 @@ public class ExcelUtil<T>
1134 1136
 
1135 1137
     /**
1136 1138
      * 判断是否是空行
1137
-     * 
1139
+     *
1138 1140
      * @param row 判断的行
1139 1141
      * @return
1140 1142
      */
@@ -1154,4 +1156,29 @@ public class ExcelUtil<T>
1154 1156
         }
1155 1157
         return true;
1156 1158
     }
1157
-}
1159
+
1160
+    /**
1161
+     * 增加ExcelUtil对java8 日期的支持
1162
+     * 格式化日期,日期可能是:{@link Date}、{@link LocalDateTime}、 {@link LocalDate} 其他日期暂不支持
1163
+     * @param dateFormat 日期格式
1164
+     * @param val 被格式化的日期对象
1165
+     * @see DateUtils#parseDateToStr(String, Date)
1166
+     */
1167
+    private String parseDateToStr(final String dateFormat, Object val)
1168
+    {
1169
+        if (val == null) {
1170
+            return "";
1171
+        }
1172
+        String str;
1173
+        if (val instanceof Date) {
1174
+            str = DateUtils.parseDateToStr(dateFormat, (Date) val);
1175
+        } else if (val instanceof LocalDateTime) {
1176
+            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val));
1177
+        } else if (val instanceof LocalDate) {
1178
+            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val));
1179
+        } else {
1180
+            str = val.toString();
1181
+        }
1182
+        return str;
1183
+    }
1184
+}