作者 RuoYi

Excel注解支持自动统计数据总和

@@ -101,6 +101,11 @@ public @interface Excel @@ -101,6 +101,11 @@ public @interface Excel
101 public String targetAttr() default ""; 101 public String targetAttr() default "";
102 102
103 /** 103 /**
  104 + * 是否自动统计数据,在最后追加一行统计数据总和
  105 + */
  106 + public boolean isStatistics() default false;
  107 +
  108 + /**
104 * 字段类型(0:导出导入;1:仅导出;2:仅导入) 109 * 字段类型(0:导出导入;1:仅导出;2:仅导入)
105 */ 110 */
106 Type type() default Type.ALL; 111 Type type() default Type.ALL;
@@ -16,6 +16,7 @@ import java.util.Date; @@ -16,6 +16,7 @@ import java.util.Date;
16 import java.util.HashMap; 16 import java.util.HashMap;
17 import java.util.List; 17 import java.util.List;
18 import java.util.Map; 18 import java.util.Map;
  19 +import java.util.Set;
19 import java.util.UUID; 20 import java.util.UUID;
20 import java.util.stream.Collectors; 21 import java.util.stream.Collectors;
21 import org.apache.poi.hssf.usermodel.HSSFDateUtil; 22 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
@@ -104,6 +105,16 @@ public class ExcelUtil<T> @@ -104,6 +105,16 @@ public class ExcelUtil<T>
104 private List<Object[]> fields; 105 private List<Object[]> fields;
105 106
106 /** 107 /**
  108 + * 统计列表
  109 + */
  110 + private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
  111 +
  112 + /**
  113 + * 数字格式
  114 + */
  115 + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
  116 +
  117 + /**
107 * 实体对象 118 * 实体对象
108 */ 119 */
109 public Class<T> clazz; 120 public Class<T> clazz;
@@ -342,6 +353,7 @@ public class ExcelUtil<T> @@ -342,6 +353,7 @@ public class ExcelUtil<T>
342 if (Type.EXPORT.equals(type)) 353 if (Type.EXPORT.equals(type))
343 { 354 {
344 fillExcelData(index, row); 355 fillExcelData(index, row);
  356 + addStatisticsRow();
345 } 357 }
346 } 358 }
347 String filename = encodingFilename(sheetName); 359 String filename = encodingFilename(sheetName);
@@ -448,6 +460,15 @@ public class ExcelUtil<T> @@ -448,6 +460,15 @@ public class ExcelUtil<T>
448 headerFont.setColor(IndexedColors.WHITE.getIndex()); 460 headerFont.setColor(IndexedColors.WHITE.getIndex());
449 style.setFont(headerFont); 461 style.setFont(headerFont);
450 styles.put("header", style); 462 styles.put("header", style);
  463 +
  464 + style = wb.createCellStyle();
  465 + style.setAlignment(HorizontalAlignment.CENTER);
  466 + style.setVerticalAlignment(VerticalAlignment.CENTER);
  467 + Font totalFont = wb.createFont();
  468 + totalFont.setFontName("Arial");
  469 + totalFont.setFontHeightInPoints((short) 10);
  470 + style.setFont(totalFont);
  471 + styles.put("total", style);
451 472
452 return styles; 473 return styles;
453 } 474 }
@@ -560,6 +581,7 @@ public class ExcelUtil<T> @@ -560,6 +581,7 @@ public class ExcelUtil<T>
560 // 设置列类型 581 // 设置列类型
561 setCellVo(value, attr, cell); 582 setCellVo(value, attr, cell);
562 } 583 }
  584 + addStatisticsData(column, Convert.toStr(value), attr);
563 } 585 }
564 } 586 }
565 catch (Exception e) 587 catch (Exception e)
@@ -727,6 +749,53 @@ public class ExcelUtil<T> @@ -727,6 +749,53 @@ public class ExcelUtil<T>
727 } 749 }
728 750
729 /** 751 /**
  752 + * 合计统计信息
  753 + */
  754 + private void addStatisticsData(Integer index, String text, Excel entity)
  755 + {
  756 + if (entity != null && entity.isStatistics())
  757 + {
  758 + Double temp = 0D;
  759 + if (!statistics.containsKey(index))
  760 + {
  761 + statistics.put(index, temp);
  762 + }
  763 + try
  764 + {
  765 + temp = Double.valueOf(text);
  766 + }
  767 + catch (NumberFormatException e)
  768 + {
  769 + }
  770 + statistics.put(index, statistics.get(index) + temp);
  771 + }
  772 + }
  773 +
  774 + /**
  775 + * 创建统计行
  776 + */
  777 + public void addStatisticsRow()
  778 + {
  779 + if (statistics.size() > 0)
  780 + {
  781 + Cell cell = null;
  782 + Row row = sheet.createRow(sheet.getLastRowNum() + 1);
  783 + Set<Integer> keys = statistics.keySet();
  784 + cell = row.createCell(0);
  785 + cell.setCellStyle(styles.get("total"));
  786 + cell.setCellValue("合计");
  787 +
  788 + for (Integer key : keys)
  789 + {
  790 + cell = row.createCell(key);
  791 + cell.setCellStyle(styles.get("total"));
  792 + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key)));
  793 + }
  794 + statistics.clear();
  795 + }
  796 + }
  797 +
  798 + /**
730 * 编码文件名 799 * 编码文件名
731 */ 800 */
732 public String encodingFilename(String filename) 801 public String encodingFilename(String filename)