|
@@ -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();
|
|
|
}
|