Explorar o código

增加风电总功率复杂表格展示及导出

xusl hai 10 horas
pai
achega
9c2c1def6e

+ 56 - 20
ipp-ap/src/views/idp/data/windtotalpowercontrast/index.vue

@@ -55,17 +55,18 @@
             border
             resizable
             highlight-current-row
+            :columns="columns"
             show-overflow
             :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
         >
-          <vxe-table-column
-              v-for="(item, index) in fromHead"
-              :key="index"
-              align="center"
-              :title="item.label"
-              :field="item.field"
-          ></vxe-table-column>
-
+          <!-- 固定列 -->
+          <vxe-column field="time" width="165px" title="时间"></vxe-column>
+          <vxe-column field="predictedTotalPower" title="预测总功率"></vxe-column>
+          <vxe-column field="actualTotalPower" title="实际总功率"></vxe-column>
+          <vxe-colgroup v-for="(site, index) in dynamicColumns" :title="site">
+            <vxe-column :field="`site_${index}_pred`" title="预测功率"></vxe-column>
+            <vxe-column :field="`site_${index}_actual`" title="实际功率"></vxe-column>
+          </vxe-colgroup>
         </vxe-table>
         <vxe-pager
             perfect
@@ -89,11 +90,12 @@ import {
   queryCharts
 
 } from '@/api/windtotalpowercontrast'
