感謝我同事分享的工具類 我覺得比較好用就分享出來= =

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