| package com.mzl.flower.utils; | 
|   | 
| import org.apache.poi.hssf.usermodel.*; | 
| import org.apache.poi.hssf.util.HSSFColor; | 
| import org.apache.poi.ss.usermodel.BorderStyle; | 
| import org.apache.poi.ss.usermodel.CellType; | 
| 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.net.URLEncoder; | 
| import java.text.SimpleDateFormat; | 
| import java.time.ZonedDateTime; | 
| import java.time.format.DateTimeFormatter; | 
| import java.util.ArrayList; | 
| import java.util.Date; | 
| import java.util.List; | 
|   | 
| public class ExcelExportUtil { | 
|     //显示的导出表的标题 | 
|     private String title; | 
|     //导出表的列名 | 
|     private String[] rowName ; | 
|   | 
|     private List<HeadRow> headRows; | 
|   | 
|     private List<Object[]> dataList = new ArrayList<>(); | 
|   | 
|     private HttpServletResponse response; | 
|   | 
|     //默认日期格式 | 
|     private String dateFormat = "yyyy-MM-dd"; | 
|   | 
|     public static class HeadRow{ | 
|         int rowIndex; | 
|         List<HeadColumn> columns; | 
|   | 
|         public HeadRow(int rowIndex, List<HeadColumn> columns){ | 
|             this.columns = columns; | 
|             this.rowIndex = rowIndex; | 
|         } | 
|     } | 
|   | 
|     public static class HeadColumn{ | 
|         int columnIndex; | 
|         int rowspan; | 
|         int colspan; | 
|         String name; | 
|   | 
|         public HeadColumn(int columnIndex, int rowspan, int colspan, String name){ | 
|             this.columnIndex = columnIndex; | 
|             this.rowspan = rowspan; | 
|             this.colspan = colspan; | 
|             this.name = name; | 
|         } | 
|     } | 
|   | 
|     public ExcelExportUtil(String title, List<HeadRow> headRows, List<Object[]> dataList, HttpServletResponse response){ | 
|         this.dataList = dataList; | 
|         this.headRows = headRows; | 
|         this.title = title; | 
|         this.response = response; | 
|     } | 
|   | 
|     public ExcelExportUtil(String title, List<HeadRow> headRows, List<Object[]> dataList, HttpServletResponse response, String dateFormat){ | 
|         this.dataList = dataList; | 
|         this.headRows = headRows; | 
|         this.title = title; | 
|         this.response = response; | 
|         this.dateFormat = dateFormat; | 
|     } | 
|   | 
|     /** | 
|      * 构造函数,传入要导出的数据 | 
|      * @param title  标题 | 
|      * @param rowName  列名 | 
|      * @param dataList 数据集合 List | 
|      * @param response http响应 | 
|      */ | 
|     public ExcelExportUtil(String title, String[] rowName, List<Object[]> dataList, HttpServletResponse response){ | 
|         this.dataList = dataList; | 
|         this.rowName = rowName; | 
|         this.title = title; | 
|         this.response = response; | 
|     } | 
|   | 
|     /** | 
|      * 构造函数,传入要导出的数据,带日期格式 | 
|      * @param title  标题 | 
|      * @param rowName  列名 | 
|      * @param dataList 数据集合 List | 
|      * @param response http响应 | 
|      * @param dateFormat 日期格式 | 
|      */ | 
|     public ExcelExportUtil(String title, String[] rowName, List<Object[]> dataList, HttpServletResponse response, String dateFormat){ | 
|         this.dataList = dataList; | 
|         this.rowName = rowName; | 
|         this.title = title; | 
|         this.response = response; | 
|         this.dateFormat = dateFormat; | 
|     } | 
|   | 
|     private int prepareHeader(HSSFSheet sheet, HSSFCellStyle columnTopStyle){ | 
|         int step = 0; | 
|         if(headRows != null){ | 
|             for(HeadRow row : headRows){ | 
|                 int firstRow = row.rowIndex; | 
|                 HSSFRow rowHeader = sheet.getRow(firstRow); | 
|                 if(rowHeader == null){ | 
|                     rowHeader = sheet.createRow(firstRow); | 
|                 } | 
|                 List<HeadColumn> columns = row.columns; | 
|                 int s = 1; | 
|                 for(HeadColumn c : columns){ | 
|                     int lastRow = firstRow + c.rowspan - 1; | 
|                     int firstCol = c.columnIndex; | 
|                     int lastCol = firstCol + c.colspan - 1; | 
|                     if(lastRow > firstRow || lastCol > firstCol) { | 
|                         for(int i = firstRow; i <= lastRow; i++){ | 
|                             for(int j = firstCol; j <= lastCol; j++){ | 
|                                 HSSFRow rowHeader1 = sheet.getRow(i); | 
|                                 if(rowHeader1 == null){ | 
|                                     rowHeader1 = sheet.createRow(i); | 
|                                 } | 
|                                 HSSFCell cell = rowHeader1.getCell(j); | 
|                                 if(cell == null){ | 
|                                     cell = rowHeader1.createCell(j); | 
|                                 } | 
|                                 cell.setCellStyle(columnTopStyle); | 
|                             } | 
|                         } | 
|                         sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); | 
|                     } | 
|   | 
|                     HSSFCell cell = rowHeader.getCell(firstCol); | 
|                     if(cell == null){ | 
|                         cell = rowHeader.createCell(firstCol); | 
|                     } | 
|   | 
|                     cell.setCellStyle(columnTopStyle); | 
|                     cell.setCellType(CellType.STRING); | 
|                     HSSFRichTextString text = new HSSFRichTextString(c.name); | 
|                     cell.setCellValue(text); | 
|   | 
|                     if(s < c.rowspan){ | 
|                         s = c.rowspan; | 
|                     } | 
|                 } | 
|                 step += s; | 
|             } | 
|         }else if(rowName != null){ | 
|             // 产生表格标题行 | 
|             HSSFRow rowTitle = sheet.createRow(0); | 
|             HSSFCell cellTitle = rowTitle.createCell(0); | 
|   | 
|             sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1))); | 
|             cellTitle.setCellStyle(columnTopStyle); | 
|             cellTitle.setCellValue(title); | 
|   | 
|             // 定义所需列数 | 
|             int columnNum = rowName.length; | 
|             HSSFRow rowRowName = sheet.createRow(2);                // 在索引2的位置创建行(最顶端的行开始的第二行) | 
|   | 
|             // 将列头设置到sheet的单元格中 | 
|             for(int n = 0; n < columnNum; n++){ | 
|                 HSSFCell cellRowName = rowRowName.createCell(n);               //创建列头对应个数的单元格 | 
|                 cellRowName.setCellType(CellType.STRING);             //设置列头单元格的数据类型 | 
|                 HSSFRichTextString text = new HSSFRichTextString(rowName[n]); | 
|                 cellRowName.setCellValue(text);                                 //设置列头单元格的值 | 
|                 cellRowName.setCellStyle(columnTopStyle);                       //设置列头单元格样式 | 
|             } | 
|   | 
|             step = 3; | 
|         } | 
|   | 
|         return step; | 
|     } | 
|   | 
|     /* | 
|      * 导出数据 | 
|      * */ | 
|     public void export() throws Exception{ | 
|         try{ | 
|             HSSFWorkbook workbook = new HSSFWorkbook();                     // 创建工作簿对象 | 
|             HSSFSheet sheet = workbook.createSheet(title);                  // 创建工作表 | 
|   | 
|             //sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面  - 可扩展】 | 
|             HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象 | 
|             HSSFCellStyle style = this.getStyle(workbook);                  //单元格样式对象 | 
|   | 
|             int step = prepareHeader(sheet, columnTopStyle); | 
|   | 
|             //将查询出的数据设置到sheet对应的单元格中 | 
|             if (null != dataList && dataList.size() > 0) { | 
|                 int cellNum = 0; | 
|   | 
|                 for(int i = 0; i < dataList.size(); i++){ | 
|                     Object[] obj = dataList.get(i);//遍历每个对象 | 
|                     HSSFRow row = sheet.createRow(i + step);//创建所需的行数 | 
|   | 
|                     for(int j = 0; j < obj.length; j++){ | 
|                         HSSFCell cell = row.createCell(j);   //设置单元格的数据类型 | 
|                         //HSSFCell  cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);   //设置单元格的数据类型 | 
|   | 
|                         cell.setCellStyle(style);                                   //设置单元格样式 | 
|   | 
|                         cellNum = setCellValue(cell, obj[j], cellNum, row); | 
|                         cellNum++; | 
|                     } | 
|                 } | 
|             } | 
|   | 
|             if(workbook !=null){ | 
|                 OutputStream out = null; | 
|                 try{ | 
|                     String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls"; | 
|                     String headStr = "attachment; filename=\"" + fileName + "\""; | 
|                     response.setContentType("application/vnd.ms-excel"); | 
|                     response.setHeader("Content-Disposition", headStr); | 
|                     response.addHeader("filename", URLEncoder.encode(fileName, "UTF-8")); | 
|                     out = response.getOutputStream(); | 
|                     workbook.write(out); | 
|                     out.flush(); | 
|                 } | 
|                 catch (IOException e){ | 
|                 } | 
|                 finally{ | 
|                     if (null != out){ | 
|                         out.close(); | 
|                     } | 
|                 } | 
|             } | 
|   | 
|         }catch(Exception e){ | 
|             e.printStackTrace(); | 
|         } | 
|   | 
|     } | 
|   | 
|     private int setCellValue(HSSFCell cell, Object value, int cellNum, HSSFRow row){ | 
|         String textValue = null; | 
|         if (value instanceof Integer) { | 
|             int intValue = (Integer) value; | 
|             cell.setCellValue(intValue); | 
|         } else if (value instanceof Float) { | 
|             float fValue = (Float) value; | 
|             cell.setCellValue(fValue); | 
|         } else if (value instanceof Double) { | 
|             double dValue = (Double) value; | 
|             cell.setCellValue(dValue); | 
|         } else if (value instanceof Long) { | 
|             long longValue = (Long) value; | 
|             cell.setCellValue(longValue); | 
|         } else if (value instanceof Boolean) { | 
|             boolean bValue = (Boolean) value; | 
|             cell.setCellValue(bValue); | 
|         } else if (value instanceof Date) { | 
|             Date date = (Date) value; | 
|             SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); | 
|             textValue = sdf.format(date); | 
|         } else if (value instanceof ZonedDateTime){ | 
|             DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat); | 
|             textValue = dateTimeFormatter.format((ZonedDateTime) value); | 
|         }else if (value instanceof String[]) { | 
|             String[] strArr = (String[]) value; | 
|             for (int j = 0; j < strArr.length; j++) { | 
|                 String str = strArr[j]; | 
|                 cell.setCellValue(str); | 
|                 if (j != strArr.length - 1) { | 
|                     cellNum++; | 
|                     cell = row.createCell(cellNum); | 
|                 } | 
|             } | 
|         } else if (value instanceof Double[]) { | 
|             Double[] douArr = (Double[]) value; | 
|             for (int j = 0; j < douArr.length; j++) { | 
|                 Double val = douArr[j]; | 
|                 // 值不为空则set Value | 
|                 if (val != null) { | 
|                     cell.setCellValue(val); | 
|                 } | 
|   | 
|                 if (j != douArr.length - 1) { | 
|                     cellNum++; | 
|                     cell = row.createCell(cellNum); | 
|                 } | 
|             } | 
|         } else { | 
|             // 其它数据类型都当作字符串简单处理 | 
|             String empty = ""; | 
|             textValue = value == null ? empty : value.toString(); | 
|         } | 
|         if (textValue != null) { | 
|             HSSFRichTextString richString = new HSSFRichTextString(textValue); | 
|             cell.setCellValue(richString); | 
|         } | 
|         return cellNum; | 
|     } | 
|   | 
|     /* | 
|      * 列头单元格样式 | 
|      */ | 
|     private HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { | 
|   | 
|         // 设置字体 | 
|         HSSFFont font = workbook.createFont(); | 
|         //设置字体大小 | 
|         font.setFontHeightInPoints((short)11); | 
|         //字体加粗 | 
|         font.setBold(true); | 
|         //设置字体名字 | 
|         font.setFontName("Courier New"); | 
|         //设置样式; | 
|         HSSFCellStyle style = workbook.createCellStyle(); | 
|         //设置底边框; | 
|         style.setBorderBottom(BorderStyle.THIN); | 
|         //设置底边框颜色; | 
|         style.setBottomBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置左边框; | 
|         style.setBorderLeft(BorderStyle.THIN); | 
|         //设置左边框颜色; | 
|         style.setLeftBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置右边框; | 
|         style.setBorderRight(BorderStyle.THIN); | 
|         //设置右边框颜色; | 
|         style.setRightBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置顶边框; | 
|         style.setBorderTop(BorderStyle.THIN); | 
|         //设置顶边框颜色; | 
|         style.setTopBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //在样式用应用设置的字体; | 
|         style.setFont(font); | 
|         //设置自动换行; | 
|         style.setWrapText(false); | 
|         //设置水平对齐的样式为居中对齐; | 
|         style.setAlignment(HorizontalAlignment.CENTER); | 
|         //设置垂直对齐的样式为居中对齐; | 
|         style.setVerticalAlignment(VerticalAlignment.CENTER); | 
|   | 
|         return style; | 
|   | 
|     } | 
|   | 
|     /* | 
|      * 列数据信息单元格样式 | 
|      */ | 
|     private HSSFCellStyle getStyle(HSSFWorkbook workbook) { | 
|         // 设置字体 | 
|         HSSFFont font = workbook.createFont(); | 
|         //设置字体大小 | 
|         //font.setFontHeightInPoints((short)10); | 
|         //字体加粗 | 
|         //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); | 
|         //设置字体名字 | 
|         font.setFontName("Courier New"); | 
|         //设置样式; | 
|         HSSFCellStyle style = workbook.createCellStyle(); | 
|         //设置底边框; | 
|         style.setBorderBottom(BorderStyle.THIN); | 
|         //设置底边框颜色; | 
|         style.setBottomBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置左边框; | 
|         style.setBorderLeft(BorderStyle.THIN); | 
|         //设置左边框颜色; | 
|         style.setLeftBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置右边框; | 
|         style.setBorderRight(BorderStyle.THIN); | 
|         //设置右边框颜色; | 
|         style.setRightBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //设置顶边框; | 
|         style.setBorderTop(BorderStyle.THIN); | 
|         //设置顶边框颜色; | 
|         style.setTopBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); | 
|         //在样式用应用设置的字体; | 
|         style.setFont(font); | 
|         //设置自动换行; | 
|         style.setWrapText(true); | 
|         //设置水平对齐的样式为居中对齐; | 
|         style.setAlignment(HorizontalAlignment.CENTER); | 
|         //设置垂直对齐的样式为居中对齐; | 
|         style.setVerticalAlignment(VerticalAlignment.CENTER); | 
|   | 
|         return style; | 
|   | 
|     } | 
| } |