package com.whyc.service; import com.whyc.alarm.Fbs5100Alarm; import com.whyc.alarm.Fbs5100AlarmData; import com.whyc.alarm.Fbs5100AlarmParam; import com.whyc.charge.*; import com.whyc.dto.AlarmFactoryDto; import com.whyc.dto.ServletUtils; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.xssf.usermodel.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import sun.misc.BASE64Decoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service public class ExcelExportService { @Autowired private Fbs5100DisChargeDataService disChargeDataService; @Autowired private Fbs5100ChargeDataService chargeDataService; @Autowired private Fbs5100AlarmDataService alarmDataService; //导出放电数据bcp public void exportBcp(HttpServletRequest req, HttpServletResponse resp) { String curr_echart = req.getParameter("curr_echart"); //电池电流折线图 String groupVol_echart = req.getParameter("groupVol_echart");//组端电压折线图 String cap_echart = req.getParameter("cap_echart"); //测试容量折线图 String temp_echart = req.getParameter("temp_echart");//温度折线图 String filePath = req.getParameter("filePath"); Fbs5100DisChargeData data = disChargeDataService.readFboFile(filePath); //图片base64后的数据 List bytes = new ArrayList<>(); try { if (ServletUtils.isNotNull(curr_echart)) { String[] url = curr_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(groupVol_echart)) { String[] url = groupVol_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(cap_echart)) { String[] url = cap_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(temp_echart)) { String[] url = temp_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } } catch (Exception e) { e.printStackTrace(); } //当前日期 String nowFormat = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String excelName = "bcp-" + nowFormat; XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet("数据总表"); XSSFDrawing patriarch = sheet.createDrawingPatriarch(); int rowNumSheet = 0; //从文件中获取数据 List list = data.fbsDatas; Fbs5100BattParam battParam = data.battParam; Fbs5100TestParam testParam = data.testParam; Fbs5100CapState capState = data.capState; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("电池组数:" + battParam.BattGroupCount); sheet.getRow(rowNumSheet).createCell(1).setCellValue("每组单体数:" + battParam.EachGroupBattCount); sheet.getRow(rowNumSheet).createCell(2).setCellValue("标称单体电压:" + battParam.MonomerVol + "V"); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("浮充电流阈值:" + battParam.FloatChargeVol + "A"); sheet.getRow(rowNumSheet).createCell(1).setCellValue("在线电压低阈值:" + battParam.OnlineVolLow + "A"); sheet.getRow(rowNumSheet).createCell(2).setCellValue("均充电压:" + battParam.JunChargeVol + "A"); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("测试开始时间:" + formartDate(capState.StartDT.time,"yyyy-MM-dd HH:mm:ss")); sheet.getRow(rowNumSheet).createCell(1).setCellValue("测试时长:" + getHHMMSS(capState.Test_Time.hour,capState.Test_Time.minute,capState.Test_Time.second)); rowNumSheet += 4; //插入图片 int picNum = 0; String[] picName = getPicName("bcp"); if (picName.length == bytes.size()) { for (int i = 0; i < picName.length; i++) { sheet.createRow(rowNumSheet - 1); sheet.getRow(rowNumSheet - 1).createCell(0).setCellValue(picName[i]); //rowNum++; XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 512, 255, (short) 0, rowNumSheet, (short) 10, rowNumSheet + 24); anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE); patriarch.createPicture(anchor, wb.addPicture(bytes.get(picNum), XSSFWorkbook.PICTURE_TYPE_PNG)).resize(1); picNum++; rowNumSheet += 27; } } XSSFSheet sheet1 = wb.createSheet("数据"); //抬头 int rowNum = 0; sheet1.createRow(rowNum).createCell(0).setCellValue("测试数据"); rowNum++; //属性栏 String[] rowName = getRowName("bcp"); XSSFRow row = sheet1.createRow(rowNum); for (int i = 0; i < rowName.length; i++) { row.createCell(i).setCellValue(rowName[i]); } for (int i = 0; i < battParam.BattGroupCount; i++) { row.createCell(rowName.length + i*2).setCellValue("#" + Integer.valueOf(i + 1)+"在线电压"); row.createCell(rowName.length + i*2+1).setCellValue("#" + Integer.valueOf(i + 1)+"组端电压"); } rowNum++; //数据栏 for (int i = 0; i < list.size(); i++) { sheet1.createRow(rowNum); //创建行 Fbs5100FbsData fbsData = list.get(i); sheet1.getRow(rowNum).createCell(0).setCellValue(getHHMMSS(fbsData.testTime.hour,fbsData.testTime.minute,fbsData.testTime.second)); sheet1.getRow(rowNum).createCell(1).setCellValue(String.valueOf(fbsData.muxianvol_discharge)); sheet1.getRow(rowNum).createCell(2).setCellValue(String.valueOf(fbsData.muxianvol_charge)); sheet1.getRow(rowNum).createCell(3).setCellValue(String.valueOf(fbsData.boostDCDC_OutVol)); sheet1.getRow(rowNum).createCell(4).setCellValue(String.valueOf(fbsData.muxianvol)); for (int j = 0; j < battParam.BattGroupCount; j++) { sheet1.getRow(rowNum).createCell(rowName.length + j*2).setCellValue(String.valueOf(fbsData.onlinevol[j])); sheet1.getRow(rowNum).createCell(rowName.length + j*2+1).setCellValue(String.valueOf(fbsData.groupvol[j])); } rowNum++; } rowNum++; try { // 转码防止乱码 resp.addHeader("Content-Disposition", "attachment;filename=" + new String(excelName.getBytes("UTF-8"), "ISO8859-1") + ".xlsx"); OutputStream out = resp.getOutputStream(); wb.write(out); out.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //将日期格式转换成指定的字符串格式 public static String formartDate(Date date, String str){ return new SimpleDateFormat(str).format(date); } //获取标准格式时间 public static String getHHMMSS(int hour,int minute,int second){ String time=""; if(hour<10){ time+="0"+hour; }else{ time+=""+hour; } if(minute<10){ time+=":"+"0"+minute; }else{ time+=":"+minute; } if(second<10){ time+=":"+"0"+second; }else{ time+=":"+second; } return time; } public String[] getRowName(String bcp){ if (bcp.equals("bcp")){ String[] rowNameBcp = {"测试时间","放电母线电压(V)","充电母线电压(V)","升压DCDC输出电压","48V母线电压"}; return rowNameBcp; }else if (bcp.equals("chr")){ String[] rowNameChr = {"测试时间","放电母线电压(V)","充电母线电压(V)","升压DCDC输出电压","48V母线电压"}; return rowNameChr; }else if (bcp.equals("alm")){ String[] rowNameAlm = {"告警开始时间","告警名称","告警类型","告警值"}; return rowNameAlm; }else{ String[] rowName1 = {"测试时间","总电压(V)","总电流(A)","环境温度","环境湿度","测试容量(AH)"}; return rowName1; } } public String[] getPicName(String fileType){ if (fileType.equals("bcp")){ String[] picNameBcp = new String[]{ "电池电流折线图","组端电压折线图","测试容量折线图","温度折线图" }; return picNameBcp; }else if(fileType.equals("chr")){ String[] picNameChr = new String[]{ "电池电流折线图","组端电压折线图","测试容量折线图","温度折线图" }; return picNameChr; }else{ return null; } } //导出充电数据chr public void exportChr(HttpServletRequest req, HttpServletResponse resp){ String curr_echart = req.getParameter("curr_echart"); //电池电流折线图 String groupVol_echart = req.getParameter("groupVol_echart");//组端电压折线图 String cap_echart = req.getParameter("cap_echart"); //测试容量折线图 String temp_echart = req.getParameter("temp_echart");//温度折线图 String filePath = req.getParameter("filePath"); Fbs5100ChargeData data=chargeDataService.readFileData(filePath); //图片base64后的数据 List bytes = new ArrayList<>(); try { if (ServletUtils.isNotNull(curr_echart)) { String[] url = curr_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(groupVol_echart)) { String[] url = groupVol_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(cap_echart)) { String[] url = cap_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } if (ServletUtils.isNotNull(temp_echart)) { String[] url = temp_echart.split(","); bytes.add(new BASE64Decoder().decodeBuffer(url[1])); } }catch (Exception e){ e.printStackTrace(); } //数据 Fbs5100BattParam battParam =data.battParam; Fbs5100ChargeParam chargeParam =data.chargeParam; Fbs5100ChargeState chargeState =data.chargeState; //从文件中获取数据 List list = data.fbsDatas; //当前日期 String nowFormat = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String excelName = "chr-"+nowFormat; XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet("数据总表"); int rowNumSheet = 0; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("电池组数:" + battParam.BattGroupCount); sheet.getRow(rowNumSheet).createCell(1).setCellValue("每组单体数:" + battParam.EachGroupBattCount); sheet.getRow(rowNumSheet).createCell(2).setCellValue("标称单体电压:" + battParam.MonomerVol + "V"); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("浮充电流阈值:" + battParam.FloatChargeVol + "A"); sheet.getRow(rowNumSheet).createCell(1).setCellValue("在线电压低阈值:" + battParam.OnlineVolLow + "A"); sheet.getRow(rowNumSheet).createCell(2).setCellValue("均充电压:" + battParam.JunChargeVol + "A"); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("测试开始时间:" + formartDate(chargeState.StartDT.time,"yyyy-MM-dd HH:mm:ss")); sheet.getRow(rowNumSheet).createCell(1).setCellValue("测试时长:" + getHHMMSS(chargeState.Test_Time.hour,chargeState.Test_Time.minute,chargeState.Test_Time.second)); rowNumSheet += 4; //图片元素 XSSFDrawing patriarch = sheet.createDrawingPatriarch(); //插入图片 int picNum = 0; String[] picName =getPicName("chr"); if (picName.length==bytes.size()){ for(int i=0;i list=data.alarms; //当前日期 String excelName ="alm-"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet("数据总表"); int rowNumSheet = 0; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("告警参数:"); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("标称容量:"+alarmParam.Batt_CAP); sheet.getRow(rowNumSheet).createCell(1).setCellValue("组端电压上限值:"+alarmParam.GroupVol_H); sheet.getRow(rowNumSheet).createCell(2).setCellValue("组端电压下限值:"+alarmParam.GroupVol_L); rowNumSheet++; sheet.createRow(rowNumSheet); sheet.getRow(rowNumSheet).createCell(0).setCellValue("交流电压上限值:"+alarmParam.AC_VOL_H); sheet.getRow(rowNumSheet).createCell(1).setCellValue("交流电压下限值:"+alarmParam.AC_VOL_L); rowNumSheet++; //从文件中获取数据 String testName="测试数据:"; //抬头 sheet.createRow(rowNumSheet).createCell(0).setCellValue(testName); rowNumSheet++; XSSFRow row = sheet.createRow(rowNumSheet); //属性栏 String[] rowName =getRowName("alm"); for (int i=0;i