-import {queryTableData} from "@/api/windtowerstatusdata";
 export default {
   name: 'windtotalpowercontrast',
   data() {
     return {
+      dynamicColumns: [], // 动态风电场信息,例如: [{ name: '哈斯风电场' }, { name: '千伏苏加风电场' }]
+      columns: [],
       searchForm: {},
       tableData: [],
       page: {
@@ -146,10 +148,26 @@ export default {
 
       queryCharts(param).then((res) => {
         this.drawData = res.data.data
-        this.fromHead = res.data.data.headList
-        this.tableData = res.data.data.tableList
-        this.total = res.data.data.tableList.length
+        // 保存动态列(风电场名称)
+        this.dynamicColumns = res.data.data.columns;
+        // 转换数据为扁平结构
+        this.tableData = res.data.data.tableData.map((item, rowIndex) => {
+          const newItem = {
+            time: item.time,
+            predictedTotalPower: item.predictedTotalPower,
+            actualTotalPower: item.actualTotalPower,
+          };
+
+          // 遍历每个风电场,添加预测和实际功率
+          res.data.data.columns.forEach((site, index) => {
+            newItem[`site_${index}_pred`] = item[site].predicted;
+            newItem[`site_${index}_actual`] = item[site].actual;
+          });
+          return newItem;
+        });
 
+        // this.tableData = res.data.data.tableData; // 表格数据
+        this.total = res.data.data.tableData.length
 
         this.dqDraw(this.drawData)
       }).catch((error) => {
@@ -163,14 +181,11 @@ export default {
     },
     handleClick() {
       if (this.activeName === "first") {
-        this.chart = null
+        this.wsChart = null
         this.$nextTick(() => {
           this.dqDraw(this.drawData)
-          this.chart.resize()
+          this.wsChart.resize()
         })
-      } else if (this.activeName === "second") {
-        this.wsChart = null
-
       }
     },
     dqDraw(dqData) {
@@ -268,7 +283,29 @@ export default {
             }
           }
         }],
-        series: []
+        series: [],
+        color: [
+          "#E53935",
+          "#f17e7c",
+          "#1E88E5",
+          "#76bcf5",
+          "#43A047",
+          "#9bdaa0",
+          "#8E24AA",
+          "#b179bb",
+          "#FB8C00",
+          "#efc07c",
+          "#00ACC1",
+          "#7bccd5",
+          "#D81B60",
+          "#e380a2",
+          "#00897B",
+          "#18d7c3",
+          "#6D4C41",
+          "#c27a5e",
+          "#616161",
+          "#bdbbbb",
+        ],
       }
       option.xAxis[0].data = dqData.time
       var index = 0;
@@ -312,8 +349,7 @@ export default {
         this.$message.warning('请选择结束时间')
         return
       }
-
-      this.$axios.get("/windtotalpowercontrast/exportDataEvent/" + this.startTime + "/" + this.endTime, {
+      this.$axios.get("/windtotalpowercontrast/exportDataEvent/" +this.startTime + "/" + this.endTime, {
         responseType: 'blob'// 用于解决中文乱码
       }).then((response) => {
         this.loading = false

+ 220 - 121
ipp-idp/src/main/java/com/jiayue/ipp/idp/controller/WindtotalpowercontrastController.java

@@ -1,22 +1,22 @@
 package com.jiayue.ipp.idp.controller;
 
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.poi.excel.ExcelUtil;
-import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jiayue.ipp.common.data.entity.ElectricField;
 import com.jiayue.ipp.common.data.entity.ForecastPowerShortTerm;
+import com.jiayue.ipp.common.data.entity.PowerStationStatusData;
 import com.jiayue.ipp.idp.service.ElectricFieldService;
 import com.jiayue.ipp.idp.service.ForecastPowerShortTermService;
+import com.jiayue.ipp.idp.service.PowerStationStatusDataService;
 import com.jiayue.ipp.idp.util.DateTimeUtil;
 import com.jiayue.ipp.idp.util.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang.time.DateFormatUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.ServletOutputStream;
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
+import java.time.ZoneOffset;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -42,6 +43,7 @@ public class WindtotalpowercontrastController {
 
     private final ForecastPowerShortTermService forecastPowerShortTermService;
     private final ElectricFieldService electricFieldService;
+    private final PowerStationStatusDataService powerStationStatusDataService;
 
 
     @ApiOperation(value = "通过条件查询", notes = "通过条件查询")
@@ -53,94 +55,124 @@ public class WindtotalpowercontrastController {
 
         Date st = DateTimeUtil.getMomentTimeFor15Minute(startTime);
         Date et = DateTimeUtil.getMomentTimeFor15Minute(endTime);
-        // 封装列表头信息
-        List headList = new ArrayList();
-        // 封装表格体数据
-        List<Map<String,Object>> tableList = new ArrayList();
-        Map<String,String> timeHeadMap = new HashMap<>();
-        timeHeadMap.put("field", "时间");
-        timeHeadMap.put("label", "时间");
-        headList.add(timeHeadMap);
-
         // 获取所有站信息
         List<ElectricField> allElectricField = electricFieldService.query().list();
         allElectricField.sort(Comparator.comparing(ElectricField::getName));
+        // 获取所有短期实时
         QueryWrapper<ForecastPowerShortTerm> wrapper = new QueryWrapper<>();
         wrapper.between("forecast_time", st, et);
         wrapper.ne("forecast_manufactor", "SYJY");
         List<ForecastPowerShortTerm> forecastPowerShortTermList = forecastPowerShortTermService.list(wrapper);
-        Map<String, Map<String, BigDecimal>> map = new HashMap<>();
-//        List<Map<String,List<BigDecimal>>> chartList = new ArrayList<>();
+        // 获取所有的实际功率
+        QueryWrapper<PowerStationStatusData> sjwrapper = new QueryWrapper<>();
+        sjwrapper.between("time", st, et);
+        List<PowerStationStatusData> powerStationStatusDataList = powerStationStatusDataService.list(sjwrapper);
+
+        Map<String, Map<String, BigDecimal>> dqMap = new HashMap<>();
+        Map<String, Map<String, BigDecimal>> sjMap = new HashMap<>();
         LinkedHashMap<String, List<BigDecimal>> everyMap = new LinkedHashMap<>();
         Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
-        for (ElectricField electricField:allElectricField){
-            // 动态添加表格头的场站名称
-            Map<String,String> tableHeadMap = new HashMap<>();
-            tableHeadMap.put("field", electricField.getName());
-            tableHeadMap.put("label", electricField.getName());
-            headList.add(tableHeadMap);
 
+        List<String> columns = new ArrayList<>();
+
+        List<Map<String, Object>> tableData = new ArrayList<>();
+        for (ElectricField electricField:allElectricField){
+            columns.add(electricField.getName());
             // 再找出每个站的短期实时
             List<ForecastPowerShortTerm> shortTermList = forecastPowerShortTermList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
             Map<String, BigDecimal> shortTermMap = new HashMap<>();
-
-            List<BigDecimal> valuePointList = new ArrayList<>();
             if (!shortTermList.isEmpty()){
                 // 按时间分组
                 for (ForecastPowerShortTerm f:shortTermList){
                     shortTermMap.put(f.getForecastTime().getTime() + "", f.getFpValue());
                 }
             }
+            // 再找出每个站的实际功率
+            List<PowerStationStatusData> sjList = powerStationStatusDataList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
+            Map<String, BigDecimal> realMap = new HashMap<>();
+            if (!sjList.isEmpty()){
+                // 按时间分组
+                for (PowerStationStatusData f:sjList){
+                    realMap.put(f.getTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() + "", f.getRealValue());
+                }
+            }
+            List<BigDecimal> valuePointList = new ArrayList<>();
+            List<BigDecimal> sjPointList = new ArrayList<>();
+            // 对短期和实际功率进行分组并封装成list
             for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
                 valuePointList.add(shortTermMap.get(tempTime.toString())!=null?shortTermMap.get(tempTime.toString()):new BigDecimal(0));
+                sjPointList.add(realMap.get(tempTime.toString())!=null?realMap.get(tempTime.toString()):new BigDecimal(0));
             }
-            everyMap.put(electricField.getName(), valuePointList);
+            everyMap.put(electricField.getName()+"预测功率", valuePointList);
+            everyMap.put(electricField.getName()+"实际功率", sjPointList);
 //            chartList.add(everyMap);
-            map.put(electricField.getName(), shortTermMap);
+            dqMap.put(electricField.getName(), shortTermMap);
+            sjMap.put(electricField.getName(), realMap);
         }
-        Map<String,String> zglHeadMap = new HashMap<>();
-        zglHeadMap.put("field", "总功率");
-        zglHeadMap.put("label", "总功率");
-        headList.add(zglHeadMap);
 
         // 页面x轴时间
         List<String> timeList = new ArrayList<>();
         List<BigDecimal> totalPowerValuePointList = new ArrayList<>();
+        List<BigDecimal> totalSjPointList = new ArrayList<>();
         for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
-            Map<String,Object> map1 = new HashMap<>();
-            // 应用列表
-            map1.put("时间", DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
             // 应用图表
             timeList.add(DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
-            // 定义总功率每个点位值变量
-            BigDecimal totalPower = new BigDecimal(0);
-
-            for (Map.Entry<String, Map<String, BigDecimal>> entry : map.entrySet()) {
+            // 定义预测总功率每个点位值变量
+            BigDecimal dqEveryPointPower = new BigDecimal(0);
+            for (Map.Entry<String, Map<String, BigDecimal>> entry : dqMap.entrySet()) {
+                Map<String, BigDecimal> valueMap = entry.getValue();
+                if (valueMap.get(tempTime + "")!=null){
+                    dqEveryPointPower = dqEveryPointPower.add(valueMap.get(tempTime + ""));
+                }
+            }
+            totalPowerValuePointList.add(dqEveryPointPower);
+            // 定义实际总功率每个点位值变量
+            BigDecimal sjEveryPointPower = new BigDecimal(0);
+            for (Map.Entry<String, Map<String, BigDecimal>> entry : sjMap.entrySet()) {
                 Map<String, BigDecimal> valueMap = entry.getValue();
                 if (valueMap.get(tempTime + "")!=null){
-                    totalPower = totalPower.add(valueMap.get(tempTime + ""));
-                    // 封装表格体数据每个场站的,应用列表
-                    map1.put(entry.getKey(), valueMap.get(tempTime + ""));
+                    sjEveryPointPower = sjEveryPointPower.add(valueMap.get(tempTime + ""));
+                }
+            }
+            totalSjPointList.add(sjEveryPointPower);
+
+            // 应用列表
+            Map<String, Object> datarow = new HashMap<>();
+            datarow.put("time", DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
+            datarow.put("predictedTotalPower", dqEveryPointPower);
+            datarow.put("actualTotalPower", sjEveryPointPower);
+            for (ElectricField electricField:allElectricField){
+                Map<String, Object> site = new HashMap<>();
+                if (dqMap.get(electricField.getName())!=null){
+                    Map<String, BigDecimal> tempShortTermMap = dqMap.get(electricField.getName());
+                    site.put("predicted", tempShortTermMap.get(tempTime+"")!=null?tempShortTermMap.get(tempTime+""):new BigDecimal(0));
                 }
                 else{
-                    // 应用列表
-                    map1.put(entry.getKey(), new BigDecimal(0));
+                    site.put("predicted", new BigDecimal(0));
+                }
+                if (sjMap.get(electricField.getName())!=null){
+                    Map<String, BigDecimal> tempSjMap = sjMap.get(electricField.getName());
+                    site.put("actual", tempSjMap.get(tempTime+"")!=null?tempSjMap.get(tempTime+""):new BigDecimal(0));
                 }
+                else{
+                    site.put("actual", new BigDecimal(0));
+                }
+                datarow.put(electricField.getName(), site);
             }
-            // 每个时间点总功率和,应用列表
-            map1.put("总功率", totalPower);
-            tableList.add(map1);
-            // 应用图表
-            totalPowerValuePointList.add(totalPower);
+            tableData.add(datarow);
         }
         // 应用图表
-        everyMap.put("总功率",totalPowerValuePointList);
+        LinkedHashMap<String, List<BigDecimal>> resultCurveMap = new LinkedHashMap<>();
+        resultCurveMap.put("预测总功率",totalPowerValuePointList);
+        resultCurveMap.put("实际总功率",totalSjPointList);
+        resultCurveMap.putAll(everyMap);
 
         Map<String,Object> resultMap = new HashMap<>();
         resultMap.put("time",timeList);
-        resultMap.put("chart",everyMap);
-        resultMap.put("headList",headList);
-        resultMap.put("tableList",tableList);
+        resultMap.put("chart",resultCurveMap);
+        resultMap.put("columns",columns);
+        resultMap.put("tableData",tableData);
+
         return R.ok(resultMap);
     }
 
@@ -150,35 +182,58 @@ public class WindtotalpowercontrastController {
             @PathVariable("endTime") Long endTime,
             HttpServletResponse response) {
 
-        try {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String fileName = "风电总功率对比" + simpleDateFormat.format(startTime) + "至" + simpleDateFormat.format(endTime) + ".xlsx";
+        response.setContentType("application/x-msdownload;charset=utf-8");
+
+
+        try (Workbook workbook = new XSSFWorkbook();ServletOutputStream out = response.getOutputStream()){
+            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
             Date st = DateTimeUtil.getMomentTimeFor15Minute(startTime);
             Date et = DateTimeUtil.getMomentTimeFor15Minute(endTime);
-            // 封装列表头信息
-            List<Map<String,String>> headList = new ArrayList();
-            // 封装表格体数据
-            List<Map<String,Object>> tableList = new ArrayList();
-            Map<String,String> timeHeadMap = new HashMap<>();
-            timeHeadMap.put("field", "时间");
-            timeHeadMap.put("label", "时间");
-            headList.add(timeHeadMap);
-
             // 获取所有站信息
             List<ElectricField> allElectricField = electricFieldService.query().list();
             allElectricField.sort(Comparator.comparing(ElectricField::getName));
+            // 获取所有短期实时
             QueryWrapper<ForecastPowerShortTerm> wrapper = new QueryWrapper<>();
             wrapper.between("forecast_time", st, et);
             wrapper.ne("forecast_manufactor", "SYJY");
             List<ForecastPowerShortTerm> forecastPowerShortTermList = forecastPowerShortTermService.list(wrapper);
-            Map<String, Map<String, BigDecimal>> map = new HashMap<>();
-            LinkedHashMap<String, List<BigDecimal>> everyMap = new LinkedHashMap<>();
+            // 获取所有的实际功率
+            QueryWrapper<PowerStationStatusData> sjwrapper = new QueryWrapper<>();
+            sjwrapper.between("time", st, et);
+            List<PowerStationStatusData> powerStationStatusDataList = powerStationStatusDataService.list(sjwrapper);
+
+            // 创建工作表
+            Sheet sheet = workbook.createSheet("风电总功率对比");
+            // 创建样式 - 水平垂直居中,带边框
+            CellStyle centerStyle = workbook.createCellStyle();
+            centerStyle.setAlignment(HorizontalAlignment.CENTER);
+            centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+            centerStyle.setBorderTop(BorderStyle.THIN);
+            centerStyle.setBorderBottom(BorderStyle.THIN);
+            centerStyle.setBorderLeft(BorderStyle.THIN);
+            centerStyle.setBorderRight(BorderStyle.THIN);
+
+            // 创建表头
+            List<String> headList = new ArrayList<>();
+            headList.add("时间");
+            headList.add("预测总功率");
+            headList.add("实际总功率");
+            List<String> subHeaderList = new ArrayList<>();
+            subHeaderList.add("");
+            subHeaderList.add("");
+            subHeaderList.add("");
+
+            Map<String, Map<String, BigDecimal>> dqMap = new HashMap<>();
+            Map<String, Map<String, BigDecimal>> sjMap = new HashMap<>();
             Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
             for (ElectricField electricField:allElectricField){
                 // 动态添加表格头的场站名称
-                Map<String,String> tableHeadMap = new HashMap<>();
-                tableHeadMap.put("field", electricField.getName());
-                tableHeadMap.put("label", electricField.getName());
-                headList.add(tableHeadMap);
-
+                headList.add(electricField.getName());
+                headList.add("");
+                subHeaderList.add("预测功率");
+                subHeaderList.add("实际功率");
                 // 再找出每个站的短期实时
                 List<ForecastPowerShortTerm> shortTermList = forecastPowerShortTermList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
                 Map<String, BigDecimal> shortTermMap = new HashMap<>();
@@ -188,74 +243,118 @@ public class WindtotalpowercontrastController {
                         shortTermMap.put(f.getForecastTime().getTime() + "", f.getFpValue());
                     }
                 }
-                map.put(electricField.getName(), shortTermMap);
+                // 再找出每个站的实际功率
+                List<PowerStationStatusData> sjList = powerStationStatusDataList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
+                Map<String, BigDecimal> realMap = new HashMap<>();
+                if (!sjList.isEmpty()){
+                    // 按时间分组
+                    for (PowerStationStatusData f:sjList){
+                        realMap.put(f.getTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() + "", f.getRealValue());
+                    }
+                }
+                List<BigDecimal> valuePointList = new ArrayList<>();
+                List<BigDecimal> sjPointList = new ArrayList<>();
+                // 对短期和实际功率进行分组并封装成list
+                for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+                    valuePointList.add(shortTermMap.get(tempTime.toString())!=null?shortTermMap.get(tempTime.toString()):new BigDecimal(0));
+                    sjPointList.add(realMap.get(tempTime.toString())!=null?realMap.get(tempTime.toString()):new BigDecimal(0));
+                }
+                dqMap.put(electricField.getName(), shortTermMap);
+                sjMap.put(electricField.getName(), realMap);
+            }
+            // 第一行 - 主表头
+            Row headerRow1 = sheet.createRow(0);
+            for (int i = 0; i < headList.size(); i++) {
+                Cell cell = headerRow1.createCell(i);
+                cell.setCellValue(headList.get(i));
+                cell.setCellStyle(centerStyle);
             }
-            Map<String,String> zglHeadMap = new HashMap<>();
-            zglHeadMap.put("field", "总功率");
-            zglHeadMap.put("label", "总功率");
-            headList.add(zglHeadMap);
 
-            // 页面x轴时间
-            for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
-                Map<String,Object> map1 = new HashMap<>();
-                // 应用列表
-                map1.put("时间", DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
-                // 定义总功率每个点位值变量
-                BigDecimal totalPower = new BigDecimal(0);
+            CellRangeAddress cellRange = new CellRangeAddress(0, 1, 0, 0);
+            sheet.addMergedRegion(cellRange);
+            CellRangeAddress cellRange1 = new CellRangeAddress(0, 1, 1, 1);
+            sheet.addMergedRegion(cellRange1);
+            CellRangeAddress cellRange2 = new CellRangeAddress(0, 1, 2, 2);
+            sheet.addMergedRegion(cellRange2);
+
+            // 合并单元格 - 时间列跨两行(如果需要的话,这里示例不合并时间列)
+            // 实际合并的是"哈斯风电场"和"锦州风电场"下的预测/实际功率列标题
+            int columnIndex = 0;
+            for (int i=0;i<allElectricField.size();i++){
+                // 合并哈斯风电场下的预测和实际功率
+                sheet.addMergedRegion(new CellRangeAddress(0, 0, columnIndex+3, columnIndex+4));
+                columnIndex = columnIndex+2;
+            }
+
+            // 第二行 - 子表头
+            Row headerRow2 = sheet.createRow(1);
+            for (int i = 0; i < subHeaderList.size(); i++) {
+                Cell cell = headerRow2.createCell(i);
+                cell.setCellValue(subHeaderList.get(i));
+                cell.setCellStyle(centerStyle);
+            }
 
-                for (Map.Entry<String, Map<String, BigDecimal>> entry : map.entrySet()) {
+            List<List<Object>> dataList = new ArrayList<>();
+            for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+                List<Object> rowList = new ArrayList<>();
+                rowList.add(DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
+                // 定义预测总功率每个点位值变量
+                BigDecimal dqEveryPointPower = new BigDecimal(0);
+                for (Map.Entry<String, Map<String, BigDecimal>> entry : dqMap.entrySet()) {
+                    Map<String, BigDecimal> valueMap = entry.getValue();
+                    if (valueMap.get(tempTime + "")!=null){
+                        dqEveryPointPower = dqEveryPointPower.add(valueMap.get(tempTime + ""));
+                    }
+                }
+                rowList.add(dqEveryPointPower);
+                // 定义实际总功率每个点位值变量
+                BigDecimal sjEveryPointPower = new BigDecimal(0);
+                for (Map.Entry<String, Map<String, BigDecimal>> entry : sjMap.entrySet()) {
                     Map<String, BigDecimal> valueMap = entry.getValue();
                     if (valueMap.get(tempTime + "")!=null){
-                        totalPower = totalPower.add(valueMap.get(tempTime + ""));
-                        // 封装表格体数据每个场站的,应用列表
-                        map1.put(entry.getKey(), valueMap.get(tempTime + ""));
+                        sjEveryPointPower = sjEveryPointPower.add(valueMap.get(tempTime + ""));
+                    }
+                }
+                rowList.add(sjEveryPointPower);
+                for (ElectricField electricField:allElectricField){
+                    if (dqMap.get(electricField.getName())!=null){
+                        Map<String, BigDecimal> tempShortTermMap = dqMap.get(electricField.getName());
+                        rowList.add(tempShortTermMap.get(tempTime+"")!=null?tempShortTermMap.get(tempTime+""):new BigDecimal(0));
                     }
                     else{
-                        // 应用列表
-                        map1.put(entry.getKey(), new BigDecimal(0));
+                        rowList.add(new BigDecimal(0));
+                    }
+                    if (sjMap.get(electricField.getName())!=null){
+                        Map<String, BigDecimal> tempSjMap = sjMap.get(electricField.getName());
+                        rowList.add(tempSjMap.get(tempTime+"")!=null?tempSjMap.get(tempTime+""):new BigDecimal(0));
+                    }
+                    else{
+                        rowList.add(new BigDecimal(0));
                     }
                 }
-                // 每个时间点总功率和,应用列表
-                map1.put("总功率", totalPower);
-                tableList.add(map1);
-
+                dataList.add(rowList);
             }
 
-            ExcelWriter writer = ExcelUtil.getWriter(true);
-            writer.renameSheet(0, "风电总功率对比");
-            List<String> header = new ArrayList();
-            List<String> headFieldName = new ArrayList();
-            for (Map<String,String> headMap:headList){
-                header.add(headMap.get("label").toString());
-                headFieldName.add(headMap.get("field").toString());
-            }
-            List<List<String>> rowHeather = CollUtil.newArrayList();
-            rowHeather.add(header);
-            for (Map<String,Object> contentMap : tableList) {
-                List<String> rowList = new ArrayList();
-                for (String fieldStr:headFieldName){
-                    if (contentMap.get(fieldStr)==null){
-                        rowList.add("");
-                    }
-                    else{
-                        rowList.add(contentMap.get(fieldStr).toString());
+            for (int i=0;i<dataList.size();i++){
+                Row row = sheet.createRow(i + 2);
+                for (int j = 0; j < dataList.get(i).size(); j++) {
+                    Cell cell = row.createCell(j);
+                    if (dataList.get(i).get(j) instanceof String) {
+                        cell.setCellValue((String)dataList.get(i).get(j));
+                    } else if (dataList.get(i).get(j) instanceof Integer) {
+                        cell.setCellValue((Integer) dataList.get(i).get(j));
+                    } else if (dataList.get(i).get(j) instanceof BigDecimal) {
+                        cell.setCellValue(dataList.get(i).get(j).toString());
+                    } else if (dataList.get(i).get(j) instanceof Double) {
+                        cell.setCellValue((Double) dataList.get(i).get(j));
                     }
+                    cell.setCellStyle(centerStyle);
                 }
-                rowHeather.add(rowList);
             }
 
-            writer.write(rowHeather, true);
-            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-            String fileName = "风电总功率对比" + simpleDateFormat.format(startTime) + "至" + simpleDateFormat.format(endTime) + ".xlsx";
-            response.setContentType("application/x-msdownload;charset=utf-8");
-            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
-            ServletOutputStream out = null;
-            out = response.getOutputStream();
-            writer.flush(out, true);
-            // 关闭writer,释放内存
-            writer.close();
-            //此处记得关闭输出Servlet流
-            IoUtil.close(out);
+            // 写入输出流
+            workbook.write(out);
+            out.flush();
         } catch (Exception e) {
             e.printStackTrace();
         }