感谢我同事分享的工具类 我觉得比较好用就分享出来= =

1 package com.tianyan.school.utils; 2 3 import org.apache.poi.hssf.usermodel.*; 4 import org.apache.poi.ss.usermodel.Cell; 5 import org.apache.poi.ss.util.CellRangeAddress; 6 import org.apache.poi.xssf.usermodel.*; 7 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.validation.constraints.NotNull; 11 import javax.validation.constraints.Null; 12 import java.io.*; 13 import java.net.URLEncoder; 14 import java.util.ArrayList; 15 import java.util.List; 16 import java.util.Map; 17 import java.util.Set; 18 import java.util.regex.Matcher; 19 import java.util.regex.Pattern; 20 21 /** 22 * 单表头 多表头 多sheet页导出 23 * 24 * @author qhp 25 */ 26 public class ExcelUtil { 27 28 29 /** 30 * 用于正则表达式判断private static修饰可以更快匹配 31 */ 32 private static Pattern pattern = Pattern.compile("-?[0-9]*\\.?[0-9]+"); 33 34 /** 35 * 导出Excel 36 * 37 * @param sheetName sheet名称 38 * @param title 标题 39 * @param values 内容 40 * @param wb HSSFWorkbook对象 41 * @return 42 */ 43 public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { 44 45 // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 46 if (wb == null) { 47 wb = new HSSFWorkbook(); 48 } 49 // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet 50 HSSFSheet sheet = wb.createSheet(sheetName); 51 for (int i = 0; i < 32; i++) { 52 sheet.setColumnWidth(i, 256 * 20 + 184); 53 } 54 // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 55 HSSFRow row = sheet.createRow(0); 56 // 第四步,创建单元格,并设置值表头 设置表头居中 57 HSSFCellStyle style = wb.createCellStyle(); 58 // 创建一个居中格式 59 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 60 HSSFFont font = wb.createFont(); 61 font.setFontName("黑体"); 62 //设置字体大小 63 font.setFontHeightInPoints((short) 14); 64 style.setFont(font); 65 //声明列对象 66 HSSFCell cell = null; 67 //创建标题 68 for (int i = 0; i < title.length; i++) { 69 cell = row.createCell(i); 70 cell.setCellValue(title[i]); 71 cell.setCellStyle(style); 72 } 73 //创建内容 74 for (int i = 0; i < values.length; i++) { 75 row = sheet.createRow(i + 1); 76 for (int j = 0; j < values[i].length; j++) { 77 //将内容按顺序赋给对应的列对象 78 cell = row.createCell(j); 79 if (values[i][j] == null || "".equals(values[i][j])) { 80 continue; 81 } else { 82 cell.setCellValue(values[i][j]); 83 } 84 } 85 } 86 return wb; 87 } 88 89 90 91 92 93 /** 94 * 导出Excel 95 * 96 * @param sheetName sheet名称 97 * @param title 标题1 98 * @param values 内容 99 * @param wb HSSFWorkbook对象 100 * @param title1 标题2 101 * @param headnum0 标题1位置 102 * @param headnum1 标题2位置 103 * @return 两行列名 104 */ 105 public static HSSFWorkbook getHSSFWorkbookTwo(String sheetName, String[] title, String[] title1, String[] headnum0, String[] headnum1, String[][] values, HSSFWorkbook wb) { 106 // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 107 if (wb == null) { 108 wb = new HSSFWorkbook(); 109 HSSFCellStyle cellStyle = wb.createCellStyle(); 110 // 设置背景色 111 cellStyle.setFillForegroundColor((short) 13); 112 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 113 //下边框 114 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); 115 //左边框 116 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); 117 //上边框 118 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); 119 //右边框 120 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); 121 } 122 // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet 123 HSSFSheet sheet = wb.createSheet(sheetName); 124 for (int i = 0; i < 32; i++) { 125 sheet.setColumnWidth(i, 256 * 20 + 184); 126 } 127 // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 128 HSSFRow row = sheet.createRow(0); 129 // 第四步,创建单元格,并设置值表头 设置表头居中 130 HSSFCellStyle style = wb.createCellStyle(); 131 // 创建一个居中格式 132 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 133 HSSFFont font = wb.createFont(); 134 font.setFontName("黑体"); 135 //设置字体大小 136 font.setFontHeightInPoints((short) 14); 137 //粗体显示 138 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 139 style.setFont(font); 140 //声明列对象 141 HSSFCell cell = null; 142 //创建标题 143 for (int i = 0; i < title.length; i++) { 144 cell = row.createCell(i); 145 cell.setCellValue(title[i]); 146 cell.setCellStyle(style); 147 } 148 for (int i = 0; i < headnum0.length; i++) { 149 String[] temp = headnum0[i].split(","); 150 Integer startrow = Integer.parseInt(temp[0]); 151 Integer overrow = Integer.parseInt(temp[1]); 152 Integer startcol = Integer.parseInt(temp[2]); 153 Integer overcol = Integer.parseInt(temp[3]); 154 sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, 155 startcol, overcol)); 156 } 157 row = sheet.createRow(1); 158 for (int i = 0; i < title1.length; i++) { 159 cell = row.createCell(i); 160 cell.setCellValue(title1[i]); 161 cell.setCellStyle(style); 162 } 163 //动态合并单元格 164 for (int i = 0; i < headnum1.length; i++) { 165 String[] temp = headnum1[i].split(","); 166 Integer startrow = Integer.parseInt(temp[0]); 167 Integer overrow = Integer.parseInt(temp[1]); 168 Integer startcol = Integer.parseInt(temp[2]); 169 Integer overcol = Integer.parseInt(temp[3]); 170 sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, 171 startcol, overcol)); 172 } 173 for (int i = 0; i < values.length; i++) { 174 row = sheet.createRow(i + 2); 175 for (int j = 0; j < values[i].length; j++) { 176 //将内容按顺序赋给对应的列对象 177 cell = row.createCell(j); 178 if (values[i][j] == null || "".equals(values[i][j])) { 179 continue; 180 } else { 181 cell.setCellValue(values[i][j]); 182 } 183 } 184 } 185 return wb; 186 } 187 188 public static void setResponseHeader(HttpServletRequest request, HttpServletResponse response, String fileName) { 189 try { 190 final String userAgent = request.getHeader("USER-AGENT").toLowerCase(); 191 response.reset(); 192 response.setCharacterEncoding("UTF-8"); 193 if (userAgent.contains("MSIE")) { 194 //IE浏览器 195 fileName = URLEncoder.encode(fileName, "UTF-8"); 196 } else if (userAgent.contains("MOZILLA") || userAgent.contains("FIREFOX")) { 197 fileName = new String(fileName.getBytes(), "ISO8859-1"); 198 } else if (userAgent.contains("EDGE")) { 199 fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", " "); 200 } else { 201 //其他浏览器 202 fileName = URLEncoder.encode(fileName, "UTF-8"); 203 } 204 response.setContentType("application/octet-stream;charset=ISO8859-1"); 205 response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); 206 response.addHeader("Pargam", "no-cache"); 207 response.addHeader("Cache-Control", "no-cache"); 208 } catch (Exception ex) { 209 ex.printStackTrace(); 210 } 211 } 212 213 public static boolean isNumeric(String str) { 214 Matcher isNum = pattern.matcher(str); 215 if (!isNum.matches()) { 216 return false; 217 } 218 return true; 219 } 220 221 /** 222 * @param list 223 * @param sheet 224 * @Time 2018-11-13 225 */ 226 public static void multipleExcel(@NotNull List<Map<String, Object>> list, XSSFSheet sheet) { 227 List<Object[]> dataList = new ArrayList<Object[]>(); 228 // 取下标为0得元素 229 if (list == null || list.size() <= 0) { 230 return; 231 } 232 Map s = list.get(0); 233 // 动态获取表头 234 Set<String> set = s.keySet(); 235 List<String> rowName = new ArrayList<>(set); 236 // 循环所有数据 237 for (int i = 0; i < list.size(); i++) { 238 Map h = list.get(i); 239 // 创建一个数组 240 Object[] a = new Object[rowName.size()]; 241 // 根据表头获取值 242 for (int j = 0; j < set.size(); j++) { 243 a[j] = h.get(rowName.get(j)); 244 } 245 // 存入集合中 246 dataList.add(a); 247 } 248 249 // 定义所需列数 250 int columnNum = rowName.size(); 251 XSSFRow rowRowName = sheet.createRow(0); 252 253 // 将列头设置到sheet的单元格中 254 for (int n = 0; n < columnNum; n++) { 255 // 创建列头对应个数的单元格 256 XSSFCell cellRowName = rowRowName.createCell(n); 257 // 设置列头单元格的数据类型 258 cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); 259 // 设置列头单元格的值 260 XSSFRichTextString text = new XSSFRichTextString(rowName.get(n)); 261 cellRowName.setCellValue(text); 262 } 263 // 将查询出的数据设置到sheet对应的单元格中 264 for (int i = 0; i < dataList.size(); i++) { 265 // 遍历每个对象 266 Object[] obj = dataList.get(i); 267 // 创建所需的行数 268 XSSFRow row = sheet.createRow(i + 1); 269 for (int j = 0; j < obj.length; j++) { 270 // 设置单元格的数据类型 271 XSSFCell cell = null; 272 cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); 273 if (!"".equals(obj[j]) && obj[j] != null) { 274 // 设置单元格的值 275 cell.setCellValue(obj[j].toString()); 276 277 } 278 } 279 } 280 } 281 282 283 /** 284 * 将临时文件下载到本地并删除临时文件 285 * 286 * @param tempFile 文件路径 287 * @param workbook 工作表 288 * @param fileName 文件名 289 * @param response 290 */ 291 public static void fileExcel(File tempFile, XSSFWorkbook workbook, String fileName, HttpServletResponse response) { 292 293 FileOutputStream out = null; 294 FileInputStream in = null; 295 OutputStream out1 = null; 296 try { 297 out = new FileOutputStream(tempFile); 298 workbook.write(out); 299 out1 = response.getOutputStream(); 300 byte[] b = new byte[1024]; 301 response.setCharacterEncoding("utf-8"); 302 fileName = URLEncoder.encode(fileName, "UTF-8"); 303 response.setHeader("content-disposition", "attachment; filename=" + fileName); 304 in = new FileInputStream(tempFile); 305 int n; 306 while ((n = in.read(b)) != -1) { 307 out1.write(b, 0, n); 308 } 309 310 } catch (Exception e) { 311 e.printStackTrace(); 312 } finally { 313 if (in != null) { 314 try { 315 in.close(); 316 } catch (IOException e) { 317 e.printStackTrace(); 318 } 319 } 320 if (out != null) { 321 try { 322 out.close(); 323 } catch (IOException e) { 324 325 e.printStackTrace(); 326 } 327 } 328 if (out1 != null) { 329 try { 330 out1.close(); 331 } catch (IOException e) { 332 e.printStackTrace(); 333 } 334 } 335 if (tempFile.exists()) { 336 tempFile.delete(); 337 } 338 } 339 340 } 341 342 public static List<List<String>> readXls(String path) throws Exception { 343 InputStream is = new FileInputStream(path); 344 // HSSFWorkbook 标识整个excel 345 XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is); 346 List<List<String>> result = new ArrayList<List<String>>(); 347 int size = hssfWorkbook.getNumberOfSheets(); 348 // 循环每一页,并处理当前循环页 349 for (int numSheet = 0; numSheet < size; numSheet++) { 350 // HSSFSheet 标识某一页 351 XSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet); 352 if (hssfSheet == null) { 353 continue; 354 } 355 // 处理当前页,循环读取每一行 356 for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) { 357 // HSSFRow表示行 358 XSSFRow hssfRow = hssfSheet.getRow(rowNum); 359 int minColIx = hssfRow.getFirstCellNum(); 360 int maxColIx = hssfRow.getLastCellNum(); 361 List<String> rowList = new ArrayList<String>(); 362 // 遍历改行,获取处理每个cell元素 363 for (int colIx = minColIx; colIx < maxColIx; colIx++) { 364 // HSSFCell 表示单元格 365 XSSFCell cell = hssfRow.getCell(colIx); 366 if (cell == null) { 367 continue; 368 } 369 rowList.add(getStringVal(cell)); 370 } 371 result.add(rowList); 372 } 373 } 374 return result; 375 } 376 377 public static String getStringVal(XSSFCell cell) { 378 switch (cell.getCellType()) { 379 case Cell.CELL_TYPE_BOOLEAN: 380 return cell.getBooleanCellValue() ? "TRUE" : "FALSE"; 381 case Cell.CELL_TYPE_FORMULA: 382 return cell.getCellFormula(); 383 case Cell.CELL_TYPE_NUMERIC: 384 cell.setCellType(Cell.CELL_TYPE_STRING); 385 return cell.getStringCellValue(); 386 case Cell.CELL_TYPE_STRING: 387 return cell.getStringCellValue(); 388 default: 389 return ""; 390 } 391 } 392 }
public void exportBigItem(HttpServletRequest request, HttpServletResponse response) { try { TreeMap<String, Object> map = RequestUtils.getParameterMapObject(request); String shour = ""; List<BigItem> list = new ArrayList<>(); //天级 if (Constant.Selector.DAY.equals(map.get("timeType"))) { Date dateD = new SimpleDateFormat("yyyy-MM-dd").parse(shour); shour = new SimpleDateFormat("yyyyMMdd").format(dateD); map.put("shour", shour); list = rptVolteOverviewDMapper.excelBigItem(map); } else { Date dateH = new SimpleDateFormat("yyyy-MM-dd HH").parse(shour); shour = new SimpleDateFormat("yyyyMMddHH").format(dateH); map.put("shour", shour); list = rptVolteOverviewHMapper.excelBigItem(map); //查询语句 按小时来 } //判断小区还是切片 String type = ""; String dataType = request.getParameter("dataType"); if (Constant.Selector.CI.equals(dataType)) { type = "XX"; } else { type = "XX"; } //excel标题 String[] title = {"XX", "XX" + type + "数", "XX", "XX", "XX", "XX", "XX", "XX", //表头 手写 与下面的一一对应 "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "XXX", "X", "X" }; //excel文件名 String fileName = "xxx报表" + shour + ".xls"; //sheet名 String sheetName = "xxx报表"; String[][] content = new String[list.size()][17]; for (int i = 0; i < list.size(); i++) { BigItem bigItem = list.get(i); //创建一个实体 每一个i就代表一行 content[i][0] = bigItem.getScity(); content[i][1] = bigItem.getLowQuality(); content[i][2] = bigItem.getFault(); content[i][3] = bigItem.getCover(); content[i][4] = bigItem.getInterference(); content[i][5] = bigItem.getCapacity(); content[i][6] = bigItem.getParameter(); content[i][7] = bigItem.getOthers(); content[i][8] = bigItem.getCoreNetwork(); content[i][9] = bigItem.getUlLostPacketRate(); content[i][10] = bigItem.getDlLostPacketRate(); content[i][11] = bigItem.getVolteDropRate(); content[i][12] = bigItem.getEsrvccSuccessRate(); content[i][13] = bigItem.getVolteSuccessRate(); content[i][14] = bigItem.getFrrcSucConEstrRate(); content[i][15] = bigItem.getFerabSucEstRate(); content[i][16] = bigItem.getFwlsSucCallRate(); } //创建HSSFWorkbook HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null); //响应到客户端 ExcelUtil.setResponseHeader(request, response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); } catch (Exception e) { log.error("导出异常!" + e.getMessage()); } }