package com.iailab.module.model.common.utils; import com.iailab.module.model.api.mcs.dto.PreDataItemChartRespVO; import com.iailab.module.model.api.mcs.dto.PreDataSampleViewRespDTO; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; /** * Excel 导出通用工具类 * * @author PanZhibao * @date 2021年06月29日 9:06 */ public class ExcelUtil { /** * 导出PointValueExcel * * @param sheetTitle * @param title * @param list * @param response * @return */ public static byte[] exportPointValue(String sheetTitle, String[] title, List list, HttpServletResponse response) { HSSFWorkbook wb = new HSSFWorkbook();//创建excel表 HSSFSheet sheet = wb.createSheet(sheetTitle); sheet.setDefaultColumnWidth(20);//设置默认行宽 //表头样式(加粗,水平居中,垂直居中) HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 HSSFFont fontStyle = wb.createFont(); cellStyle.setFont(fontStyle); //标题样式(加粗,垂直居中) HSSFCellStyle cellStyle2 = wb.createCellStyle(); cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 cellStyle2.setFont(fontStyle); //字段样式(垂直居中) HSSFCellStyle cellStyle3 = wb.createCellStyle(); cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 //数字样式 HSSFCellStyle cellStyle4 = wb.createCellStyle(); HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式 cellStyle4.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 cellStyle4.setDataFormat(df.getFormat("#,##0.000000"));//设置数值类型格式为保留两位小数 //创建表头 HSSFRow row = sheet.createRow(0); //row.setHeightInPoints(20);//行高 HSSFCell cell = row.createCell(0); cell.setCellValue(sheetTitle); cell.setCellStyle(cellStyle); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (title.length - 1))); //创建标题 HSSFRow rowTitle = sheet.createRow(1); //rowTitle.setHeightInPoints(20); HSSFCell hc; for (int i = 0; i < title.length; i++) { hc = rowTitle.createCell(i); hc.setCellValue(title[i]); hc.setCellStyle(cellStyle2); } byte result[] = null; try { //创建表格数据 Field[] fields; int i = 2; for (Object obj : list) { fields = obj.getClass().getDeclaredFields(); HSSFRow rowBody = sheet.createRow(i); //rowBody.setHeightInPoints(20); int j = 0; for (Field f : fields) { f.setAccessible(true); Object va = f.get(obj); if (null == va) { va = ""; } hc = rowBody.createCell(j); if (j == 0) { hc.setCellValue(Double.parseDouble(va.toString())); hc.setCellStyle(cellStyle4); } else { hc.setCellValue(va.toString()); hc.setCellStyle(cellStyle3); } j++; } i++; } //设置Http响应头告诉浏览器下载这个附件 response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls"); OutputStream outputStream = response.getOutputStream(); wb.write(outputStream); outputStream.close(); return wb.getBytes(); } catch (Exception ex) { Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); return result; } finally { try { wb.close(); } catch (IOException ex) { Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); } } } //预测图表数据转excel public static byte[] exportchart(String sheetTitle, PreDataItemChartRespVO respVO, HttpServletResponse response) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(sheetTitle); sheet.setDefaultColumnWidth(20);//设置默认行宽 // 表头样式(加粗,水平居中,垂直居中) HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); HSSFFont fontStyle = wb.createFont(); cellStyle.setFont(fontStyle); // 标题样式(加粗,垂直居中) HSSFCellStyle cellStyle2 = wb.createCellStyle(); cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle2.setFont(fontStyle); // 字段样式(垂直居中) HSSFCellStyle cellStyle3 = wb.createCellStyle(); cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER); // 数字样式 HSSFCellStyle cellStyle4 = wb.createCellStyle(); HSSFDataFormat df = wb.createDataFormat(); cellStyle4.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle4.setDataFormat(df.getFormat("#,##0.000000")); // 创建标题 String[] title = new String[respVO.getLegend().size() * 4]; for (int i = 0; respVO.getLegend().size() > i; i++) { title[i * 4] = "日期时间"; title[i * 4 + 1] = respVO.getLegend().get(i) + ":真实值"; title[i * 4 + 2] = "日期时间"; title[i * 4 + 3] = respVO.getLegend().get(i) + ":预测值"; } HSSFRow rowTitle = sheet.createRow(0); HSSFCell hc; for (int i = 0; i < title.length; i++) { hc = rowTitle.createCell(i); hc.setCellValue(title[i]); hc.setCellStyle(cellStyle2); } LinkedHashMap viewMap = respVO.getViewMap(); byte result[] = null; try { // 创建表格数据 //逐列插入 for (int j = 0; viewMap.size() > j; j++) { //去掉标题行,从第一行开始 //逐行插入 for (Map.Entry entry : viewMap.entrySet()) { //真实值 List realData = entry.getValue().getRealData(); //预测值 List preDataN = entry.getValue().getPreDataN(); HSSFRow rowBody; //插入真实值 for (int i = 0; realData.size() > i; i++) { //判断是否创建过行,如果没有创建行,否则更新行 if (sheet.getRow(i + 1) == null) { rowBody = sheet.createRow(i + 1); } else { rowBody = sheet.getRow(i + 1); } //插入时间 hc = rowBody.createCell(j * 4); if (realData.get(i)[0] != null) { if (realData.get(i)[0] instanceof Date) { String formattedDate = sdf.format(realData.get(i)[0]); hc.setCellValue(formattedDate); } else { hc.setCellValue(realData.get(i)[0].toString()); } hc.setCellStyle(cellStyle3); } else { hc.setCellValue(""); hc.setCellStyle(cellStyle3); } //插入值 hc = rowBody.createCell(j * 4 + 1); if (realData.get(i)[1] != null) { hc.setCellValue(realData.get(i)[1].toString()); hc.setCellStyle(cellStyle4); } else { hc.setCellValue(""); hc.setCellStyle(cellStyle4); } } //插入预测值 for (int i = 0; preDataN.size() > i; i++) { //判断是否创建过行,如果没有创建行,否则更新行 if (sheet.getRow(i + 1) == null) { rowBody = sheet.createRow(i + 1); } else { rowBody = sheet.getRow(i + 1); } //插入时间 hc = rowBody.createCell(j * 4 + 2); if (preDataN.get(i)[0] != null) { if (preDataN.get(i)[0] instanceof Date) { String formattedDate = sdf.format(preDataN.get(i)[0]); hc.setCellValue(formattedDate); } else { hc.setCellValue(preDataN.get(i)[0].toString()); } hc.setCellStyle(cellStyle3); } else { hc.setCellValue(""); hc.setCellStyle(cellStyle3); } //插入值 hc = rowBody.createCell(j * 4 + 3); if (preDataN.get(i)[1] != null) { hc.setCellValue(preDataN.get(i)[1].toString()); hc.setCellStyle(cellStyle4); } else { hc.setCellValue(""); hc.setCellStyle(cellStyle4); } } } } // 设置Http响应头告诉浏览器下载这个附件 response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls"); OutputStream outputStream = response.getOutputStream(); wb.write(outputStream); outputStream.close(); return wb.getBytes(); } catch (Exception ex) { Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); return result; } finally { try { wb.close(); } catch (IOException ex) { Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); } } } }