依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.2.6</version>
  5. </dependency>
  1. package cn.visight;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.write.builder.ExcelWriterBuilder;
  4. import java.util.*;
  5. import java.util.stream.Collectors;
  6. public class ExcelTest {
  7. public static void main(String args[]) {
  8. // 文件输出位置
  9. String fileName = "D:\\visi\\workspace\\统计.xlsx";
  10. Set<String> allDateList = new HashSet<>();
  11. Set<String> allOutletsNameList = new HashSet();
  12. List<XData> dataList = getDataList();
  13. dataList.forEach(r -> {
  14. // 1.获取所有的日期List
  15. allDateList.add(r.getDate());
  16. // 2.获取所有的名字Map
  17. allOutletsNameList.add(r.getOutletsName());
  18. });
  19. // 3.获取所有的日期对应的数据Map
  20. Map<String, List<XData>> date2XDataMap = dataList.stream().collect(Collectors.groupingBy(XData::getDate));
  21. ExcelWriterBuilder builder = EasyExcel.write(fileName);
  22. List<List<String>> headData = getExcelHeadData(allOutletsNameList);
  23. List<List<Object>> excelDataList = getExcelDataList(allDateList, allOutletsNameList, date2XDataMap);
  24. builder.head(headData).sheet("统计数据").doWrite(excelDataList);
  25. }
  26. private static List<List<Object>> getExcelDataList(Set<String> allDateList, Set<String> allOutletsNameList, Map<String, List<XData>> date2XDataMap) {
  27. List<List<Object>> excelDatalist = new ArrayList<>();
  28. //网点小计
  29. Map<String, Subtotal> outletsName2Subtotal = new HashMap<>();
  30. //过包总计
  31. Integer totalNumCount = 0;
  32. //违禁品总计
  33. Integer dangerNumCount = 0;
  34. // 2.获取excel表数据
  35. for (String currDate : allDateList) {
  36. List<Object> rowData = new ArrayList<>();
  37. rowData.add(currDate);
  38. for (String outletsName : allOutletsNameList) {
  39. //初始化小计数据
  40. Subtotal subtotal = outletsName2Subtotal.get(outletsName);
  41. if (subtotal == null) {
  42. outletsName2Subtotal.put(outletsName, new Subtotal(0, 0));
  43. }
  44. List<XData> numList = date2XDataMap.get(currDate);
  45. boolean isNotExist = false;
  46. for (XData xData : numList) {
  47. if (outletsName.equals(xData.getOutletsName())) {
  48. Integer dangerNum = xData.getDangerNum() == null ? 0 : xData.getDangerNum();
  49. Integer totalNum = xData.getTotalNum() == null ? 0 : xData.getTotalNum();
  50. rowData.add(totalNum);
  51. rowData.add(dangerNum);
  52. isNotExist = false;
  53. //统计小计数量
  54. Subtotal currSubtotal = outletsName2Subtotal.get(outletsName);
  55. currSubtotal.setSubTotalNum(currSubtotal.getSubTotalNum() + totalNum);
  56. currSubtotal.setSubDangerNum(currSubtotal.getSubDangerNum() + dangerNum);
  57. //统计总计数量
  58. totalNumCount += totalNum;
  59. dangerNumCount += dangerNum;
  60. break;
  61. } else {
  62. isNotExist = true;
  63. }
  64. }
  65. //没有该网点的数量,则给默认值0
  66. if (isNotExist) {
  67. rowData.add(0);
  68. rowData.add(0);
  69. }
  70. }
  71. excelDatalist.add(rowData);
  72. }
  73. // 3.存入小计
  74. List<Object> rowSubtotalData = new ArrayList<>();
  75. rowSubtotalData.add("小计");
  76. allOutletsNameList.forEach(outletsName -> {
  77. Subtotal subtotal = outletsName2Subtotal.get(outletsName);
  78. Integer subTotalNum = subtotal.getSubTotalNum();
  79. Integer subDangerNum = subtotal.getSubDangerNum();
  80. rowSubtotalData.add(subTotalNum);
  81. rowSubtotalData.add(subDangerNum);
  82. });
  83. excelDatalist.add(rowSubtotalData);
  84. // 4.存入总计
  85. List<Object> rowTotalCountData = new ArrayList<>();
  86. rowTotalCountData.add("过包总计");
  87. rowTotalCountData.add(totalNumCount);
  88. excelDatalist.add(rowTotalCountData);
  89. List<Object> rowDangerCountData = new ArrayList<>();
  90. rowDangerCountData.add("违禁品数总计");
  91. rowDangerCountData.add(dangerNumCount);
  92. excelDatalist.add(rowDangerCountData);
  93. return excelDatalist;
  94. }
  95. private static List<List<String>> getExcelHeadData(Set<String> allOutletsNameList) {
  96. List<List<String>> list = new ArrayList<>();
  97. // 1.获取excel表头
  98. List<String> head0 = new ArrayList<>();
  99. head0.add("网点\n数目\n日期");
  100. list.add(head0);
  101. List<String> childrenHeadTitleList = new ArrayList<>();
  102. childrenHeadTitleList.add("总数");
  103. childrenHeadTitleList.add("违禁品数");
  104. allOutletsNameList.forEach(outletsName -> {
  105. childrenHeadTitleList.forEach(childName -> {
  106. List<String> head = new ArrayList<>();
  107. head.add(outletsName);
  108. head.add(childName);
  109. list.add(head);
  110. });
  111. });
  112. return list;
  113. }
  114. private static List<XData> getDataList() {
  115. List<XData> list = new ArrayList<>();
  116. list.add(new XData("2021-08-19", 239, 0, "韵达"));
  117. list.add(new XData("2021-08-19", 6, 8, "申通"));
  118. list.add(new XData("2021-08-20", 5, 0, "德邦"));
  119. list.add(new XData("2021-08-20", 623, 0, "韵达"));
  120. list.add(new XData("2021-08-20", 74, 2, "长途汽车站"));
  121. list.add(new XData("2021-08-20", 2, 3, "申通"));
  122. return list;
  123. }
  124. }
  125. class XData {
  126. private String date;
  127. private String outletsName;
  128. private Integer totalNum;
  129. private Integer dangerNum;
  130. public XData(String date, Integer totalNum, Integer dangerNum, String outletsName) {
  131. this.date = date;
  132. this.outletsName = outletsName;
  133. this.totalNum = totalNum;
  134. this.dangerNum = dangerNum;
  135. }
  136. public String getDate() {
  137. return date;
  138. }
  139. public void setDate(String date) {
  140. this.date = date;
  141. }
  142. public String getOutletsName() {
  143. return outletsName;
  144. }
  145. public void setOutletsName(String outletsName) {
  146. this.outletsName = outletsName;
  147. }
  148. public Integer getTotalNum() {
  149. return totalNum;
  150. }
  151. public void setTotalNum(Integer totalNum) {
  152. this.totalNum = totalNum;
  153. }
  154. public Integer getDangerNum() {
  155. return dangerNum;
  156. }
  157. public void setDangerNum(Integer dangerNum) {
  158. this.dangerNum = dangerNum;
  159. }
  160. }
  161. class Subtotal {
  162. private Integer subTotalNum;
  163. private Integer subDangerNum;
  164. public Integer getSubTotalNum() {
  165. return subTotalNum;
  166. }
  167. public void setSubTotalNum(Integer subTotalNum) {
  168. this.subTotalNum = subTotalNum;
  169. }
  170. public Integer getSubDangerNum() {
  171. return subDangerNum;
  172. }
  173. public void setSubDangerNum(Integer subDangerNum) {
  174. this.subDangerNum = subDangerNum;
  175. }
  176. public Subtotal(Integer subTotalNum, Integer subDangerNum) {
  177. this.subTotalNum = subTotalNum;
  178. this.subDangerNum = subDangerNum;
  179. }
  180. }