ApachePOI 動態列表生成excel
先創建導出Excel的工具類,并帶泛型,實體一定要生成屬性的get方法,就是普通的Javabean,后面的就是個人發揮了,廢話不多說,直接上代碼:
public class ExportExcel<T> {public void exportExcel(Collection<T> dataset, OutputStream out) { exportExcel("數據導出", null, dataset, out, "yyyy-MM-dd hh:MM:ss"); } public void exportExcel(String[] headers, Collection<T> dataset, OutputStream out) { exportExcel("數據導出", headers, dataset, out, "yyyy-MM-dd hh:MM:ss"); } public void exportExcel(String[] headers, Collection<T> dataset, OutputStream out, String pattern) { exportExcel("數據導出", headers, dataset, out, pattern); } public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) { // 聲明一個工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一個表格 HSSFSheet sheet = workbook.createSheet(title); // 設置表格默認列寬度為30個字節 sheet.setDefaultColumnWidth(30); // 生成一個樣式 HSSFCellStyle style = workbook.createCellStyle(); // 設置這些樣式 style.setFillForegroundColor(HSSFColor.WHITE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 標題字體 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.BLACK.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 把字體應用到當前的樣式 style.setFont(font); // 生成并設置另一個樣式 HSSFCellStyle style2 = workbook.createCellStyle(); style2.setFillForegroundColor(HSSFColor.WHITE.index); style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); style2.setBorderRight(HSSFCellStyle.BORDER_THIN); style2.setBorderTop(HSSFCellStyle.BORDER_THIN); style2.setAlignment(HSSFCellStyle.ALIGN_CENTER); style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 內容字體 HSSFFont font2 = workbook.createFont(); font2.setColor(HSSFColor.BLACK.index); font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); // 把字體應用到當前的樣式 style2.setFont(font2); // 聲明一個畫圖的頂級管理器 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // 定義注釋的大小和位置,詳見文檔 HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5)); // 設置注釋內容 comment.setString(new HSSFRichTextString("注釋!")); // 設置注釋作者,當鼠標移動到單元格上是可以在狀態欄中看到該內容. comment.setAuthor("yuyidi"); //產生表格標題行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text); } //遍歷集合數據,產生數據行 Iterator<T> it = dataset.iterator(); int index = 0; while (it.hasNext()) { index++; row = sheet.createRow(index); T t = (T) it.next(); //利用反射,根據javabean屬性的先后順序,動態調用getXxx()方法得到屬性值 Field[] fields = t.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style2); Field field = fields[i]; String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try { Class tCls = t.getClass(); Method getMethod = tCls.getMethod(getMethodName, new Class[] {}); Object value = getMethod.invoke(t, new Object[] {}); //判斷值的類型后進行強制類型轉換 String textValue = null; if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat(pattern); textValue = sdf.format(date); }else if (value instanceof Double) { textValue = formatter.format(value); } else if (value instanceof byte[]) { // 有圖片時,設置行高為60px; row.setHeightInPoints(60); // 設置圖片所在列寬度為80px,注意這里單位的一個換算 sheet.setColumnWidth(i, (short) (35.7 * 80)); // sheet.autoSizeColumn(i); byte[] bsValue = (byte[]) value; HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index); anchor.setAnchorType(2); patriarch.createPicture(anchor, workbook.addPicture( bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG)); } else{ //其它數據類型都當作字符串簡單處理 textValue = objToString(value); } //如果不是圖片數據,就利用正則表達式判斷textValue是否全部由數字組成 if(textValue!=null){ Pattern p = Pattern.compile("^//d+(//.//d+)?$"); Matcher matcher = p.matcher(textValue); if(matcher.matches()){ //是數字當作double處理 cell.setCellValue(Double.parseDouble(textValue)); }else{ HSSFRichTextString richString = new HSSFRichTextString(textValue); cell.setCellValue(richString); } } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } finally { //清理資源 } } } try { workbook.write(out); } catch (IOException e) { e.printStackTrace(); } } private String objToString(Object obj){ return (obj == null) ? "" : obj.toString(); }
}</pre>
本文由用戶 xg48 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!