您好,登錄后才能下訂單哦!
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpSession;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.cddgg.lianyoulw.utils.Arith;
/**
?* 導出Excel表
?*??
?* @author wangbowen
?*?
?* @param <T>應用泛型,代表任意一個符合javabean風格的類
?*/
public class ExportExcel<T> {
? ? /**
? ? ?* 導出excel
? ? ?* @param footTitle 腳標題
? ? ?* @param dataset 控制數據
? ? ?* @param out 輸出流
? ? ?*? @param session 會話
? ? ?*/
? ? public void exportExcel(String footTitle,Collection<T> dataset, OutputStream out,HttpSession session) {
? ? ? ? export(footTitle, null, dataset, out, "yyyy-MM-dd",session);
? ? }
? ? /**
? ? ?* 導出excel
? ? ?* @param footTitle 腳標題
? ? ?* @param headers 表頭
? ? ?* @param dataset 控制數據
? ? ?* @param out 輸出流
? ? ?* @param session 會話
? ? ?*/
? ? public void exportExcel(String footTitle, String[] headers, Collection<T> dataset,
? ? ? ? ? ? OutputStream out,HttpSession session) {
? ? ? ? export(footTitle, headers, dataset, out, "yyyy-MM-dd",session);
? ? }
? ? /**
? ? ?* 導出excel
? ? ?* @param footTitle 腳標題
? ? ?* @param headers? 表頭
? ? ?* @param dataset 控制數據
? ? ?* @param out 輸出流
? ? ?* @param pattern 驗證
? ? ?*? @param session 會話
? ? ?*/
? ? public void exportExcel(String footTitle,String[] headers, Collection<T> dataset,
? ? ? ? ? ? OutputStream out, String pattern,HttpSession session) {
? ? ? ? export(footTitle,headers, dataset, out, pattern,session);
? ? }
? ? /**
? ? ?* 通用的方法,利用了JAVA的反射機制,可以將放置在JAVA集合中并且符號一定條件的數據以EXCEL 的形式輸出到指定IO設備上
? ? ?*?
? ? ?* @param title
? ? ?*? ? ? ? ? ? 表格標題
? ? ?* @param headers
? ? ?*? ? ? ? ? ? 表格屬性列名數組
? ? ?* @param dataset
? ? ?*? ? ? ? ? ? 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的
? ? ?*? ? ? ? ? ? javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)
? ? ?* @param out
? ? ?*? ? ? ? ? ? 輸出設備關聯的流對象,可以將EXCEL文檔導出到本地文件或者網絡中
? ? ?* @param pattern
? ? ?*? ? ? ? ? ? 如果有時間數據,設定輸出格式。默認為"yyy-MM-dd"
? ? ?*? @param session 會話
? ? ?*/
? ? public void export(String title, String[] headers,
? ? ? ? ? ? Collection<T> dataset, OutputStream out, String pattern, HttpSession session) {
? ? ? ? //申明一個工作簿
? ? ? ? XSSFWorkbook book = new XSSFWorkbook();
? ? ? ? //創(chuàng)建一個表
? ? ? ? XSSFSheet sheet = book.createSheet();
? ? ? ? // 設置表格默認列寬度為30個字節(jié)
? ? ? ? sheet.setDefaultColumnWidth(25);
? ? ? ? // 聲明一個畫圖的頂級管理器
? ? ? ? XSSFDrawing patriarch = sheet.createDrawingPatriarch();
? ? ? ? book.setSheetName(0, title); // 設置第一個sheet的名稱
? ? ? ? XSSFRow row = sheet.createRow((short) 0);
? ? ? ? XSSFFont font = book.createFont();
? ? ? ? // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
? ? ? ? font.setFontHeightInPoints((short) 9); // 設置字體大小
? ? ? ? font.setFontName("微軟雅黑");
? ? ? ? XSSFCellStyle style = book.createCellStyle();
? ? ? ? style.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 中對齊
? ? ? ? style.setFont(font);
? ? ? ? style.setBorderTop(XSSFCellStyle.BORDER_THIN);
? ? ? ? style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
? ? ? ? style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
? ? ? ? style.setBorderRight(XSSFCellStyle.BORDER_THIN);
? ? ? ? style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
? ? ? ? style.setFillPattern(CellStyle.SOLID_FOREGROUND);
? ? ? ? XSSFCellStyle style2 = book.createCellStyle();
? ? ? ? style2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 中對齊
? ? ? ? style2.setBorderTop(XSSFCellStyle.BORDER_THIN);
? ? ? ? style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
? ? ? ? style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
? ? ? ? style2.setBorderRight(XSSFCellStyle.BORDER_THIN);
? ? ? ? style2.setFont(font);
? ? ? ? for (short i = 0; i < headers.length; i++) {
? ? ? ? ? ? XSSFCell cell = row.createCell(i);
? ? ? ? ? ? cell.setCellStyle(style);
? ? ? ? ? ? XSSFRichTextString text = new XSSFRichTextString(headers[i]);
? ? ? ? ? ? cell.setCellValue(text);
? ? ? ? }
? ? ? ? // 循環(huán)數據
? ? ? ? Iterator<T> it = dataset.iterator();
? ? ? ? int index = 0;
? ? ? ? while (it.hasNext()) {
? ? ? ? ? ? index++;
? ? ? ? ? ? row = sheet.createRow(index);
? ? ? ? ? ? T t = (T) it.next();
? ? ? ? ? ? // 利用反射,根據javabean屬性的先后順序,動態(tài)調用getXxx()方法得到屬性值
? ? ? ? ? ? Field[] fields = t.getClass().getDeclaredFields();
? ? ? ? ? ? for (int i = 0; i < fields.length; i++) {
? ? ? ? ? ? ? ? XSSFCell cell = row.createCell(i);
? ? ? ? ? ? ? ? cell.setCellStyle(style2);
? ? ? ? ? ? ? ? Field field = fields[i];
? ? ? ? ? ? ? ? String fieldName = field.getName();
? ? ? ? ? ? ? ? //如果fieldName是idCard就進入if里面
? ? ? ? ? ? ? ? if(fieldName.equals("idCard")){
? ? ? ? ? ? ? ? fieldName = fieldName.equals("idCard")?"IDCard":fieldName;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? String getMethodName = "get"
? ? ? ? ? ? ? ? ? ? ? ? + fieldName.substring(0, 1).toUpperCase()
? ? ? ? ? ? ? ? ? ? ? ? + fieldName.substring(1);
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Class<? extends Object> tCls = t.getClass();
? ? ? ? ? ? ? ? ? ? Method getMethod = tCls.getMethod(getMethodName,
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Class[] {});
? ? ? ? ? ? ? ? ? ? Object value = getMethod.invoke(t, new Object[] {});
? ? ? ? ? ? ? ? ? ? // 判斷值的類型后進行強制類型轉換
? ? ? ? ? ? ? ? ? ? String textValue = null;
? ? ? ? ? ? ? ? ? ? if (value instanceof Boolean) {
? ? ? ? ? ? ? ? ? ? ? ? boolean bValue = (Boolean) value;
? ? ? ? ? ? ? ? ? ? ? ? textValue = "男";
? ? ? ? ? ? ? ? ? ? ? ? if (!bValue) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? textValue = "女";
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? } else if (value instanceof Date) {
? ? ? ? ? ? ? ? ? ? ? ? Date date = (Date) value;
? ? ? ? ? ? ? ? ? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat(pattern);
? ? ? ? ? ? ? ? ? ? ? ? textValue = sdf.format(date);
? ? ? ? ? ? ? ? ? ? }else if(value instanceof Double){
? ? ? ? ? ? ? ? ? ? ? ? double value1 = Double.parseDouble(value.toString());
? ? ? ? ? ? ? ? ? ? ? ? textValue = Arith.doubleTransform(value1);
? ? ? ? ? ? ? ? ? ? }else if (value instanceof byte[]) {
? ? ? ? ? ? ? ? ? ? ? ? // 有圖片時,設置行高為60px;
? ? ? ? ? ? ? ? ? ? ? ? row.setHeightInPoints(60);
? ? ? ? ? ? ? ? ? ? ? ? // 設置圖片所在列寬度為80px,注意這里單位的一個換算
? ? ? ? ? ? ? ? ? ? ? ? sheet.setColumnWidth(i, (short) (35.7 * 80));
? ? ? ? ? ? ? ? ? ? ? ? byte[] bsValue = (byte[]) value;
? ? ? ? ? ? ? ? ? ? ? ? XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1023, 255, (short) 6, index, (short) 6, index);
? ? ? ? ? ? ? ? ? ? ? ? anchor.setAnchorType(2);
? ? ? ? ? ? ? ? ? ? ? ? patriarch.createPicture(anchor, book.addPicture(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bsValue, XSSFWorkbook.PICTURE_TYPE_JPEG));
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? //判斷value是否為空
? ? ? ? ? ? ? ? ? ? ? ? if(value != null){
? ? ? ? ? ? ? ? ? ? ? ? // 其它數據類型都當作字符串簡單處理
? ? ? ? ? ? ? ? ? ? ? ? textValue = value.toString();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? // 如果不是圖片數據,就利用正則表達式判斷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 {
? ? ? ? ? ? ? ? ? ? ? ? ? ?XSSFRichTextString richString = new XSSFRichTextString(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? textValue);
? ? ? ? ? ? ? ? ? ? ? ? ? ? richString.applyFont(font);
? ? ? ? ? ? ? ? ? ? ? ? ? ? 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 {
? ? ? ? ? ? book.write(out);
? ? ? ? ? ? out.flush();
? ? ? ? ? ? out.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ??
}
使用方法:
?ExportExcel<ContractVO> ex = new ExportExcel<ContractVO>();
? ? ? ? // 設置列表名
? ? ? ? String[] headers = { "序號", "員工姓名", "性別","合同類型",? "×××號碼", "派遣單位",
? ? ? ? ? ? ? ? "派遣時間", "合同開始時間", "合同結束時間","合同期限","合同狀態(tài)","合同名稱" };
? ? ? ?//查詢導出列表名的值
? ? ? ? List<ContractVO> dataset = contractExpireDmn.getContractMessage();
? ? ? ? response.reset();
? ? ? ? // 設置生成的文件類型
? ? ? ? response.setContentType("application/vnd.ms-excel");
? ? ? //設置文件頭
? ? ? ? response.setHeader("Content-disposition","attachment;filename=" +new String(("單位合同預警信息").getBytes("gbk"), "iso8859-1")
? ? ? ? + ".xlsx");
? ? ? ? OutputStream os = response.getOutputStream();
? ? ? ? // 把數據傳入到導出Excel的方法里面
? ? ? ? ex.exportExcel("單位員工合同Excel文檔",headers, dataset, os,session);
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。